Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में डेटा फ़ाइलों को कैसे स्थानांतरित करें - भाग 1

परिचय

ऐसी कई स्थितियाँ हैं जो एक ही सर्वर पर एक वॉल्यूम से दूसरे वॉल्यूम में डेटाबेस फ़ाइलों या लेन-देन लॉग फ़ाइलों की आवाजाही की गारंटी देती हैं। इनमें शामिल हो सकते हैं:

  1. यह मानते हुए वॉल्यूम को प्रारूपित करने की आवश्यकता है कि SQL सर्वर स्थापित होने पर इसे ठीक से स्वरूपित नहीं किया गया था . याद रखें कि SQL सर्वर स्थापित करते समय, यह अनुशंसा की जाती है कि वॉल्यूम को प्रारूपित करने के लिए 64K आवंटन इकाई आकार का उपयोग किया जाए। यदि यह स्थापना के बिंदु पर नहीं किया जाता है और बाद में करने की आवश्यकता होती है, तो स्पष्ट रूप से डेटाबेस मुट्ठी के बैकअप को संरक्षित करने या एक नया, उचित रूप से स्वरूपित वॉल्यूम बनाने और डेटाबेस को इस नए वॉल्यूम में ले जाने की आवश्यकता होगी।
  2. अंतर्निहित संग्रहण के लिए सीमाएं पूरी हो चुकी हैं, यह मानते हुए एक नए वॉल्यूम का उपयोग करने की आवश्यकता . एक अच्छा उदाहरण VMware डेटा स्टोर की 2TB सीमा होगी। वीस्फेयर 5.0 के मामले में यही स्थिति है। VSphere के उच्चतर संस्करणों की सीमाएँ बहुत अधिक हैं।
  3. आईओ को प्रबंधित करके प्रदर्शन में सुधार करने की आवश्यकता . डेटाफ़ाइलों को स्थानांतरित करने का एक और कारण प्रदर्शन है। ऐसे मामले हैं जहां एक डेटाबेस को एक डिस्क पर बैठे कई डेटाफाइलों के साथ बनाया जाता है, जब तक कि यह स्पष्ट नहीं हो जाता है, जैसे कि डेटाबेस बढ़ता है, कि आपने स्टोरेज लेयर में "हॉट रीजन" बनाया है। एक समाधान नई डेटा फ़ाइलें बनाना और क्लस्टर इंडेक्स का पुनर्निर्माण करना होगा, दूसरा डेटा फ़ाइलों को स्थानांतरित करना होगा।

परिदृश्य एक:उपयोगकर्ता डेटाबेस को स्थानांतरित करना

उपयोगकर्ता डेटाबेस को स्थानांतरित करने में शामिल चरणों में निम्नलिखित शामिल हैं:

  1. डेटाबेस को ऑफ़लाइन लें
  2. सिस्टम कैटलॉग को नए स्थान से अपडेट करें
  3. डेटाफ़ाइल को भौतिक रूप से नए स्थान पर कॉपी करें
  4. डेटाबेस को ऑनलाइन लाएं

सूची 1 इन चरणों को प्राप्त करने के लिए निष्पादित आदेशों को दिखाती है।

1 चलती डेटाफ़ाइलों की सूची बनाना

-- 1. Run the following statement to check the current location of files.
SELECT name, physical_name AS CurrentLocation, state_desc FROM sys.master_files WHERE database_id = DB_ID(N'BranchDB');
-- 2. Take the database offline.
ALTER DATABASE BranchDB SET OFFLINE;
-- 3. Move the file or files to the new location (at OS level).
-- 4. For each file moved, run the following statement.
ALTER DATABASE BranchDB MODIFY FILE ( NAME = WWI_UserData, FILENAME = 'N:\MSSQL\Data\WWI_UserDataNew.ndf' );
-- 5. Run the following statement.
ALTER DATABASE BranchDB SET ONLINE;
-- 6. Verify the file change by running the following query.
SELECT name, physical_name AS CurrentLocation, state_desc FROM sys.master_files WHERE database_id = DB_ID(N'BranchDB');

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

  1. सिस्टम कैटलॉग को नए स्थान से अपडेट करें
  2. उदाहरण बंद करें
  3. वांछित डेटाफ़ाइल को भौतिक रूप से नए स्थान पर कॉपी करें
  4. इंस्टेंस प्रारंभ करें

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

चित्र 1 डेटाफ़ाइलों के स्थान की पुष्टि करें

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

चित्र 2 डेटाबेस ऑफ़लाइन सेट करें और कैटलॉग संशोधित करें

जैसा कि चित्र 3 में देखा गया है, एक बार जब हम कैटलॉग को अपडेट करते हैं, तो sys.master_files को क्वेरी करना हमें वह नया स्थान बताता है जहां मास्टर डेटाबेस डेटाफाइल की अपेक्षा करता है कि हमने फ़ाइल को भौतिक रूप से स्थानांतरित किया है या नहीं। चित्र 4 में, हम यह भी देखते हैं कि फ़ाइल को नए स्थान पर भौतिक रूप से स्थानांतरित किए बिना डेटाबेस को ऑनलाइन लाना संभव नहीं है (और कैटलॉग में निर्दिष्ट नए नाम से मेल खाने के लिए फ़ाइल का नाम बदलें)।

चित्र 3 नई फ़ाइल स्थान

चित्र 4 गुम फ़ाइल

हम यह भी बताना चाहेंगे कि एक बार जब हम फ़ाइल की प्रतिलिपि बनाते हैं, तो हम फ़ाइल पर पिछली अनुमतियाँ खो देते हैं और जब हम डेटाबेस को ऑनलाइन लाने का प्रयास करते हैं तो SQL सर्वर फ़ाइल को खोलने में सक्षम नहीं होगा। हमें फ़ाइल अनुमतियों को संपादित करना होगा और NT SERVICE\MSSQLSERVER खाते को फ़ाइल पर पूर्ण अनुमतियाँ देना होगा।

अंजीर। 5 डेटाफाइल की प्रतिलिपि बनाएँ

चित्र 6 गंतव्य पर अनुमतियाँ

अंजीर। स्रोत पर 7a अनुमतियाँ

अंजीर। स्रोत पर 7b अनुमतियाँ

यदि हम इन अनुमतियों के गायब होने के साथ डेटाबेस को फिर से ऑनलाइन लाने का प्रयास करते हैं, तो हमें एक त्रुटि 0x5 (पहुँच अस्वीकृत) मिलेगी। अगर हम एजेंट जॉब का उपयोग करके डेटाफाइल को स्थानांतरित करने जैसा कुछ करते हैं, तो हम पाते हैं कि SQL सर्वर एजेंट खाता फ़ाइल का स्वामित्व प्राप्त करता है और हम डेटाबेस केवल इसलिए ला सकते हैं क्योंकि SQL सर्वर एजेंट खाता SQL सर्वर खाते के समान है।

चित्र 8 नई डेटाफ़ाइल पर एक्सेस अस्वीकृत

यह मानते हुए कि आप SSMS GUI का उपयोग करके डेटाबेस को ऑनलाइन लाने का प्रयास कर रहे थे, यदि आप बारीकी से देखें तो आपको इवेंट व्यूअर के साथ-साथ SQL सर्वर त्रुटि लॉग में ये त्रुटियां दिखाई देंगी। इसके अलावा, यदि आप दूसरे दृष्टिकोण का उपयोग कर रहे थे (पूरे उदाहरण को पुनरारंभ करना), तो आप देखेंगे कि डेटाबेस पुनर्प्राप्ति चरण में फंस जाएगा। त्रुटि लॉग की जांच करने से आपको पता चल जाएगा कि वास्तव में क्या चल रहा है।

एजेंट जॉब का उपयोग करके 2 मूविंग डेटाफाइल्स को सूचीबद्ध करना

/* ==Scripting Parameters==
Source Server Version : SQL Server 2017 (14.0.3023) Source Database Engine Edition : Microsoft SQL Server Standard Edition Source Database Engine Type : Standalone SQL Server
Target Server Version : SQL Server 2017 Target Database Engine Edition : Microsoft SQL Server Standard Edition Target Database Engine Type : Standalone SQL Server */
USE [msdb]
GO
/****** Object: Job [MoveDataFile] Script Date: 7/12/2018 12:33:55 AM ******/ BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT
	@ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 7/12/2018 12:33:56 AM ******/
IF NOT EXISTS (SELECT
			name
		FROM msdb.dbo.syscategories
		WHERE name = N'[Uncategorized (Local)]'
		AND category_class = 1)
BEGIN
	EXEC @ReturnCode = msdb.dbo.sp_add_category @class = N'JOB'
											   ,@type = N'LOCAL'
											   ,@name = N'[Uncategorized (Local)]'
	IF (@@error <> 0
		OR @ReturnCode <> 0)
		GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name = N'MoveDataFile'
									  ,@enabled = 1
									  ,@notify_level_eventlog = 0
									  ,@notify_level_email = 0
									  ,@notify_level_netsend = 0
									  ,@notify_level_page = 0
									  ,@delete_level = 0
									  ,@description = N'No description available.'
									  ,@category_name = N'[Uncategorized (Local)]'
									  ,@owner_login_name = N'sa'
									  ,@job_id = @jobId OUTPUT
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback /****** Object: Step [MoveDataFile] Script Date: 7/12/2018 12:33:56 AM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @jobId
										  ,@step_name = N'MoveDataFile'
										  ,@step_id = 1
										  ,@cmdexec_success_code = 0
										  ,@on_success_action = 1
										  ,@on_success_step_id = 0
										  ,@on_fail_action = 2
										  ,@on_fail_step_id = 0
										  ,@retry_attempts = 0
										  ,@retry_interval = 0
										  ,@os_run_priority = 0
										  ,@subsystem = N'PowerShell'
										  ,@command = N'Copy-Item -Path M:\MSSQL\Data\WWI_UserData1.ndf N:\MSSQL\Data\WWI_UserData1.ndf'
										  ,@database_name = N'master'
										  ,@flags = 0
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId
										 ,@start_step_id = 1
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId
											,@server_name = N'(local)'
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@trancount > 0)
	ROLLBACK TRANSACTION
EndSave:
GO

अंजीर। एजेंट नौकरी का उपयोग करते समय डेटाफाइल पर 9 अनुमतियां

अंजीर। 10 डेटाबेस ऑनलाइन

प्रक्रिया को स्वचालित करना

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

सूची 3 एजेंट कार्य का उपयोग करके कार्य करना

/* ==Scripting Parameters==
Source Server Version : SQL Server 2017 (14.0.3023) Source Database Engine Edition : Microsoft SQL Server Standard Edition Source Database Engine Type : Standalone SQL Server
Target Server Version : SQL Server 2017 Target Database Engine Edition : Microsoft SQL Server Standard Edition Target Database Engine Type : Standalone SQL Server */
USE [msdb]
GO
/****** Object: Job [MoveDataFile] Script Date: 7/12/2018 12:46:47 AM ******/ BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT
	@ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 7/12/2018 12:46:47 AM ******/
IF NOT EXISTS (SELECT
			name
		FROM msdb.dbo.syscategories
		WHERE name = N'[Uncategorized (Local)]'
		AND category_class = 1)
BEGIN
	EXEC @ReturnCode = msdb.dbo.sp_add_category @class = N'JOB'
											   ,@type = N'LOCAL'
											   ,@name = N'[Uncategorized (Local)]'
	IF (@@error <> 0
		OR @ReturnCode <> 0)
		GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name = N'MoveDataFile'
									  ,@enabled = 1
									  ,@notify_level_eventlog = 0
									  ,@notify_level_email = 3
									  ,@notify_level_netsend = 0
									  ,@notify_level_page = 0
									  ,@delete_level = 0
									  ,@description = N'No description available.'
									  ,@category_name = N'[Uncategorized (Local)]'
									  ,@owner_login_name = N'sa'
									  ,@notify_email_operator_name = N'DBA'
									  ,@job_id = @jobId OUTPUT
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback
/****** Object: Step [Set Database Offline] Script Date: 7/12/2018 12:46:47 AM ******/ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @jobId
																																 ,@step_name = N'Set Database Offline'
																																 ,@step_id = 1
																																 ,@cmdexec_success_code = 0
																																 ,@on_success_action = 3
																																 ,@on_success_step_id = 0
																																 ,@on_fail_action = 2
																																 ,@on_fail_step_id = 0
																																 ,@retry_attempts = 0
																																 ,@retry_interval = 0
																																 ,@os_run_priority = 0
																																 ,@subsystem = N'TSQL'
																																 ,@command = N'ALTER DATABASE BranchDB SET OFFLINE;'
																																 ,@database_name = N'master'
																																 ,@flags = 0
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback /****** Object: Step [MoveDataFile] Script Date: 7/12/2018 12:46:47 AM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @jobId
										  ,@step_name = N'MoveDataFile'
										  ,@step_id = 2
										  ,@cmdexec_success_code = 0
										  ,@on_success_action = 3
										  ,@on_success_step_id = 0
										  ,@on_fail_action = 2
										  ,@on_fail_step_id = 0
										  ,@retry_attempts = 0
										  ,@retry_interval = 0
										  ,@os_run_priority = 0
										  ,@subsystem = N'PowerShell'
										  ,@command = N'Copy-Item -Path M:\MSSQL\Data\WWI_UserData1.ndf N:\MSSQL\Data\WWI_UserData1.ndf'
										  ,@database_name = N'master'
										  ,@flags = 0
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback /****** Object: Step [ModifyFile and Bring Online] Script Date: 7/12/2018 12:46:47 AM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @jobId
										  ,@step_name = N'ModifyFile and Bring Online'
										  ,@step_id = 3
										  ,@cmdexec_success_code = 0
										  ,@on_success_action = 1
										  ,@on_success_step_id = 0
										  ,@on_fail_action = 2
										  ,@on_fail_step_id = 0
										  ,@retry_attempts = 0
										  ,@retry_interval = 0
										  ,@os_run_priority = 0
										  ,@subsystem = N'TSQL'
										  ,@command = N' ALTER DATABASE BranchDB MODIFY FILE ( NAME = WWI_UserData, FILENAME = ''N:\MSSQL\Data\WWI_UserDataNew.ndf'' );
ALTER DATABASE BranchDB SET ONLINE;'
										  ,@database_name = N'master'
										  ,@flags = 0
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId
										 ,@start_step_id = 1
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId
											,@server_name = N'(local)'
IF (@@error <> 0
	OR @ReturnCode <> 0)
	GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@trancount > 0)
	ROLLBACK TRANSACTION
EndSave:
GO

निष्कर्ष

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

आगे पढ़ना:

SQL सर्वर में डेटा फ़ाइलें ले जाएँ - भाग 2


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में अग्रणी व्हाइटस्पेस कैसे निकालें - LTRIM ()

  2. TSQL md5 हैश C# .NET md5 से अलग है

  3. SQL सर्वर में पिछला व्हाइटस्पेस कैसे निकालें - RTRIM ()

  4. SQL सर्वर 2008 में डेटाबेस से अपने डेटा के साथ एक तालिका का बैकअप लें

  5. SQL सर्वर में Msg 8117 "संचालन डेटा प्रकार varchar योग ऑपरेटर के लिए अमान्य है" को ठीक करें