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:
- 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.
- 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.
- 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:
- Jadikan database offline
- Perbarui katalog sistem dengan lokasi baru
- Salin file data secara fisik ke lokasi baru
- 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:
- Perbarui katalog sistem dengan lokasi baru
- Matikan instance
- Salin file data yang diinginkan secara fisik ke lokasi baru
- 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