SQL SERVER ATTACH DETACH İŞLEMLERİNİ KULLANARAK VERİ TABANINI TAŞIMA
Sql Serverda işlemlerimizi gerçekleştirirken, sunuculardaki kaynak yetersizliği, domain değişikliği veya sürüm yükseltme gibi işlemler sonucu veri tabanını taşımamız gereken durumlar oluşabilir. Bir veri tabanını taşımanın birden çok yolu vardır. Restore-Backup, Detach-Attach,Generate Script bunlardan bazılarıdır. Bu yazıda attach detach yöntemi ile taşımayı anlatacağım.
SQL serverda verinin birden çok primary ya da secondary dosyası olabilir. Detach edilmeden veri tabanı dosyaları taşınamaz. Taşıyacağımız veri tabanının öncelikle dosyalarının nerede olduğunu öğrenmemiz gerekir. Bunu scriptle veya SSMS aracılığı ile öğrenebiliriz:
- Aşağıdaki scriptlerle dosyaların konumunu öğrenebiliriz.
Use TestDB go Exec sp_helpfile
SELECT file_id, type_desc, name, physical_name, state_desc FROM sys.database_files;
sp_helpdb 'TestDB'
2. MSSQL üzerinde taşınacak veri tabanına sağ tıklanır. Properties ‘e gelinir. Files kısmında bulunan File Name bize dosya yolunu verir.
Burada dosyaların konumu şu şekildedir:
C:\SQL\Data\TestDB.mdf
C:\SQL\Data\TestDB_log.ldf
C:\SQL\Data\TestDB_1.ndf
Veri tabanını yeni bir lokasyona taşımak istediğimizde SQL Server üzerinde herhangi bir şey yapmadan bu dosyaları kes yapıştır ya da kopyala yapıştır ile yeni dosya yoluna taşımak istersek aşağıdaki hatayı alırız.
Bu yüzden öncelikle veri tabanından bu dosyaları ayırmamız gerekir. Detach işlemi ile veri tabanından bu dosyayı ayırabiliriz.
Detach İşlemi
Taşınacak olan veri tabanı öncelikle detach edilmelidir. Yani veri tabanından ayrılmalıdır. Bu iş için taşınacak veri tabanına sağ tıklanır. Tasks >Detach seçilir.
Detach seçildikten sonra aşağıdaki ekran gelir.
Database Name alanında taşınmak istenen veri tabanının ismi yer alır.
Drop Connections alanı mevcutta var olan connectionları silmek için işaretlenir. Message kısmında aktif bir connection bulunmaktadır. Bu durumda Drop connections tiki işaretlenmediği sürece veri tabanı detach edilemez. Elbette canlı veri tabanlarında connectionları drop etmek doğru bir çözüm yolu olmayabilir. Böyle bir durum yapılacaksa eğer mutlaka kullanıcılar bilgilendirilmelidir. Aksi takdirde veri kaybına sebep olabilir.
Eğer active connections kısmına tıklarsanız aşağıdaki uyarıyı alırsınız.
Burada detach etmeden önce active connectionları ya kapatın ya da Drop Connections tikini işaretleyin uyarısı yer alıyor. Ben bu işlemi yaparken çoktan active connectionlar bitmişti ama yine de drop connections’ı işaretleyerek devam ediyorum.
Update Statistics: Bu seçenek tercihinize kalabilir. Status: Veri tabanında eğer hala connection varsa bu kısım not ready olarak gözükür. Ama connection yoksa yani message kısmı boşsa burada ready yazacaktır. Not ready olması durumunda drop connections işaretlenerek devam edilebilir. Ya da active connectionlar başka yöntemlerle sonlandırılabilir. Yukarıda belirttiğim gibi veri kaybına dikkat edilmelidir.
Bu şekilde işaretleyerek devam ediyorum. İsterseniz OK tuşuna basarak devam edebilirsiniz. Ya da sol üstte yer alan Script’e basarak yapılan işlemi görebilirsiniz.
Script ile yapmayı tercih edersek eğer aşağıdaki sorgu oluşacaktır.
USE [master] GO ALTER DATABASE [TestDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO USE [master] GO EXEC master.dbo.sp_detach_db @dbname = N'TestDB', @skipchecks = 'false' GO
Eğer Update Statistics işaretlenmezse en sonda yer alan @skipchecks = ‘false’ kısmı gelmeyecektir. Script çalıştırıldığında veri tabanı Single User ‘a geçer, tüm connectionlar kopar ve istatistikler güncellenir. TestDB detach edilmiştir ve database listesinde artık adı görünmez.
Attach İşlemi
C:\SQL\Data\TestDB.mdf
C:\SQL\Data\TestDB_log.ldf
C:\SQL\Data\TestDB_1.ndf
Dosyaların yolu böyleyken taşıyarak aşağıdaki konuma getirdim.
C:\SQL\New Data\TestDB.mdf
C:\SQL\New Data\ TestDB_log.ldf
C:\SQL\New Data\ TestDB_1.ndf
Daha sonra SSMS’de Databases’a sağ tıklayarak Attach’i seçiyoruz.
Aşağıdaki ekran gelecektir. Add kısmına basarak dosyaların bulunduğu lokasyondan .mdf dosyası seçilir.
Burada sadece .mdf dosyası gözükmektedir. Bu seçilir ve OK denilir.
Databases to attach kısmında attach edilecek veri tabanına dair bilgiler yer almaktadır. MDF File Location, veri dosyasının yerini gösterir. Database Name veri tabanının mevcut adını verir. Attach as kısmında ise istenirse veri tabanı başka bir isimle Attach edilebilir. Örneğin TestDB yerine Test olarak yapalım burayı.
Aşağıdaki “TestDB” database details kısmında ise yine dosyaların detayları yer alır. Hangisinin .mdf .ldf veya .ndf olduğu burada görülür. Dosyayı seçerken sadece biz .mdf i seçeriz ama hepsi aynı dosyada olduğu için buraya hepsini getirir. .log dosyasının aynı dosyada olmaması durumunda kendi bir log dosyası oluşturarak attach işlemi gerçekleşebilir. Ama .ndf dosyasının .mdf ile aynı dosyada olmaması durumunda işlem hata alacaktır.
Sol üst köşeden Script diyerek yine query i görüntülüyorum. Çalıştırarak TestDB yi Test adında Attach ediyorum.
USE [master] GO CREATE DATABASE [Test] ON ( FILENAME = N'C:\SQL\New Data\TestDB.mdf' ), ( FILENAME = N'C:\SQL\New Data\TestDB_log.ldf' ), ( FILENAME = N'C:\SQL\New Data\TestDB_1.ndf' ) FOR ATTACH GO
Burada görüldüğü üzere Create Database [Test] dedikten sonra dosya yolu olarak yeni taşınan dosya yolunu gösteriyor.
En baştaki script ile veri tabanının yerini doğrulayabilirsiniz.
Bu yöntemle aşağıdakiler yapılamaz:
- Sistem databaseleri detach edilemez.
- Suspect moda geçmiş database detach edilemez.
- Yüksek bir versiyondaki SQL düşük versiyona attach edilemez. Tam tersi mümkündür.
Veri tabanını taşımanın birden fazla yolu vardır. Biri de bu işlemdir. Elbette tüm işlemler araştırılarak sisteminize en uygun olanı seçmelisiniz. İyi taşımalar 😊