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