MSSQL Server Veritabanı Adını Değiştirme

Bu makalede bir veritanının adı nasıl değiştirilir ve ne gibi yol izlenir konusunu ele almış olacağız. Bir veritabanı üzerinde herhangi bir kullanıcı bağlı değilse  sadece F2 tuşuna basarak, veritabanı üzerine iki defa tıkladığımızda veya sağ tıklanıp Rename kısmından ismini rahat bir şekilde değiştirebiliriz.

A veritabanı için F2 tuşuna basılır. Veritabanı üzerinde herhangi bir session açık olması ismini değiştirememize sebebiyet verecektir.

Yeni veritabanı ismini belirledikten sonra enter tuşuna basarsak aşağıdaki gibi bir seçenek karşımıza çıkmaktadır. Burada Yes butonuna basarsak veritabanımızın ismi başarılı bir şekilde değişmiş olacaktır.

Değişim yapacağımız veritabanı üzerinde açık session varsa değişim sırasında hata mesajıyla karşılaşırsanız. İlgili Makale sorununuzu çözecektir.

Sql Server “The database could not be exclusively locked to perform the operation.” Solution of the Error

Yukarıdaki hata mesajını almak istemiyorsanız. Rename yapacağımız veritabanı üzerinde bulunan tüm sessionları kapatmak için aşağıdaki komutu kullanabilirsiniz.

select 'kill '+CAST(spid AS varchar(50)) from sys.sysprocesses where dbid=DB_ID('M')

Gelen tüm kill ifadelerini kopyalayıp çalıştırmamız gerekmektedir.

Aşağıdaki komut ile veritabanı altındaki tüm session’ları otomatik olarak kill edebiliriz.

declare @Sql varchar(1000), @veritabaniadi varchar(100) 
set @veritabaniadi = 'Buraya Veritabanı Adını Yazmalısınız' 
set @Sql = ''  
select  @Sql = @Sql + 'kill ' + convert(char(10), spid) + ' ' 
from    master.dbo.sysprocesses 
where   db_name(dbid) = @veritabaniadi
     and 
     dbid <> 0 
     and 
     spid <> @@spid 
exec(@Sql)
GO

High Availability yöntemleriyle çalışan bir veritabanının ismini değiştirmek istediğimizde ise  hata mesajı alırız.  Veritabanı altında session olmasa bile veritabanı ismi değiştiremeyiz. Hatta veritabanımızı single user moda dahi alamayız. Çünkü veritabanımız AlwaysOn mimarisi altında dönmektedir.

Bunun için veritabanımızı AlwaysOn yapısından çıkarıp isim değişikliği yaparsak tekrardan AlwaysOn yapısına almamız gerekecektir. Secondary sunucularında da bu isim değişikliğinin yapılması gerekmektedir. Secondary sunucularında veritabanı küçükse silinip tekrardan oluşturulabilir ama büyük ise full diff ve logların ikinci sunucularda restore edilmesi  gerekmektedir. Bu işlemlerden sonra ilgili database secondary sunucusunda AG’ye dahil edilir. Çünkü secondary suncusunda çıkarmış olduğumuz database Restoring modunda olur bir değişiklik yapılamaz.

Not: Restoring modda olan veritabanının ismi değişmez.

Aşağıdaki komut ise veritabanını nasıl single user moduna alıp isim değiştirdiğimizi görebiliriz.

USE master;
GO
ALTER DATABASE A SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE A MODIFY NAME = B;
--EXEC sp_renamedb 'A', 'B';
GO
ALTER DATABASE B SET MULTI_USER;
GO

Veritabanı adını değiştirdiğimizde mdf ve ldf dosyaları adları otomatik olarak değişmez. Mdf ve ldf dosyalarının adlarını değiştirmek için aşağıdaki adımlar yapılır.

EXEC sp_renamedb 'A', 'B';

Veritabanı adını B olarak değiştirdiğimde Files bölümünde mdf ve ldf’in önceki veritabanı isminde kaldığını görmekteyiz.

File name’i veritabanı ismiyle aynı yapmak için aşağıdaki yöntemler kullanılır. Mdf ve ldf dosyasının hangi disk altında olduğu yukarıdaki komutla öğrenilir.

Öncelikle veritabanını kapatmalıyız, çünkü çalışan bir veritabanının MDF/LDF dosyalarını değiştiremeyiz. Veritabanımızı Offline moduna alıyoruz.

ALTER DATABASE B SET OFFLINE WITH ROLLBACK IMMEDIATE;

Bu komut, veritabanını kapatır ve tüm aktif bağlantıları sonlandırır. Daha sonra mdf ve ldf olan veritabanı dosyalarımızın uzantısına gidilir. Yukarıda ekran resminde hangi uzantıda olduğu görülmektedir. Data file’ların olduğu disk uzantılarına gidilir. Manuel bir şekilde isimleri değiştirilir.

Dikkat ederseniz ilk olarak data file kısmında belirtilen disk yolunda değişiklik yapılmaktadır.

Yukarıdaki resimlerde görüldüğü gibi ilgili değişiklikler yapılır. Değişiklikler yapıldıktan sonra sql server’a ilgili dosya adlarının değiştiğini öğretmemiz gerekmektedir. Bunun için aşağıdaki komutlar kullanılır.

NAME kısmında aşağıdaki komutlarda gerçek veritabanı adını yazarsak hata mesajı ile karşılaşırız.

ALTER DATABASE B MODIFY FILE (NAME = 'A', FILENAME = 'E:\DATA\B.mdf');

ALTER DATABASE B MODIFY FILE (NAME = 'A_log', FILENAME = 'E:\LOG\B_log.ldf');

B yapılan yeni veritabanımızın ismini yazdıktan sonra NAME kısmında ilk ekran resminde görünün önceki A veritabanının logical name ifadesinin yazılması gerekmektedir. Daha sonra disk uzantısından değiştirmiş olduğumuz yeni mdf ve ldf ifadelerin yazılması gerekmektedir. Yukarıdaki komutları başarılı bir şekilde çalıştırdıktan sonra veritabanımızı tekrardan ONLINE moduna alıyoruz.

ALTER DATABASE B SET ONLINE WITH ROLLBACK IMMEDIATE;
--veya
ALTER DATABASE B SET ONLINE

MDF ve LDF isimlerimiz başarılı bir şekilde değişmiş oldu. Logical name kısmının değişmesini yukarıdaki ekrandan manuel yapabilirsiniz.

Yukarıdaki işlemleri yaparken ilk başta veritabanı ismini değiştirmiştik. Tam tersi ilk başta veritabanını offline moda alıp tüm modify işlemlerini yaptıktan sonra en sonra veritabanının ismini aşağıdaki komutla değiştirmemiz gerekmektedir.

EXEC sp_renamedb 'EskiVeritabaniAdi', 'YeniVeritabaniAdi';

Yukarıdaki tüm işlemlerden sonra aşağıdaki komutları çalıştırdığımızda aynı sonucu döndüğünü görmekteyiz.

select*from sys.master_files

select*from sys.database_files 

Log dosyasını farklı bir disk altına taşıyabilirsin. Herhangi bir sakıncası kısıtlama yok. Önemli olan önceki pathlerde log dosyasının ismini yeni veritabanı ismi değiştirmek ve ardında yeni klasöre taşımak. Daha sonra Alter modify komutu ile yeni disk yolları tanıtılmaktadır. Çünkü tam tersi yapıp B veritabanı ismini A olarak değiştirdim ldf dosya yolunu değiştirdim.

Master file altında da aynı komut çalıştırılmaktadır.

Eğer yukarıdaki adımlarla uğraşmak istemiyorsan, veritabanını DETACH edip sonra ATTACH edebilirsin.

Başka bir makalede görüşmek dileğiyle..

“Şüphesiz geceyle gündüzün, süreleri değişerek ardı ardına gelmesinde, Allah’ın göklerde ve yerde yarattığı her varlıkta, kalpleri Allah’a karşı saygıyla dopdolu olan ve hayatları boyunca O’na karşı gelmekten sakınanlar için elbette nice işaretler, deliller vardır.” Yunus-6

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir