Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara Memindahkan File Data di SQL Server – Bagian 1

Pengantar

Ada sejumlah situasi yang menjamin perpindahan file database atau file log transaksi dari satu volume ke volume lainnya di server yang sama. Ini mungkin termasuk:

  1. Kebutuhan untuk memformat volume dengan asumsi itu tidak diformat dengan benar ketika SQL Server diinstal . Ingatlah bahwa ketika menginstal SQL Server, disarankan agar ukuran unit alokasi 64K digunakan untuk memformat volume. Jika hal ini tidak dilakukan pada saat penginstalan dan perlu dilakukan nanti, ini jelas akan memerlukan penyimpanan cadangan basis data atau membuat volume baru yang diformat dengan benar dan memindahkan basis data ke volume baru ini.
  2. Kebutuhan untuk menggunakan volume baru dengan asumsi batas telah tercapai untuk penyimpanan yang mendasarinya . Contoh yang baik adalah batas 2TB dari VMware Data Store. Ini adalah kasus pada VSphere 5.0. Versi VSphere yang lebih tinggi memiliki batas yang jauh lebih tinggi.
  3. Kebutuhan untuk meningkatkan kinerja dengan mengelola IO . Satu lagi alasan Anda mungkin ingin memindahkan file data adalah kinerja. Ada kasus di mana database dibuat dengan beberapa file data semua duduk di satu disk sampai menjadi jelas, sebagai database tumbuh, bahwa Anda telah membuat "wilayah panas" di lapisan penyimpanan. Salah satu solusinya adalah membuat file data baru dan membangun kembali indeks berkerumun, solusi lainnya adalah memindahkan file data.

Skenario Satu:Memindahkan Basis Data Pengguna

Langkah-langkah yang terlibat dalam memindahkan database pengguna adalah sebagai berikut:

  1. Jadikan database offline
  2. Perbarui katalog sistem dengan lokasi baru
  3. Salin file data secara fisik ke lokasi baru
  4. Buat database online

Daftar 1 menunjukkan perintah yang dijalankan untuk mencapai langkah-langkah ini.

Mencantumkan 1 Memindahkan File Data

-- 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');

Penting untuk dicatat bahwa ketika mengambil database offline jumlah sesi aktif dapat menunda proses. Menjadwalkan waktu henti untuk melakukan tugas ini adalah ide yang bagus. Selama waktu henti seperti itu, pemilik aplikasi harus menghentikan layanan aplikasi yang terhubung ke database sebelum DBA mencoba membuat database offline. Ada kasus di mana tidak nyaman untuk membuat database offline, maka mematikan instans akan menjadi pilihan terbaik. Dalam kasus seperti itu, pendekatannya akan sedikit berbeda:

  1. Perbarui katalog sistem dengan lokasi baru
  2. Matikan instance
  3. Salin file data yang diinginkan secara fisik ke lokasi baru
  4. Mulai instance

Dalam kedua pendekatan, konsepnya sama:melibatkan pembaruan katalog sistem di database master dan kemudian secara fisik merelokasi file data yang diinginkan. Dalam kedua kasus, file data harus ditutup dengan bersih. Mari kita lihat langkah-langkah yang terlibat dalam pendekatan pertama.

Gbr. 1 Verifikasi Lokasi File Data

Langkah pertama adalah memeriksa keadaan untuk memulai. Lanjutkan untuk mengatur database offline dan memodifikasi katalog sistem.

Gbr. 2 Mengatur Database Offline dan Memodifikasi Katalog

Seperti yang terlihat pada Gambar 3, setelah kami memperbarui katalog, kueri sys.master_files memberi tahu kami lokasi baru yang diharapkan oleh basis data master untuk datafile apakah kami telah memindahkan file secara fisik atau tidak. Pada Gambar 4, kita juga melihat bahwa tidak mungkin membawa database online tanpa terlebih dahulu memindahkan file ke lokasi baru secara fisik (dan mengganti nama file agar sesuai dengan nama baru yang ditentukan dalam katalog).

Gbr. 3 Lokasi File Baru

Gbr. 4 File Hilang

Kami juga ingin menunjukkan bahwa setelah kami menyalin file, kami kehilangan izin sebelumnya pada file dan SQL Server tidak akan dapat membuka file ketika kami mencoba membawa database online. Kita harus mengedit izin file dan menambahkan izin penuh kepada akun NT SERVICE\MSSQLSERVER pada file.

Gbr. 5 Salin File Data

Gbr. 6 Izin di Tempat Tujuan

Gbr. 7a Izin di Sumber

Gbr. 7b Izin di Sumber

Jika kami mencoba membawa database online lagi dengan izin ini hilang, kami akan mendapatkan kesalahan 0x5 (Access Denied). Jika kami melakukan sesuatu seperti memindahkan file data menggunakan pekerjaan agen, kami menemukan bahwa akun Agen Server SQL memperoleh kepemilikan file dan kami dapat membawa database hanya karena akun Agen Server SQL sama dengan Akun SQL Server.

Gbr. 8 Akses Ditolak pada File Data Baru

Dengan asumsi Anda mencoba untuk membawa database online menggunakan SSMS GUI, Anda akan melihat kesalahan ini di Peraga Peristiwa serta di log kesalahan SQL Server jika Anda melihat lebih dekat. Selain itu, jika Anda menggunakan pendekatan kedua (memulai ulang seluruh instance), Anda akan mengamati bahwa database akan macet pada tahap pemulihan. Memeriksa Log Kesalahan akan memberi tahu Anda apa yang sebenarnya terjadi.

Mencantumkan 2 Memindahkan File Data Menggunakan Pekerjaan Agen

/* ==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

Gbr. 9 Izin pada Datafile Saat Menggunakan Pekerjaan Agen

Gambar 10 Basis Data Online

Mengotomatiskan Proses

Hanya untuk bersenang-senang, kami dapat memutuskan untuk menggunakan SQL Server Agent Job untuk seluruh proses. Kami mengonfigurasi langkah pekerjaan untuk setiap langkah proses kami. Ini mungkin berguna jika Anda ingin menjadi DBA superstar dan menjadwalkan migrasi seperti itu semalaman saat Anda pulang ke rumah dan bersantai bersama keluarga. Anda pasti ingin memastikan bahwa Anda mengonfigurasi pemberitahuan untuk diaktifkan saat pekerjaan berhasil sehingga Anda yakin itu benar-benar selesai saat Anda pergi.

Mencantumkan 3 Melakukan Tugas Menggunakan Pekerjaan Agen

/* ==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

Kesimpulan

Pada artikel ini, kita telah melihat salah satu cara untuk memindahkan file database pengguna di SQL Server. Kami juga melihat kebutuhan untuk memastikan bahwa kami memberikan perhatian pada izin pada file data di lokasi baru sehingga kami tidak menemukan kesalahan saat mengembalikan database online. Kami juga telah melihat bahwa kami dapat menempatkan semua ini dalam pekerjaan Agen Server SQL menggunakan Subsistem T-SQL dan PowerShell. Dalam artikel berikutnya, kita akan melihat dua metode lain untuk memindahkan file database ke volume baru.

Bacaan lebih lanjut:

Pindahkan Datafiles di SQL Server – Bagian 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. Apa itu SQL Operations Studio (SQLOPS)?

  2. SQL Server:Filter keluaran sp_who2

  3. SQL Server 2014 :Enkripsi cadangan asli

  4. Perbedaan antara datetime dan timestamp di sqlserver?

  5. Cara Membuat Shortcut Untuk SSMS dan Connect to Default SQL Server Secara Otomatis - SQ:Server/TSQL Tutorial Part 4