Toplu Olarak MDF ve LDF Dosyalarını Taşımak / Moving Data and Log Files

Merhaba,

Bildiğiniz gibi databaselerimizin data ve log dosyalarını fiziksel olarak taşımak için detach / attach yöntemini kullanıyoruz.
Fakat bu işlem birden fazla database için yorucu olabilir.

Bunun için bir script geliştirdim. Bu script ile tüm databaseleri detach etmeden taşıyabiliyoruz. Veya isterseniz parametre olarak veriğiniz tek bir database için bu işlemi yapabilirsiniz.
Scriptin çalışması şu şekilde;


Parametre olarak data ve log dosyalarının duracağı yeni lokasyonu belirtiyoruz. (Log ve Data ayrı verilebilir)
Sonrasında script tüm veritabanlarını offline moda alarak master databasei üstünde meta bilgilerini güncelliyor.
Eğer @dbName parametresine database ismi yazarsanız sadece o database için script üretlir.

Bu aşamadan sonra dosyaları sizin fiziksel olarak taşınamız gerekli.
Daha sonra veritabanlarını online yaptığınızda (scriptin çıktısında yorum satırı olan kısım) yeni lokasyonlarından çalışmaya devam edecekler.

Anlaşılmayan bir yer varsa yorum bölümüne belirtebilirsiniz.
Kolay gelsin.

DECLARE @cmd VARCHAR(MAX)
DECLARE @newDataPath VARCHAR(255)
DECLARE @newLogPath VARCHAR(255)
DECLARE @dbName VARCHAR(255)

SET @newDataPath = 'I:\Data' -- No slash \
SET @newLogPath = 'J:\Log' -- No slash \
SET @dbName = '' -- For one database
SELECT @cmd = COALESCE(@cmd + '','USE [master];') + '
' + (CASE WHEN (file_id = 1) THEN '
ALTER DATABASE [' + DB_NAME(database_id) + '] SET OFFLINE WITH ROLLBACK IMMEDIATE;
' ELSE '' END) +
'ALTER DATABASE [' + DB_NAME(database_id) + '] MODIFY FILE (Name = [' + name + '], Filename = '''
+ (CASE WHEN (type = 1) THEN @newLogPath ELSE @newDataPath END)
+ '\' + REVERSE(left(REVERSE(physical_name),CHARINDEX('\',REVERSE(physical_name))-1)) + ''')'

FROM sys.master_files
WHERE database_id > 4
AND database_id = (CASE WHEN (@dbName != '') THEN DB_ID(@dbName) ELSE database_id END)

SELECT @cmd = @cmd +'
--
--
-- Tüm dosyalar taşındıktan sonra çalıştırılacak
-- Execute, after moving files
--
/*'

SELECT @cmd = COALESCE(@cmd + '','') + '
ALTER DATABASE [' + name + '] SET ONLINE;'
FROM sys.databases
WHERE database_id > 4
AND database_id = (CASE WHEN (@dbName != '') THEN DB_ID(@dbName) ELSE database_id END)

SELECT @cmd = @cmd +'
*/'

SELECT @cmd

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s