SQL SERVER DATABASE FILE LARINI VE TEMPDB FILE LARINI TAŞIMA OPERASYONU Yusuf KAHVECİ Database Administrator @2013 www.sqlturkiye.com info@sqlturkiye.com! TÜRKIYE NIN İLK SQL PLATFORMU SQLTURKIYE.COM ÇOK YAKINDA PROFESYONEL EKIBIYLE BILGI PAYLAŞIMINA BAŞLAYACAKTIR www.sqlturkiye.com 1
Merhaba Sevgili Arkadaşlar, YUSUF KAHVECİ KİMDİR? Kendimden fazla söz etmeyi sevmediğim için kısa tutacağım. 1987 yılında İstanbul doğumluyum. Bilgisayar Mühendisliği ve İktisat mezunuyum. İş hayatına Eğitimci olarak başladım ve senelerdir Senior DBA olarak devam etmekteyim. Uzmanlık alanlarım MS SQL Server ve Oracle dır.bir çok firmada MS SQL Server ve Oracle Veritabanı Yöneticiliği yaptım. Şu anda özel bir firmada SQL SERVER Senior Database Administrator olarak görevime devam etmekteyim. Bana ulaşabileceğiniz bilgiler E- Book içerisinde mevcuttur. Kişisel Web Adresimden ve mail adreslerimden bana ulaşabilirsiniz. Kurucusu olduğum SQL TÜRKİYE Platformum üzerinden istek ve öneilerinizi iletebilir görüşlerinizi paylaşabilirsiniz. Platformumuzun temel amacı Türkçe kaynağım az olduğu bu dönemde SQL SERVER Yönetimi, BI,DWH,PDW vb. Teknolojilerin sizlere aktarılması ve size yardımcı olacak ve profesyonel ekibimiz ile sizlere sunacağımız bilgi kaynaklarından faydalanabilir ve sizlerde bu bilgi kaynağına katkıda bulunabilirsiniz. Saygılarımla 2
İÇİNDEKİLER 1. SSMS ile DETACH ve ATTACH Operasyonu.. 5 2. T-SQL ile DETACH ATTACH Operasyonu.. 11 3. OFFLINE ile ONLINE Operasyonu.. 13 4. TEMPDB yi Farklı Diske Nasıl Taşırız?.. 16 3
DB FILE LARINI FARKLI LOKASYONA TAŞIMA OPERASYONU SQL Server üzerinde açılmış olan veritabanlarının bazı nedenlerden dolayı kısa bir süre içerisinde başka bir yere taşınması gerekir örnek olarak SQL Server ın çalıştırılacağı yeni bir sunucu alınmıştır ve eski sunucu üzerinde bulunan veritabanları yeni sunucuya taşınmalıdır. Bir başka örnek vermek gerekirse sunucu performansının arttırılması için veritabanı dosyası (.mdf) ile log dosyası (.ldf) ayrı diskler üzerinde çalıştırılması önerilmektedir. SQL Server yönetiminde bu işlemleri yapmamızda bize yardımcı olacak taşıma yöntemlerimizden ; DETACH ATTACH Yöntemi OFFLINE ONLINE Yöntemi BACKUP RESTORE Yöntemi Yukarıda bahsettiğim yöntemleri e-kitabımız içerisinde sizlere detayları ve adım adım nasıl yapıldığını aktarıyor olacağım. 4
I. SSMS ile DETACH ATTACH OPERASYONU Detach, SQL Server üzerinde kullanmadığımız veritabanlarını kaynak tüketimini azaltmak adına silmeden, mdf ve ldf dosyalarını korumak kaydıyla Sql Server üzerinden kopartmak için kullandığımız yöntemdir. Bunun gibi bir çok amaç için bu yöntemi kullanabiliriz. Peki bu yöntemi nasıl ve ne şekilde kullanabiliriz? Detach işlemine başlamadan önce Database imizin File ları hangi diskte ve folder da tutulduğuna bakalım ilk önce; Database imizin üzerine gelip sağ tıklayıp Proparties sekmesine tıklıyoruz. (Şekil-1) (Şekil-1) Daha sonra karşımıza gelen Şekil-2 de ki ekranda Files sekmesinden Path kısmında Database File larımzın lokasyonlarını görebiliriz. 5
Şekil-2 Bu işlemlerden sonra ; ilk önce Detach edeceğimiz Database in üzerine gelip sağ tıklayıp çıkan pencerede Task sekmesine gelip oradan Detach sekmesine (Şekil 3) tıklıyoruz. Şekil 3 Detach sekmesine tıkladıktan sonra Şekil-4 de ki gibi ekran karşımıza gelmektedir. 6
Şekil-4 Bu ekranda DB üzerinde yer alan Connection ları kopartıp işlemlerimizi gerçekleştirebiliyoruz. O yüzden ben Detach yapmadan önce Drop Connection kutucuğunu işaretleyip OK butonuna basıyorum. Gördüğünüz üzere bu işlem sonucunda Database imiz Databases sekmesinin altında yer almıyor. Yani Detach işlemimizi sağlıklı bir şekilde gerçekleştirmiş olduk. Şimdi ise Data File larımızı bulunduğu noktadan başka bir noktaya taşıyabiliriz. Taşıma işlemimi ben C:\MSSQLTransfer adlı folder ın içerisine gerçekleştirdim. Bu adımdan sonra File larını taşıdığım DB mi sisteme Attach etmem gerekmektedir. Attach işlemi için SSMS üzerinde Databases sekmesi üzerine gelip sağ tıklayarak açılan pencerede Şekil-6 da ki gibi Attach sekmesine tıklıyoruz. 7
Şekil-6 Bu işlemden sonra karşımıza Şekil-7 de ki ekran gelmektedir. Bu ekranda Add butonuna tıklıyoruz. Şekil-7 Add butonuna tıkladıktan sonra Şekil-8 de ki ekran karşımıza çıkmaktadır.locate Database Files olarak adlandırılan bu ekranda Database imizi taşıdığımız yeni lokasyondan File ını seçip OK butonuna basıyoruz. 8
Şekil-8 Bu işlemlerden sonra Şekil-9 da yer alan ekran ile karşılaşmaktayız. Şekil-9 9
Şekil-9 da dikkat edecek olursak Current File Path olarak artık yeni lokasyonumuz olarak gözükmektedir. Daha sonra OK butonuna basıyoruz ve Attach işlemimizi sonlandırıyoruz. Şekil-10 da gördüğünüz üzere Database imiz sağlıklı bir şekilde Attach edilmiştir. Şekil-10 Şimdi SSMS konsolunu kullanarak gerçekleştirdiğimiz tüm bu işlemleri T-SQL Scriptleri ile nasıl yapıyoruz onu görelim. 10
II. T-SQL ile DETACH ATTACH OPERASYONU Detach işlemi çin : USE [master] ALTER DATABASE [DetachAttachSQLTURKIYE] SET SINGLE_USER WITH ROLLBACK IMMEDIATE USE [master] EXEC master.dbo.sp_detach_db @dbname = N'DetachAttachSQLTURKIYE' Yukarıda ki script ile sağlıklı bir şekilde Detach işlemini gerçekleştirebiliyoruz. Scriptimizi inceleyecek olursak. ALTER DATABASE [DetachAttachSQLTURKIYE] SET SINGLE_USER WITH ROLLBACK IMMEDIATE İlk önce Database imiz SINGLE USER Moda çekilmiş. SINGLE USER MOD : Aynı anda tek bir kullanıcının erişebileceği anlamına gelir. Bu herhangi bir kullanıcı olabilir. İlk önce kim giriş yaparsa oturumu o almış olur. Bu kullanıcı bağlantısı bitmeden başka kullanıcı o veritabanına erişemez. Bu seçeneği genellikle sistem yöneticisi kendi oturumunda kritik bir işlem yapacağında tercih eder. Biz bu şekilde veritabanının erişim modunu değiştirmeye çalışırken o veritabanında çalışan kullanıcılar olabilir. Komutumuzun kullanıcıların bekleyip beklemeyeceklerini belirtmek için yukarıdaki ifadelerin arkasına WITH ROLLBACK IMMEDIATE veya WITH NO_WAIT deyimleri kullanılır. WITH NO_WAIT seçeneğinde eğer komutumuz bloke edilirse yani veritabanı üzerinde açık transaction veya aktif kullanıcı varsa işlem başarısız olup aşağıdaki hatayı verecektir. Msg 5070, Level 16, State 2, Line 1 Database state cannot be changed while other users are using the database DetachAttachSQLTURKIYE Msg 5069, Level 16, State 1, Line 1 ALTER DATABASE statement failed. WITH ROLLBACK IMMEDIATE seçeneğinde kullanıcıların işlerini bitirmeleri beklenmez. Sorguları rollback edilip oturumları sonlandırılır. Biz scriptimiz de WITH ROLLBACK IMMEDIATE seçeneğini kullanarak Database imizi Single User Mod a çekip tüm transactionları rollback yaptık. Daha sonra ise sp_detach_db adlı sistem detach prosedürünü kullanarak database imizi detach yaptık. Detach ettiğimiz Database imizi bulunduğu diskten başka bir diske kopyalayıp Database imizi Attach etmemiz gerekmektedir. Taşıma işlemini.mdf File ını K:\MSSQL2012\DATA,.ldf File ını K:\MSSQL2012\LOG belirttiğim Diskteki Folder ın içerisine gerçekleştirdikten sonra Attach işlemimiz için aşağıda ki scriptleri kullanıyorum. 11
Script I : USE [master] CREATE DATABASE [DetachAttachSQLTURKIYE] ON ( FILENAME = N'K:\MSSQL2012\DATA\DetachAttachSQLTURKIYE.mdf' ), ( FILENAME = N'K:\MSSQL2012\LOG\DetachAttachSQLTURKIYE_log.ldf' ) FOR ATTACH Script II : EXEC sp_attach_db @dbname = N'DetachAttachSQLTURKIYE', @filename1 = N'K:\MSSQL2012\DATA\DetachAttachSQLTURKIYE.mdf', @filename2 = N'K:\MSSQL2012\LOG\DetachAttachSQLTURKIYE_log.ldf'; Yukarıda verdiğim Script-I ve Script-II yi inceleyecek olursak I.Script imizde Database oluşturma komutu ile başlayıp CREATE DATABASE File larımızı göstererek FOR ATTACH diyerek Database imizi ATTACH edebiliyoruz. II.Scriptte ise sp_attach_db Attach sistem prosedürünü kullanarak Attach işlemimizi gerçekleştirebiliyoruz. Konuyu özetleyecek olursak Detach ve Attach yöntemini kullanarak Database lerimizin lokasyonlarını değiştirebiliriz. 12
III. OFFLINE ve ONLINE OPERASYONU SQL Server Managament Studio Konsolunu kullanarak Database lerimizi OFFLINE a çekip taşıma işleminide gerçekleştirdikten sonra ONLINE a çekerek operasyonumuzu tamamlayabiliriz. Database lerimizi OFFLINE a çekmek için SSMS üzerinde Database imizin üzerine gelip sağ tıklayıp (Şekil-11) Task sekmesinden Take Offline sekmesine tıklayarak Database imizi Offline a çekebiliriz. Şekil-11 Şekil-12 de görüldüğü üzere Database imiz sağlıklı bir şekilde Offline a çekilmiştir. Şekil-11 Offline a çekilen Database in görüntüsü aşağıda yer almaktadır.(şekil-13) 13
Şekil-13 Peki bu işlemi T-SQL scriptleri ile nasıl gerçekleştirbiliriz? ALTER DATABASE DetachAttachSQLTURKIYE SET OFFLINE Yukarıda ki script ile Database imizi aynı SSMS üzerinde yaptığımız gibi OFFLINE a çekebiliriz. Bu işlemden sonra Database imizin File larının bulunduğu Folder a giderek taşıyacağımız hedef diskine taşıma işlemi gerçekleştiriyoruz. Bildiğiniz üzere DB File larımız şu anda mdf File I K:\MSSQL2012\DATA,.ldf File ı K:\MSSQL2012\LOG lokasyonlarında durmaktadır. Biz ise File ları C:\MSSQLTransfer folder ına taşıyıp Database imizi ONLINE a çekeceğiz. Hedef disklere File ları taşıma işleminden sonra sıra geldi Database imizin o File ları görmesine ; USE master ALTER DATABASE [DetachAttachSQLTURKIYE] MODIFY FILE (NAME = 'DetachAttachSQLTURKIYE', FILENAME = 'C:\MSSQLTransfer\DetachAttachSQLTURKIYE.mdf') ALTER DATABASE [DetachAttachSQLTURKIYE] MODIFY FILE (NAME = 'DetachAttachSQLTURKIYE_log', FILENAME = 'C:\MSSQLTransfer\DetachAttachSQLTURKIYE_log.ldf') Yukarıda ki script i incelediğimizde file path lerin yeni path ler olarak modify edildiğini görmekteyiz. Bu şekilde script imizi EXECUTE ettiğimizde Database imiz yeni File larını tanımaktadır. EXECCUTE işleminden sonra Messages te ; The file "DetachAttachSQLTURKIYE" has been modified in the system catalog. The new path will be used the next time the database is started. The file "DetachAttachSQLTURKIYE_log" has been modified in the system catalog. The new path will be used the next time the database is started. gerekmektedir. SSMS üzerinde Database imizi ONLINE a çekme işlemi ; İlk önce OFFLINE olan DB mizin üzerine gidip sağ tıklarız ve Task sekmesinden Bring Online sekmesine tıklayarak (Şekil-13) Database imizi ONLINE a çekmiş oluruz. 14
Şekil-13 Şekil-14 te de görüldüğü üzere ONLINE operasyonumuz sağlıklı bir şekilde gerçekleşmiştir. Peki biz bu ONLINE işlemini T-SQL Script I yazarak nasıl gerçekleştiririz. Şekil-14 ALTER DATABASE DetachAttachSQLTURKIYE SET ONLINE Yukarıda ki script i kullanarak da Database imizi ONLINE a çekebiliriz. Konumuzu özetleyecek olursak DB taşıma operasyonumuzu Database lerimizi OFFLINE-ONLINE yaparak taşıyabiliriz. 15
IV. TEMP DB yi Farklı Disk e Nasıl Taşırız? Yukarıda normal Database lerimizi taşıma yöntemlerini gördük fakat TEMPDB yi yukarıda anlattığımız yöntemler ile taşıyamayız. Peki TempDB yi nasıl taşırız. Çoğu DBA taşıma operasyonlarında TEMPDB yi taşımaktan hep çekinmiştir. Aşağıda size bunu nasıl yapılacağını adım adım anlatacağım. İlk önce TEMPDB min lokasyonlarına bakacağım. Bunun için ; Databases altında bulunan System Databases ın altında tempdb Database inin üzerine gelip sağ tıklıyorum ve Proparties sekmesine tıklıyorum. Şekil-15 Bu işlemden sonra Şekil-16 da ki ekran karşımıza gelmektedir. Bu ekranda gördüğünüz üzere TempDB File larımızın nerede tutulduğunu görmekteyiz. 16
Şekil-16 Bizim amacımız farklı bir Disk e taşımak olsun. Bunu gerçekleştirmek için aşağıda ki script i çalıştırıyorusnuz. USE master ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'C:\MSSQL2012\TEMP\tempdb.mdf') ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev2, FILENAME = 'C:\MSSQL2012\TEMP\tempdb1.ndf') ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev3, FILENAME = 'C:\MSSQL2012\TEMP\tempdb2.ndf') ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev4, FILENAME = 'C:\MSSQL2012\TEMP\tmpdb3.ndf') ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev5, FILENAME = 'C:\MSSQL2012\TEMP\tempdb4.ndf') ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev6, FILENAME = 'C:\MSSQL2012\TEMP\tempdb5.ndf') ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev7, FILENAME = 'K:\MSSQL2012\TEMP\tempdb6.ndf') ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev8, FILENAME = 'C:\MSSQL2012\TEMP\tempdb7.ndf') ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'C:\MSSQL2012\TEMP\templog.ldf') Yukarıda ki script benim TempDB File yapıma uygun yazılmıştır. Sizde kendi TempDB File larınıza göre Modify etmeniz gerekmektedir. Script i açıklayacak olursak ; NAME : Logical name inizi yazıyorusnuz. FILENAME : Bu kısıma ise taşıyacağınız lokasyonun path ini yazıp File larınızı belirtiyorusnuz. Yukarıda ki scriptimizi EXECUTE ettikten sonra Messages kısmına ; The file "tempdev" has been modified in the system catalog. The new path will be used the next time the database is started. The file "tempdev2" has been modified in the system catalog. The new path will be used the next time the database is started. The file "tempdev3" has been modified in the system catalog. The new path will be used the next time the database is started. The file "tempdev4" has been modified in the system catalog. The new path will be used the next time the database is started. The file "tempdev5" has been modified in the system catalog. The new path will be used the next time the database is started. The file "tempdev6" has been modified in the system catalog. The new path will be used the next time the database is started. The file "tempdev7" has been modified in the system catalog. The new path will be used the next time the database is started. The file "tempdev8" has been modified in the system catalog. The new path will be used the next time the database is started. The file "templog" has been modified in the system catalog. The new path will be used the next time the database is started. Bu işlemden sonra SQL Server sevisimizi Restart ettiğimizde TempDB lerimiz yeni lokasyonlarına taşınmış olmaktadır. 17
Konumuzu özetleyecek olursak ; TempDB yi normal Database taşıma operasyonları gibi taşıyamacağımızı ve taşıma yöntemimizi bu konuda görmüş bulunmaktayız. 18
19