मैं SQL सर्वर डेटाबेस फ़ाइलों को कैसे स्थानांतरित करूं?


103

मेरे पास एक डेटाबेस है .mdfऔर .ldfफ़ाइलों को किसी अन्य स्थान पर ले जाना चाहते हैं । लेकिन मैं MSSQLSERVERसेवा को रोकना नहीं चाहता , और मैं किसी अन्य सर्वर को निर्यात नहीं करना चाहता।

मैं यह कैसे कर सकता हूँ?

जवाबों:


154

डेटाबेस फ़ाइलों को स्थानांतरित करने के लिए आपको SQL सर्वर सेवा को रोकने की आवश्यकता नहीं है, लेकिन आपको विशिष्ट डेटाबेस को ऑफ़लाइन लेना होगा। ऐसा इसलिए है क्योंकि आप फ़ाइलों को स्थानांतरित नहीं कर सकते हैं, जबकि वे एक्सेस किए जा रहे हैं और डेटाबेस को ऑफ़लाइन लेने से फ़ाइलों को SQL सर्वर एप्लिकेशन द्वारा उपयोग किए जाने से रोकता है।

उन्हें स्थानांतरित करने की प्रक्रिया काफी सरल है। डिटैच / अटैच पहले से ही वर्णित था, लेकिन यह लगभग इस जटिल नहीं है।

ALTER DATABASEकमांड के साथ फ़ाइल स्थान बदलें :

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location

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

डेटाबेस को ऑफ़लाइन सेट करें

(मैं WITH ROLLBACK IMMEDIATEसभी को बाहर निकालने और सभी वर्तमान में खुले लेनदेन को रोलबैक करने के लिए उपयोग करता हूं )

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

फ़ाइलों को नए स्थान पर ले जाएं / कॉपी करें

अपने पसंदीदा तरीके का उपयोग करके फ़ाइलों को कॉपी करें (क्लिक करें n खींचें, XCopy, Copy-Item, Robocopy)

डेटाबेस ऑनलाइन लाओ

ALTER DATABASE foo SET ONLINE;

आप इसे और अधिक विस्तार से यहाँ देख सकते हैं ।


13
इसने मेरे लिए काम किया। मेरे मामले में मुझे पहले आदेश का उपयोग करते हुए LDF फ़ाइल को भी स्थानांतरित करना पड़ा: उदाहरण के लिए USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location
डेवी रीस

1
फ़ाइलों को डायलॉग में देखने के लिए फ़ाइल नाम को अपडेट करके केवल पूर्ण पाठ अनुक्रमणिका फ़ाइलों को स्थानांतरित करने के लिए भी उपयोग किया जा सकता है।
DShook

24
डेटाबेस फ़ाइल (एस) को स्थानांतरित करने के बाद सुनिश्चित करें, कि "NT SERVICE \ MSSQLSERVER" उपयोगकर्ता के पास इसकी अनुमति है, या डेटाबेस को ऑनलाइन लाने की कोशिश करते समय आपको त्रुटियां मिलेंगी।
डेमोनसेले 335

"नाम" क्या माना जाता है? प्रलेखन में यह "तार्किक_नाम" है। उनका क्या मतलब है?
जॉनी

2
@mlhev वास्तव में मेरे मामले में MODIFY FILEआदेश परिवर्तनशील है। यदि आप पहले MODIFY FILE चलाते हैं, तो यह आपको बताएगा कि कमांड सफलतापूर्वक चलती है और ऑफ़लाइन-ऑनलाइन ऑपरेशन के बाद स्थान बदल जाएगा (शब्दांकन अलग है लेकिन आपको विचार मिलता है)। ऑफ़लाइन-> फ़ाइलें स्थानांतरित करें-> ऑनलाइन आदेश स्पष्ट कारण के लिए, हालांकि, मायने रखता है। इसके अलावा Demonslay335 के नोट को चिह्नित करें। फाइल की अनुमति जरूरी है।
लियोनेट चेन

50

Mdf और LDF फाइलें संरक्षित हैं और डेटाबेस ऑनलाइन होने के दौरान इसे स्थानांतरित नहीं किया जा सकता है।

यदि आप डेटाबेस को काम करने से नहीं रोकते हैं, तो आप DETACHइसे कर सकते हैं, फाइलों को स्थानांतरित कर सकते हैं और फिर ATTACHइसे।

  • डेटाबेस के नाम पर राइट क्लिक करें
  • चुनते हैं Properties
  • Filesटैब पर जाएं
  • लिख कर रख लें Pathऔर FileNameMDF और एलडीएफ फ़ाइलों की । यह चरण उस स्थिति में महत्वपूर्ण है जब आप लापता फ़ाइलों की खोज समाप्त नहीं करना चाहते हैं ...
  • डेटाबेस के नाम पर राइट क्लिक करें
  • चुनते हैं Tasks -> Detach
  • अपनी इच्छानुसार फ़ाइलें स्थानांतरित करें
  • Databasesअपने सर्वर के नोड पर राइट क्लिक करें
  • चुनते हैं Attach
  • Addबटन पर क्लिक करें
  • नए स्थान पर इंगित करें
  • क्लिक करें OK

आपको अब ठीक होना चाहिए। के बारे में जानकारी DETACH- ATTACHप्रक्रिया यहाँ पाया जा सकता है

के बारे में लिंक में DETACH- SQL सर्वर के एक ही उदाहरण पर डेटाबेस को रखते हुए कथन ATTACHका उपयोग करने का एक पुनर्संयोजन है ALTER DATABASEमूव यूजर डेटाबेस में अधिक संदर्भ ।

यदि आप चलते समय इसे चालू रखना चाहते हैं, तो a BACKUP- करें RESTORE। पुनर्स्थापना प्रक्रिया में आप डेटाबेस फ़ाइलों के नए स्थान को परिभाषित कर सकते हैं।


3
जब मैं फ़ाइल एक्सेस के मुद्दों से बचने के लिए व्यवस्थापक के रूप में SQL प्रबंधन स्टूडियो खोलने की सलाह देता हूं
साइमन_वेवर

6

सिस्टम डेटाबेस फ़ाइलों को स्थानांतरित करने के लिए इन चरणों का पालन करें:

  1. SSMS में sa उपयोगकर्ता के रूप में लॉग इन करें

  2. सुरक्षा के लिए उपयोगकर्ता द्वारा बनाए गए डेटाबेस का बैकअप लें।

  3. SSMS से सर्वर से जुड़े सभी सत्रों को मारें।

  4. सिस्टम डेटाबेस की वर्तमान फ़ाइल स्थान की जाँच करने के लिए निम्न आदेश निष्पादित करें:

    USE master;
    SELECT * FROM sys.master_files;

पथ को पहचानें और फ़ाइलों के वर्तमान पथ पर ध्यान दें।

  1. मास्टर को छोड़कर सभी डेटाबेस के लिए फ़ाइल पथ को बदलने के लिए TSQL का उपयोग करें:

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

उदाहरण के लिए:

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");

अब फ़ाइल का स्थान बदल दिया गया है।

Ldf और mdf दोनों फाइलों को स्थानांतरित करना सुनिश्चित करें

  1. SSMS में सर्वर पर राइट क्लिक करें और गुण चुनें। अंदर गुण डेटाबेस सेटिंग्स पर जाते हैं। डेटा के लिए डेटाबेस डिफ़ॉल्ट स्थानों को बदलें और गंतव्य पथ में प्रवेश करें। सर्वर से लॉग ऑफ करें।

    जैसे: C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\करने के लिए बदल जाते हैंE:\projects\DataBaseFiles\MSSQL\DATA\

  2. SQL सर्वर का उदाहरण रोकें।

  3. फ़ाइल या फ़ाइलों को नए स्थान पर कॉपी करें। गंतव्य फ़ोल्डर में एक्सीलेंस अनुमतियों की प्रतिलिपि बनाने के लिए फ़ाइलों को स्थानांतरित करने के लिए रोबोकॉपी का उपयोग करें। Cmd खोलें और व्यवस्थापक के रूप में चलाएं और निम्न कमांड का उपयोग करें:

    robocopy / sec sourceFolder डेस्टिनेशन

कमांड चलाने के लिए सोर्स लोकेशन पर जाना बेहतर है। सिस्टम डेटाबेस फ़ाइलों के अलावा अन्य फ़ाइलों को हटा दें जिन्हें कॉपी किया गया है। उदाहरण के लिए:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(यहां हम सभी सिस्टम डेटाबेस फ़ाइलों को नए स्थान पर ले जा रहे हैं।)

  1. प्रारंभ मेनू से, सभी प्रोग्राम को इंगित करें, Microsoft SQL सर्वर को इंगित करें, कॉन्फ़िगरेशन उपकरण को इंगित करें, और फिर SQL सर्वर कॉन्फ़िगरेशन प्रबंधक पर क्लिक करें।

SQL सर्वर कॉन्फ़िगरेशन प्रबंधक में follwing चरण निष्पादित करें:

SQL सर्वर सेवा नोड में, SQL सर्वर के उदाहरण पर राइट-क्लिक करें (उदाहरण के लिए, SQL सर्वर (MSSQLSERVER)) और गुण चुनें .. SQL सर्वर (उदाहरण_नाम) गुण संवाद बॉक्स में, स्टार्टअप पैरामीटर टैब पर क्लिक करें। मौजूदा पैरामीटर बॉक्स में, मास्टर डेटा फ़ाइल को स्थानांतरित करने के लिए –d पैरामीटर का चयन करें। परिवर्तन सहेजने के लिए अद्यतन पर क्लिक करें। स्टार्टअप पैरामीटर बॉक्स निर्दिष्ट करें, मास्टर डेटाबेस के नए पथ में पैरामीटर बदलें। मौजूदा पैरामीटर बॉक्स में, मास्टर लॉग फ़ाइल को स्थानांतरित करने के लिए –l पैरामीटर का चयन करें। परिवर्तन सहेजने के लिए अद्यतन पर क्लिक करें। स्टार्टअप पैरामीटर बॉक्स निर्दिष्ट करें, मास्टर डेटाबेस के नए पथ में पैरामीटर बदलें।

डेटा फ़ाइल के लिए पैरामीटर मान -d पैरामीटर का पालन करना चाहिए और लॉग फ़ाइल के लिए मान -l पैरामीटर का पालन करना चाहिए। निम्न उदाहरण मास्टर डेटा फ़ाइल के डिफ़ॉल्ट स्थान के लिए पैरामीटर मान दिखाता है।

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

यदि मास्टर डेटा फ़ाइल के लिए नियोजित स्थानांतरण E: \ SQLData है, तो पैरामीटर मान निम्नानुसार बदले जाएंगे:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

SQL सर्वर का इंस्टेंस नाम पर राइट-क्लिक करके और स्टॉप का चयन करके रोकें। SQL सर्वर का उदाहरण पुनरारंभ करें।

  1. saSSMS में उपयोगकर्ता के रूप में लॉग इन करें और निम्नलिखित क्वेरी को निष्पादित करके डेटाबेस फ़ाइलों के स्थान को सत्यापित करें:

    USE master;
    SELECT * FROM sys.master_files;

सब कुछ कर दिया।


आप सभी डेटाबेस के लिए कार्य को स्वचालित करने के लिए SQL फ़ंक्शन का उपयोग कर सकते हैं: stackoverflow.com/a/19505918/439524
amuliar

3

आप कदम से कदम:


  1. ROLLBACK IMMEDIATE के साथ DATABASE MyDB SET SINGLE_USER को सभी कनेक्शन बंद कर दें

  2. ऑफ़लाइन डेटाबेस के साथ डेटाबेस सेट करें
    MyDB सेट ऑफ़लाइन के आधार पर

  3. नए पथ पर
    जाएं MyDB MODIFY फ़ाइल (नाम = MyDB, फ़ाइल नाम = 'N: \ DATA \ MyDB.MDF')

  4. ऑनलाइन स्थिति के साथ डेटाबेस सेट करें और फिर
    MyDB सेट ऑनलाइन पर जाएं

  5. बहु-उपयोगकर्ता के
    परिवर्तन सेट करें MyDB सेट MULTI_USER


3

डेटाबेस डेटा फ़ाइलों को स्थानांतरित करने का एक तरीका है (निश्चित रूप से अभी तक अगर लॉगफ़ाइल्स के लिए ऐसा करने का कोई तरीका नहीं है) डेटाबेस को ऑफ़लाइन ले जाए बिना।

देजन नाकराडा-कोर्डिक के पास इस विधि के लिए एक स्पष्टीकरण + लिपियाँ हैं: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

संक्षिप्त संस्करण यह है कि आप नए स्थान पर एक और डेटाबेस फ़ाइल जोड़ते हैं, और फिर पुरानी फ़ाइल से डेटा को नई फ़ाइल में ले जाने के लिए विकल्प EMPTYFILE के साथ DBCC Shrinkfile का उपयोग करते हैं। जब यह हो जाता है तो आप पुरानी डेटा फ़ाइल को हटा सकते हैं।

मेरे समाधान नहीं, मैं स्वयं इस समाधान की तलाश में था और इसे हमारे उत्पादन पर्यावरण के लिए बहुत उपयोगी पाया।

Thorfinn


1

इन सरल 4 चरणों का पालन करें:

  1. SSMS खोलें और विंडो के ऊपर से नया क्वेरी विकल्प चुनें । उसके बाद डेटाबेस के पाथ के लिए निम्नलिखित क्वेरी को कॉपी और निष्पादित करें जिसे हम नए पथ पर ले जाना चाहते हैं और उस पथ को नोट करते हैं जो आप CurrentLocationकॉलम में दिखाते हैं ।

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. अब उस रास्ते पर जाएँ और Database_Name.mdf & Database_Name_log.ldf फ़ाइलों का नाम नोट करें। फिर डेटाबेस को विशिष्ट स्थान पर ले जाने के लिए दो क्वेरी का पालन करें।

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');

  1. अब, सर्वर को राइट क्लिक पर रोकें जिस पर Server_Nameआप ऑब्जेक्ट एक्सप्लोरर (लेफ्ट साइड) में देख सकते हैं।

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

  2. फिर दोनों फ़ाइलों को पुराने पथ से नए पथ पर ले जाएँ और फिर से Server_Name पर राइट-क्लिक करके सर्वर को शुरू करें। डेटाबेस के नए पथ की पुष्टि करें फिर से 1 चरण की क्वेरी निष्पादित करें।


0

मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है (मैं यह बताने के लिए किसी भी टिप्पणी का स्वागत करूंगा कि यह कैसे नहीं है), लेकिन यह बहुत सरल है (और अगर आपके पास एक छोटा डेटाबेस है):

सबसे पहले, डेटाबेस को एक .bak फ़ाइल में बैकअप दें। फिर, उसी .bak फ़ाइल से डेटाबेस को पुनर्स्थापित करें, पुनर्स्थापना कार्य के लिए फ़ाइल विकल्पों के तहत नए .mdf और .ldf फ़ाइल स्थानों का चयन करें।

मैं इसे एक रखरखाव विंडो के उत्पादन वातावरण में नहीं करूंगा, क्योंकि आप डेटाबेस को पुनर्स्थापना के दौरान एक्सेस नहीं कर सकते हैं। अन्य तरीकों को मैंने ऊपर देखा है, हालांकि समान कमियां होंगी। पुनर्स्थापना कार्य पूरा होने के बाद, आपको पुरानी फ़ाइल को हटाने की आवश्यकता नहीं है। यह अपने आप हो गया।


1
इस परिदृश्य में कुछ कमियां हैं। पुनर्स्थापित करते समय, मूल DB को अधिलेखित या नामांकित किया जाना चाहिए। बड़े डेटाबेस के लिए, विधि गंभीर आईओ ओवरहेड का परिचय देती है। फाइल को डिटैच-अटैच करने या db मेथड्स को बदलने का तरीका तेजी से आगे बढ़ता है। यदि फ़ाइलें समान NTFS विभाजन में स्थानांतरित की जाती हैं, तो यह केवल मेटाडेटा ऑपरेशन है।
vonPryz

@ अलि - बैकअप और पुनर्स्थापना। अधिक समय लग सकता है, लेकिन आम तौर पर एक सुरक्षित मार्ग है। पर हारून बर्ट्रेंड के विश्लेषण देखें: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups इसके अलावा: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF

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

0

मौजूदा उत्तरों को पूरक करने के लिए: यहां ALTER DATABASE ... MOVE ...सभी डेटाबेस के लिए विवरण बनाने के लिए एक स्क्रिप्ट है :

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';

ध्यान दें:

  • REPLACE(f.physical_name, 'C:\', 'D:\')फ़ाइल पथ के लिए आप जो भी परिवर्तन करना चाहते हैं, उसे बदलें ।

  • masterयह छूट है, क्योंकि इसका मार्ग SQL सर्वर के स्टार्टअप विकल्पों (उदाहरण के लिए, विवरण के लिए यह उत्तर ) द्वारा निर्धारित किया जाता है ।

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