SQL Server’da Detach/Attach yöntemi, bir veritabanını mevcut sunucudan ayırıp (Detach), fiziksel dosyalarını (.mdf ve .ldf) başka bir konuma veya sunucuya taşıdıktan sonra tekrar bağlama (Attach) işlemidir.
Bu yöntem genellikle veritabanlarını sunucular arası taşımak veya dosyaları diskte farklı bir klasöre kaydırmak için kullanılır.
Veritabanını ayırdığınızda, veritabanı SQL Server listesinden kaybolur ancak fiziksel dosyalar diskte kalmaya devam eder. İşlemden önce veritabanına bağlı aktif kullanıcı olmamalıdır.
Veritabanımız üzerinde Sağ tıklayıp Task>Detach.. bölümü seçilmektedir.

Gelen ekranda Detach Connections kutucuğunun işaretlenmesi gerekmektedir. Bu işaretleme aktif bağlantıları kesmektedir. OK diyerek işlemlerimizi tamamlıyoruz. Message kısmında Active connection sayısı görülmektedir.

OK butonuna basıp işlemleri gerçekleştirdiğimiz gibi Script seçeneği ile yapılan işlemin script’ini alabiliriz.
use [master];
GO
USE [master]
GO
ALTER DATABASE [AdventureWorks2017] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2017'
GO
Detach işlemi bittikten sonra, veritabanının .mdf (veri) ve .ldf (log) dosyalarını Windows Gezgini üzerinden istediğiniz yeni klasöre veya yeni sunucuya kopyalayabilir/taşıyabilirsiniz. Taşınan dosyaları tekrar SQL Server’a tanıtma aşamasıdır.
SSMS üzerinde Databases sekmesine sağ tıklayıp Attach denilir.

Gelen ekranda eklenecek mdf dosyamız seçilmesi gerekmektedir. Detach işlemi yapılırken mdf data file dizini bir kenara not edilmesi gerekmektedir.

Gelen ekranda detach edilen data file seçilir.

Mdf dosyasının seçilmesi ile ldf dosyamızın da otomatik geldiği görülmektedir. Ldf dosyamız aşırı derece de büyükse silinir. Default olan lgo dosyası altında oluşmaktadır.

Attach etmeden önce mdf ve ldf dosyamızı mevcutta bulunan konumdan başka bir konuma almak istersek mdf dosyamızda herhangi bir sıkıntı yaşanmaz. Ldf dosyası belirtilen dizin altında bulamadığı için boş bir ldf dosyası oluşturacağını belirtmektedir. Aşağıdaki işlemden hata almamak için ldf dosyamızı siliyoruz. Attach ettikten sonra kendisi default dizin altında yeni log dosyamızı oluşturmuş olacaktır.

USE [master]
GO
CREATE DATABASE [AdventureWorks2017] ON
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\AdventureWorks2017.mdf' )
FOR ATTACH
GO
Başarılı bir şekilde oluşturduktan sonra ilgili mesaj sonuç ekranında dönmektedir.
File activation failure. The physical file name “C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\AdventureWorks2017_log.ldf” may be incorrect.
New log file ‘C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\AdventureWorks2017_log.ldf’ was created.
Log dosyamızı kaybetmemiş olsaydık script’imiz aşağıdaki gibi olmaktadır.
USE [master]
GO
CREATE DATABASE [AdventureWorks2017_2] ON
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\AdventureWorks2017_2.mdf' ),
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\AdventureWorks2017_2_log.ldf' )
FOR ATTACH
GO
Dikkat Edilmesi Gerekenler:
- Attach yapacağınız yeni sunucuda, SQL Server servis hesabının ilgili klasöre (Read/Write) yetkisi olması gerekir.
- Eğer elinizde sadece .mdf varsa, SQL Server yeni bir log dosyası oluşturmaya çalışabilir (ancak bu risklidir ve her zaman çalışmaz).
- Eğer veritabanında full-text catalog varsa, detach/attach sırasında bunlar da taşınmalıdır.
Başka makalede görüşmek dileğiyle..
“Yürüyüşünde ölçülü ol, sesini yükseltme; çünkü seslerin en çirkini eşeğin anırmasıdır.”Lokman-19
