26 Nisan 2012 Perşembe

SQL Server'da Server Collation değiştirme

Dün akşam yine böyle bir iş denk geldi. SQL Server 2008 R2 versiyon, hem de Clustered şekilde kurulmuş bir SQL Server Instance'sının Server Collation'ını değiştirmem istendi.

Bu işlemi gerçekleştirmek için öncelikle SQL Server Setup dosyalarına ihtiyacınız olduğunu unutmayın. Bu dosyaların, SQL Server Instance'ının kurulu olduğu sunucudaki bir diskte olduğundan emin olun. Yani Network'te olmasın, doğrudan sunucu üstünde olsun.

Bu işlemi gerçekleştirmeden önce, sistem veritabanlarındaki her şeyin yedeğini aldım. Login'lerin, Job'ların... Eğer olsaydı, bu veritabanlarındaki oluşturulmuş tablo, SP ve diğer nesnelerin de yedeklerini almam gerekirdi. Tüm bunlardan sonra tabii ki sistem veritabanlarının kendilerinin yedeklerini de almakta fayda var. Ardından, Attach ve Detach Script'leri oluşturulmalı ki, Server Collation değiştirme işleminden önce veritabanları Detach edilmeli ve işlem tamamlandıktan sonra tekrar Attach edilmeli.

Bu işlemleri gerçekleştirmek için aşağıdaki adımları izledim:
- Öncelikle Login'lerin Script'lerini çıkardım. Bunun için sp_helprevlogin kullanılabilir (http://support.microsoft.com/kb/246133 , http://support.microsoft.com/kb/918992)
- Job'ların Script'leri alınır. Bunu pratik bir şekilde yapmak için Object Explorer Details penceresini de kullanabilirsiniz.
- Veritabanlarının Attach Script'lerini oluşturmak için ben veritabanlarının CREATE Script'lerini çıkarıyorum ve CREATE DATABASE ... FOR ATTACH komutunu kullanarak CREATE Script'lerinin sonuna FOR ATTACH komutlarını ekliyorum. Böylece hem aynı dosya yollarını ve hem de özelliklerini korumuş oluyorum. Çünkü böyle durumlarda TRUSTWORTHY veya SSB gibi özelliklerin Attach'ten sonra tekrar etkinleştirilmesi unutulabiliyor.
- Veritabanlarının Detach Script'lerini de çıkardık mı, işlemler genel olarak tamamdır. Eğer ortamınızda Linked Server vb. sunucu düzeyinde nesneler varsa, bunları da hesaba katmanız gerekmektedir. Benim senaryomda bunlar yoktu, ama sizin hesaba katmanız gerekebilir.

Daha sonra, eğer SQL Server Instance'ınız benimki gibi Failover Clustered ise, o zaman Failover Manager'dan SQL Server Resource'unu OFFLINE duruma getirmelisiniz. Ardından da, aşağıdaki gibi bir komutu çalıştırarak sistem veritabanlarını yeniden derlemeyi sağlayabilirsiniz, tabii ki istediğiniz Server Collation ile. Aşağıdaki örnekte de görebileceğiniz üzere SQL Server Instance'ım bir Default Instance. Bu işlemde SQLSYSADMINACCOUNTS parametresi ile "sysadmin" rolünün üyesi olarak birden fazla kişi tanımlayabilirsiniz (çift tırnak içinde ve eğer birden fazla kullanıcı olacaksa aralarında aşağıdaki örnekte olduğu gibi boşluk bırakarak). SAPWD parametresi ile de "sa" şifrenizi değiştirebilir veya yeniden belirleyebilirsiniz. SQLCOLLATION parametresi ile de değiştirmek istediğiniz yeni Server Collation değerini (çift tırnağa gerek kalmadan) girebilirsiniz. Aşağıdaki örnekte de görüleceği üzre, Setup dosyaları "C:\SQLSetup\x64" klasörünün içindeydi. Bu komut, Setup.exe'nin olduğu klasörde Command Prompt'ta çalıştırılmalıdır.

C:\SQLSetup\x64>Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS= "DOMAIN\HESAP1" "DOMAIN\HESAP2" /SAPWD="GucluSAsifrem" /SQLCOLLA TION=SQL_Latin1_General_CP1254_CS_AS

5 yorum:

Ekrem Önsoy dedi ki...

Geçen gün bir SQL Server 2005 Instance'ının Server Collation'ını değiştirmek durumunda kaldım ve bu yazımdaki komut SQL Server 2005'te işe yaramadı, onun yerine şu komutu kullandım ve SQL 2005'te sorunsuz çalıştı. Olur da birilerine gerekirse diye paylaşmak istedim:

start /wait setup.exe /qn INSTANCENAME="MSSQLSERVER" REINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD="Guc1uSASifrem" SQLCOLLATION="SQL_Latin1_General_CP1254_CI_AS"

Ayrıca, SA şifresi olarak da yeterince karmaşık bir şifre vermeniz gerektiğini unutmayın. Aksi takdirde, herhangi bir hata almadan işlem başarısızlıkla tamamlanabilir. Bu da başıma gelmişti. Komut doğru, dene dene olmuyor. Sonra Application Event Log'a bakmak geldi aklıma neyse ki, baktım ki "sa şifreniz yeterince güçlü değil" hata mesajı var. "sa" şifremi yeterince güçlendirince, Server Collation değiştirme komutum başarıyla çalışmıştı. Bilginize.

DatabaseAdmin dedi ki...

Merhaba Ekrem bey;

Öncelikle teşekkür ederiz böyle bir önemli konuda paylaşımınız için..önümüzdeki günlerde ben de, Active\Passive çalışan bir failover cluster sistemi üzerinde sql server collation degişimi yapacağım..Fakat bir kaç konu ile ilgili hala bir kafa karışıklıgı içindeyim..acaba server collation degişimi yapılırken hem Active hem de Passive server üzerinde ayrı ayrı uygulamak mı gerekiyor..yani önce Active node üzerinde rebuild işlemini yaptıktan sonra aynı işlemi passive node üzerindede mi yapmak gerekiyor? Makaleniz de sadece Failover cluster manager den SQL server Resource’unu offline alarak işlemi yapmışsınız..yani bu işlemi sadece sql server cluster’ın virtual name üzerinde yapmak yeterli midir?

Ekrem Önsoy dedi ki...

Failover Clustering için SQL Server Binary'leri iki düğüme de yükleniyor, fakat sistem veritabanları aynen kullanıcı veritabanları gibi Cluster'daki paylaşımlı disklerde barındırılıyor. Yani her bir "aktif" Clustered SQL Server Instance'ı için bu işlemi bir kere yapman kafi, pasif makinede böyle bir şey yapmana gerek yok.

Bununla birlikte, böyle işlemlerden sonra muhakkak Failover & Failback testlerini yapmalı ve her şeyin yolunda gittiğinden emin olmalısın.

DatabaseAdmin dedi ki...



Teşekkür ederim Ekrem bey..dediginiz gibi bu işlemi sadece Active node üzerinde yapmak yeterli olacaktır..Active node üzerinde çalışırken sadece resorculeri offline almak yeterli midir?son olarak çalıştırılacak rebuilt kod parametresinde zannediyorum üzerinde çalıştıgımız Active nod un ismini ya da virtual server in ismini yazmıyoruz sadece instance name I yazmamız yeterli..

Ayrıca normal de detach/attach işlemini management studio dan gui kullanarak yapıyorum..ama siz detach/attach scriplerini oluşturdugunuzu söylemişsiniz..bunu nasıl yapabiliriz?

Ekrem Önsoy dedi ki...

Sondan başlayayım, SSMS'teki Databases düğümünün altından ilgili veritabanının üstünde farenin sağ tuşuna tıklayarak Script oluşturma işlemini yapabilirsin. Daha sonra bu Script'e FOR ATTACH parametresini eklemeyi unutma. Tam yazım şekli için Books Online'a bakabilirsin.

Evet Resource'ları Offline hale getir, ama sonra muhakkak Services.msc'den (veya SQL Server Configuration Manager'dan) de kontrol et servislerin durumlarını.