Recent comments

None


İçerik Ara











Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2013
Takvim
<<  Aralık 2017  >>
PaSaÇaPeCuCuPa
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
Keywords

SQL Server Management Studio üzerinden bir database’in özelliklerine girmek istediğinizde aşağıdaki gibi bir hata ile karşılaşabilirsiniz.

[more]

clip_image001

Cannot show requested dialog
Property Owner is not available for Database '[coda]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights. (Microsoft.SqlServer.Smo)
For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=9.00.1399.00&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.

Bu hatanın sebebi database’in owner’ının geçerli bir user olmamasıdır.

Database’in owner’ini aşağıdaki kod vasıtası ile değiştirerek hatadan kurtulabilirsiniz.

USE DBName
EXEC sp_changedbowner 'sa'
Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


2008 sunucularımıza SP2 geçiş projesinde cluster ortamlarımızdan birine SP2 geçerken bir hata ile karşılaştık. Servisin tekrar online olmasını engelleyen bu hata neredeyse bizi cluster kurulumunu tekrar yapmaya götürüyordu ki…

[more]

Tek node cluster yapıdaki sunucumuza yaptığımız SP2 upgrade’i sorunsuz bir şekilde tamamlandı. Setup ekranında herhangi bir hata almadan upgrade sonlandı.

Fakat ilgili resource group online olurken sürekli hata alıp tekrar offline duruma geliyordu. Event viewer’ı incelediğimizde şu hata mesajları ile karşılaştık.

Script level upgrade for database 'master' failed because upgrade step 'sqlagent100_msdb_upgrade.sql' encountered error 598, state 1, severity 25. This is a serious error condition which might interfere with regular operation and the database will be taken offline. If the error happened during upgrade of the 'master' database, it will prevent the entire SQL Server instance from starting. Examine the previous errorlog entries for errors, take the appropriate corrective actions and re-start the database so that the script upgrade steps run to completion.

Cannot recover the master database. SQL Server is unable to run. Restore master from a full backup, repair it, or rebuild it. For more information about how to rebuild the master database, see SQL Server Books Online.

Görünen o ki, her ne kadar setup başarılı bir şekilde tamamlandığını söylese de SP geçişinde bir sıkıntı oluşmuş ve sqlagent100_msdb_upgrade.sql script’i tamamlanmadığı için SP geçişi yarım kalmıştı. Bu yüzden de servis açılamamaktaydı.

İlk aklımıza gelen, sistemi upgrade’i başlamadan önceki haline çekmek amacıyla SP2 kurulumunu uninstall yapmak oldu. Fakat uninstall işlemi de SP geçişi tamamlanmadığı için başarılı bir şekilde bitemedi.

Daha önce başka bir sunucumuzda bu problem ile karşılaşmış ve MS’e açtığımız case ile cluster kurulumunun tekrar yapılması önerisi gelmişti. Bu problemde de cluster kurulumunu tekrar yapacakken aklımıza şöyle bir şey denemek geldi.

Hata alan script sqlagent100_msdb_upgrade.sql scripti idi. Ama hata mesajını tam olarak göremiyorduk. Bir şekilde bu script’i çalıştırabilirsek hata mesajını açık bir şekilde görebileceğimizi düşündük.

İlk aklımıza gelen normal bir şekilde açılmayan servisi single user mode ile açmak oldu. –m parametresi ile servisi açmaya çalıştığımızda yukarıdaki “recover the master database” hata mesajı ile tekrar karşılaştık.

Daha sonra aklımıza 902 Trace Flag’i geldi. Undocumented olan bu trace flag system database’lerindeki hataları göz ardı edip servisi açmaya yaramakta.

Servisi command promptan 902 trace flag’i ile çalıştırdığımızda online oldu. Şimdi geriye script’i çalıştırmak kaldı.

sqlagent100_msdb_upgrade.sql script’ini osql ile command promptan çalıştırıp sonucu –o parametresi ile bir text dokümanı attık. Script hatalı bittiğinde txt dokümanda gördüğümüz hata mesajı şu şekilde idi.

Msg 5184, Level 16, State 2, Server SPRECBDB01, Line 103
Cannot use file 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\temp_MS_AgentSigningCertificate_database.mdf' for clustered server. Only formatted files on which the cluster resource of the server has a dependency can be used. Either the disk resource containing the file is not present in the cluster group or the cluster resource of the Sql Server does not have a dependency on it.

SP geçişlerinde setup.exe geçici bir veritabanı oluşturmakta. Hata mesajının detayına baktığımızda da bu geçici veritabanı C:\ altındaki bir klasöre oluşturulmaya çalışılmakta ve C:\ klasörü, sql server servisinin dependency listesinde olmadığından dolayı da hata alınmakta.

Peki ama bu temporary veritabanı niye C:\ klasörüne oluşturulmaya çalışılıyor?

Üzerinde çalıştığımız cluster ortamı daha önce de söylediğim gibi tek node’lu bir cluster ortamı. Tek node’lu olduğundan dolayı yani failover yapılmayacağından dolayı biz bu ortamı kurarken system database’lerini C:\ folder’ı altına create etmiştik. Normalde bildiğiniz gibi cluster ortamlarda system database’leri shared disk’lerden birinin içinde bulunmalı ki failover yapıldığında servis çalışabilsin.

Yani sonuç olarak bizim bu cluster ortamımızda master veritabanı C:\ folder’ında bulunmaktaydı. Yukarıda bahsettiğim geçici veritabanı da master veritabanının olduğu yerde oluşturulmaya çalışıldığı ve bu folder’da servisin dependency listesinde bulunmadığından dolayı hata alınmaktaydı.

Burada şu soru aklınıza gelebilir. “Hiç cluster’ın system database’leri C diskinde olur mu yahu?”.

Ortam tek node olduğu ve failover ihtiyacı olmadığı için neden olmasın? Ayriyeten eğer olmaması gerekiyorsa kuruluma da izin verilmemesi gerekiyor. Yani bu soruyu bir cevap olarak kabul etmiyorum Smile

Bu sorunun master database’inin C:\ diskinde olmasından kaynaklandığını farkettikten sonra master database’i dependency disklerden birine taşıyıp servisi tekrar çalıştırdık ve güncellenme işlemleri tamamlanarak servis sorunsuz bir şekilde çalıştı.

Aklımıza gelen bu çözümle en az 4-5 saat sürecek reinstallation’dan kurtulmuş olduk.

Şimdi bu durumu MS Connect’e bug kaydı olarak açacağım. En azından bu durumun SP kurulumu yapılırken check edilmesini ve uyarı verilerek kurulumun engellenmesi gerektiğini bildireceğim. Bakalım cevapları ne olacak?

Daha önce bu tarz bir bug kaydımı ByDesign diyerek reddetmişlerdi. Ama bu sefer bu kadar kolay olmayacak Smile

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server’da master,model ve tempdb database’lerinin owner’ı değiştirilmeye çalışılırsa aşağıdaki gibi bir hata alınabilir.

[more]

image

Cannot change the owner of the master, model, tempdb or distribution database.
(Microsoft SQL Server, Error: 15109)

master,model ve tempdb database’lerinin owner’ları SSMS’ten ya da aşağıdaki T-SQL kodu ile değiştirilemez.

use model
EXEC dbo.sp_changedbowner @loginame = N'sa'

 

Bu değişikliği yapmak için detach-attach ya da backup-restore yöntemlerinin kullanılması gerekir.

System Database’lerin de detach-attach ve backup-restore yöntemlerinin nasıl kullanıldığı ile alakalı aşağıdaki makalelerimi okumanızı tavsiye ederim.

SQL Server da Master DB Database File larını Taşımak

SQL Server – master database backup – restore

SQL Server 2008 – Model ve MSDB Database lerinin Taşınması

SQL Server da TempDB Database File larını Taşımak

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Geçenlerde bir cluster ortamımıza SP2 upgrade geçerken karşımıza çıkan hata mesajından sonra tüm system database’lerinin owner’larını sa yapmaya karar verdik. Bu makalede üzerinde duracağımız sorgu ile owner’ı sa olmayan system database’lerini nasıl sorgulayabileceğimizi göreceğiz.

[more]

SP2 upgrade’in de karşımıza çıkan hata şu şekilde idi;

The database owner SID recorded in the master database differs from the database owner SID recorded in database 'msdb'. You should correct this situation by resetting the owner of database 'msdb' using the ALTER AUTHORIZATION statement.'

Hatanın sebebi master DB’si ile msdb DB’sinin owner’larının aynı olmaması. Bunun da nedeni daha önce msdb’i backup restore yapmış olmamız. Servisi single user modda açtıktan sonra msdb’nin owner’ı değiştirdik ve hatadan kurtulduk.

Bu hata ile karşılaştıktan sonra bütün ortamlarımızda owner’ı sa olmayan system database’lerini sorgulamaya karar verdik.

Aşağıdaki script’i SQL Server 2008 Registered Server üzerinden bütün SQL Server’larımızda uygulayarak çok kısa sürede sorgu sonucunu alabildik.

select dbid,name,sid,SUSER_SNAME(sid)
from sysdatabases d
where SUSER_SNAME(sid)<>'sa'
	and d.dbid<=4

 

Belki bir gün sizin de böyle bir şeye ihtiyacınız olur.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server’da sistemin nasıl çalıştığını kontrol etmek için bakacağımız belkide ilk yer SQL Server Error Log’larıdır. SQL Server ve Agent Error Log’ları sayesinde sistemde herhangi bir ciddi problem olup olmadığını kontrol etmemiz mümkündür.

Bugünkü yazımda SQL Server Error Log’ların sayısının nasıl arttırılacağını, yeni bir error log dosyasının nasıl create edilebileceğini, kısacası SQL Server’da Error Log’lar ile çalışırken hangi best practice’leri uygulamamız gerektiğinden bahsedeceğim.

[more]

Bu makalemde şu ana başlıklar üzerinde duracağız.

  • SQL Server’da Error Log’lar ile Çalışmak
  • Database Engine Error Log’ları
    • Database Engine Error Log’ları Hakkında Genel Bilgilendirme
    • Database Engine Error Log Recycle’ı Elle Tetiklemek (master.sys.sp_cycle_errorlog)
    • Database Engine Error Log’larının Sayısını Arttırmak
    • Database Engine Error Log’ları Okumak İçin Özelleştirilmiş Log Arama SP’si
    • Başarılı Backup İşlemi Log’larının Error Log’a Yazılmasını Engellemek
  • SQL Server Agent Error Log’ları
    • SQL Server Agent Error Log’ları Hakkında Genel Bilgilendirme
    • SQL Server Egent Error Log Recycle’ı Elle Tetiklemek (msdb.sys.sp_cycle_agent_errorlog)
  • Error Log Recycle İşlemini SQL Job ile Tetiklemek

SQL Server ve Agent Error Log’lar eğer değişiklik yapılmadıysa şu tarz bir folder’da bulunur.

C:\Program Files\Microsoft SQL Server\MSSQL10.S10ENT\MSSQL\Log

Bu folder’da bulunan ERRORLOG isimli dosyalar Database Engine’in Error Log’ları, SQLAGENT şeklinde başlayan dosyalar ise SQL Server Agent’ın Error Log’larıdır.

Database Engine Error Log’ları

SQL Server Database Engine için default olarak 1 adet aktif (ERRORLOG) ve 6 adet arşiv (ERRORLOG.1’den ERRORLOG.6’ya kadar olan dosyalar) olmak üzere 7 adet error log dosyası bulunmaktadır. Her SQL Server servisi restart olduğunda aktif olan log ERRORLOG.1 haline dönüşür ve ondan sonraki error log’lar da bir sıra kayar. Ve sondaki error log’da silinir. (Bu işleme recycle denilmektedir.)

Recycle işlemini şu şekilde gösterebiliriz.

el1

Recycle işleminin servis restart’ı ile olduğunu söylemiştik. Bu işlemi elle tetiklemekte mümkündür. Bir sonraki bölümde bu işlemin nasıl yapılabileceğine değiniyor olacağım.

Database Engine Error Log Recycle’ı Elle Tetiklemek (master.sys.sp_cycle_errorlog)

SQL Server Database Engine servisi restart olduğunda yeni bir error log dosyası oluşur ve en sondaki error log dosyası silinir demiştik. Bu işleme de Recycle dendiğini belirtmiştik. Detayları bir önceki bölümde inceleyebilirsiniz.

SQL Server servisinin uzun süre ayakta olduğu ya da bir hatadan dolayı çok fazla error basıldığı durumda aktif ErrorLog dosyası şişmeye başlar ve büyük bir boyuta erişir. Böyle bir durumda bu errorlog dosyasının içeriğine bakmak oldukça güç hale gelir.

İşte böyle bir durumda 0’dan yeni bir error log dosyası oluşturmak için servisi restart etmektense recycle işlemini elle tetiklememiz mümkündür.

Aşağıdaki SP execute edildiğinde aktif olan errorlog dosyası ERRORLOG.1 haline dönüşecek ve yeni bir error log dosyası 0’dan oluşturulacaktır.

EXEC master.sys.sp_cycle_errorlog;

 

Database Engine Error Log’larının Sayısını Arttırmak

Bir önceki bölümde anlattığım gibi servis restart olduğunda ya da recycle işlemi elle tetiklendiği zaman yeni bir error log dosyası oluşturulur ve en sondaki error log dosyasıda silinir. Yani default olarak 1 aktif 6 da arşiv olmak üzere 7 error log dosyasına izin verilir.

Error Log’lar sistemi analiz etmek için etkin yöntemlerden biri olduğu için eski error log dosyalarının hemen silinmesini istemeyebiliriz. Bu durumda saklanacak error log dosyası parametresini değiştirmemiz gerekir.

Bu değişikliği Management Studio üzerinden şu şekilde yapabiliriz.

  1. Management >> SQL Server Logs yazısına sağ tıklayıp configure ekranını açıyoruz. 

    el2
  2. Gelen ekranda kaç adet error log’un arşiv olarak saklanmasını istediğimizi belirtip OK’e basıyoruz. 

    el3

Database Engine Error Log’ları Okumak İçin Özelleştirilmiş Log Arama SP’si

SQL Server Log’larını okurken filter özelliği kullanabilmekteyiz. Ama bu filter özelliği sadece “like” yani “içinde geçen” şeklinde çalışmaktadır. Ve ne yazık ki “not like” yani “içinde geçmeyen” şeklinde bir filter verememekteyiz. Peki ne zaman ihtiyacımız olur not like aramasına. Örneğin başarılı backup işlemleri loglandığında ve çok sık aralıklarla TLog backup’ı aldığımızda log dosyası çok fazla sayıda backup bilgisi ile dolmaktadır. Ve biz bu backup loglarını exclude ederek raporu görüntülemek isteyebiliriz.

İşte bu amaçla yazmış olduğum SP’yi anlattığım makaleme buradan erişebilirsiniz.

Başarılı Backup İşlemi Log’larının Error Log’a Yazılmasını Engellemek

SQL Server da başarılı olan her backup işlemi bildiğiniz gibi SQL Server Log’a yazılmaktadır. TLog backup kullanımınız var ise ve çok sıklıkla backup alıyorsanız SQL Server Log a çok fazla sayıda kayıt yazılacaktır ve bu da log’un okunmasını zorlaştıracaktır. Şu linkten erişebileceğiniz makalemde başarılı backup işlemlerinin SQL Server Log’a yazılmasını nasıl engelleyeceğimizi görebilirsiniz.

SQL Server Agent Error Log’ları

SQL Server Agent Error Log’ları da Database Engine Error Log’ların da olduğu gibi servis restart olduğunda recycle olur. Tabi burada bahsettiğimiz servis database engine servisi değil SQL Server Agent servisidir.

Bir diğer farklılık ise Database Engine log’ları default olarak 1+6 log file’dan oluşmakta ve bu rakamda değişiklik yapılabilmekteyken SQL Agent Error Log’ları 1+9 log file’dan oluşmakta ve bu rakamlarda değişiklik yapılamamaktadır. Aktif olan SQL Agent Error Log’un dosya adı SQLAGENT.OUT, arşiv olan log file’ların adları ise SQLAGENT.x şeklindedir.

SQL Server Agent Error Log Recycle’ı Elle Tetiklemek (master.sys.sp_cycle_agent_errorlog)

SQL Server Agent Error Log recycle işlemini hem SSMS’ten hem de TSQL ile yapmamız mümkündür.

Management Studio’dan recycle işlemini yapmak için SQL Server Agent >> Error Logs yazısına sağ tıklayıp açılan ekrandan Recycle yazısını tıklamamız gerekir.

el4

Aynı işlemi TSQL ile şu şekilde yapabiliriz.

EXEC msdb.dbo.sp_cycle_agent_errorlog;

 

Error Log Recycle İşlemini SQL Job ile Tetiklemek

Error Log’ları servisler restart olduğunda recycle olur aynı zamanda elle tetiklememizde mümkündür diye belirtmiştik.

Şimdi bu işlemi otomatize etmek için bir SQL Server Job hazırlayacağız ve her ayın başında çalışan bu job vasıtasıyla hem database engine hem SQL Server Agent log’larını otomatik olarak recycle edeceğiz.

Bu şekilde otomatik olarak error log’ların boyutlarını kontrol altında tutmuş olacağız.

Bahsi geçen Job’ın script’ine aşağıda erişebilirsiniz.

USE [msdb]
GO
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Error Log Recycle', 
		@enabled=1, 
		@notify_level_eventlog=0, 
		@notify_level_email=0, 
		@notify_level_netsend=0, 
		@notify_level_page=0, 
		@delete_level=0, 
		@description=N'No description available.', 
		@category_name=N'Database Maintenance', 
		@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Database Engine Log Recycle', 
		@step_id=1, 
		@cmdexec_success_code=0, 
		@on_success_action=3, 
		@on_success_step_id=0, 
		@on_fail_action=2, 
		@on_fail_step_id=0, 
		@retry_attempts=0, 
		@retry_interval=0, 
		@os_run_priority=0, @subsystem=N'TSQL', 
		@command=N'EXEC master.sys.sp_cycle_errorlog;', 
		@database_name=N'master', 
		@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'SQL Server Agent Log Recycle', 
		@step_id=2, 
		@cmdexec_success_code=0, 
		@on_success_action=1, 
		@on_success_step_id=0, 
		@on_fail_action=2, 
		@on_fail_step_id=0, 
		@retry_attempts=0, 
		@retry_interval=0, 
		@os_run_priority=0, @subsystem=N'TSQL', 
		@command=N'EXEC msdb.dbo.sp_cycle_agent_errorlog;', 
		@database_name=N'msdb', 
		@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Every Month', 
		@enabled=1, 
		@freq_type=16, 
		@freq_interval=1, 
		@freq_subday_type=1, 
		@freq_subday_interval=0, 
		@freq_relative_interval=0, 
		@freq_recurrence_factor=1, 
		@active_start_date=20110419, 
		@active_end_date=99991231, 
		@active_start_time=0, 
		@active_end_time=235959, 
		@schedule_uid=N'f631ead7-612f-4536-bd65-15aa1f75179a'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

GO

 

SQL Server’da sistemin nasıl çalıştığını kontrol etmek için Error Log’ların analizi oldukça fazla kullanılan yöntemlerden biridir. Bu yüzden best practice’lere göre ayarlanmış SQL Server ve Agent Error Log kullanımı ileride oluşabilecek sıkıntıların önüne geçmek için çok önemlidir.

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server veya SP kurulumu esnasında gerçekleştirilen System Check esnasında eğer server restart pending statusunde ise bu check işlemi “Restart Computer” adımından geçemeyecek ve kuruluma devem etmemizi engelleyecektir.

[more]

Böyle bir durumda tabiki önerilen yöntem server’ı restart etmektir.

Ama server’ı restart etmeden bu mesajdan nasıl kurtulurum diye öğrenmek istiyorsanız yapmanız gereken işlem çok basit.

Register HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\ folder’ında bulunan PendingFileRenameOperations key’ini sildiğinizde bu mesajdan kurtulabilirsiniz.

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2008 R2 ya da daha üst bir versiyonda oluşturulmuş bir database’i detach edip 2008 Server’a attach etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

The database 'dbDenemeR2' cannot be opened because it is version 661. This server supports version 655 and earlier. A downgrade path is not supported.

Could not open new database 'dbDenemeR2'. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 948)

image

Bu hatanın sebebi üst versiyondan oluşturulan bir database’in daha alt bir SQL Server versiyonuna attach edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2008 R2 ya da daha üst bir versiyondan aldığınız bir backup’ı SQL Server 2008’e restore etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

Msg 3169, Level 16, State 1, Line 1
The database was backed up on a server running version 10.50.1600. That version is incompatible with this server, which is running version 10.00.2531. Either restore the database on a server that supports the backup, or use a backup that is compatible with this server.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

image

Bu hatanın sebebi üst versiyondan alınan backup dosyasının daha alt bir SQL Server versiyonuna restore edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


 

SQL Server 2008 ya da daha üst bir versiyonda oluşturulmuş bir database’i detach edip 2005 Server’a attach etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

The database 'XXX' cannot be opened because it is version 655. This server supports version 612 and earlier. A downgrade path is not supported.
Could not open new database 'XXX'. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 948)

image

Bu hatanın sebebi üst versiyondan oluşturulan bir database’in daha alt bir SQL Server versiyonuna attach edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2008 ya da daha üst bir versiyondan aldığınız bir backup’ı SQL Server 2005 ya da SQL Server 2000’e restore etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

Msg 3241, Level 16, State 7, Line 2
The media family on device 'D:\dbDeneme2008_2.bak' is incorrectly formed. SQL Server cannot process this media family.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

image

Bu hatanın sebebi üst versiyondan alınan backup dosyasının daha alt bir SQL Server versiyonuna restore edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Standalone yani herhangi bir domain’e ait olmayan bir bilgisayarda SQL Server 2008 R2 BPA kurulumu yaparken aşağıdaki gibi bir hata ile karşılaşabilirsiniz.

[more]

There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contat your support personel or package vendor.

image

Bu hatayı almadan kurulumu sorunsuz bir şekilde yapmak için uygulamanız gereken adımlar aşağıdaki gibi.

  1. Bilgisayarınızda Windows PowerShell 2.0’ın kurulu olduğundan emin olun. Eğer kurulu değilse aşağıdaki adresten indirip kurun.
    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=50633A1F-A665-425D-923C-1A269F8AC084
  2. Windows PowerShell 2.0’ı bir admin account’u ile açın.
  3. Enable-PSRemoting komutunu çalıştırın.
  4. winrm set winrm/config/winrs `@`{MaxShellsPerUser=`"10`"`} komutunu çalıştırın.
  5. Command prompt u açın ve BPA kurulumunu şu şekilde başlatın.
    msiexec /i "C:\Tools\SQL2008R2BPA_Setup64.msi" SKIPCA=1

Bu aşamaları hatasız geçerseniz BPA kurulumunuz sorunsuz tamamlanacaktır.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2005 kurulu sunucularımızdan birinde SSMS üzerinden error log’a erişmeye çalıştığımızda aşağıdaki hatayı almaktaydık.

Error: 18456, Severity: 14, State: 11.

Login failed for user 'NT AUTHORITY\NETWORK SERVICE'. [CLIENT: <local machine>]

[more]

err1

SQL Server Service’i 'NT AUTHORITY\NETWORK SERVICE' account’u ile çalışmaktaydı. Yaptığımız incelemeler sonucunda bu account’un SQL Server’da sysAdmin olarak yetkili olmadığını gördük.

'NT AUTHORITY\NETWORK SERVICE' account’unu SQL Server’a sysAdmin olarak ekledikten sonra error log’u problemsiz olarak görüntülemeye başladık.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bugün size taze taze aldığım bir hata mesajından bahsetmek istiyorum.

Error 8623: The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

[more]

Instance larımdan birinde yapılan aşağıdaki update sorgusu yukarıdaki hatayı vermekteydi.

update table1 
set column1 = 'H'
where column2 in (1,
2,
4,
5,
6,
7,
8,
9,
10,
....
....
....
)

 

In bloğu içinde 39 bin kayıt bulunmaktaydı. Yaptığım araştırmalar sonucunda IN içinde binlerce kayıt kullanıldığında aşağıdaki gibi hataların alınabileceğini gördüm.

Error 8623:The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Error 8632:Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.

http://msdn.microsoft.com/en-us/library/ms177682.aspx

Bu durumda yapılması gereken en mantıklı işlem, IN içinde bulunan kayıtları bir temp tabloya almak ve daha sonra temp tabloyu ana tabloya join’lemektedir. Aşağıdaki gibi;

create table #temp1(Col1 int)

insert #temp1 values(1)
insert #temp1 values(2)
insert #temp1 values(3)
insert #temp1 values(4)

update table1
set column1 = '3'
from table1
join #temp1 t1 on t1.Col1=table1.column2

drop table #temp1

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Locking işlemlerini nasıl trace edebileceğimizi SQL Server Profiler ile Bloklanan İşlem Raporu (Blocked Prosess Report) adlı yazımda görmüştük. Bu trace tanımlamasını yaptıktan sonra bu işlemi Data Collector’etoplatmak için Server Side Trace tanımlaması yapmaya başladım. Lakin işlemi yaparken bir hata aldım. Bugünkü yazımda bu hatayı ve çözümünün ne olduğunu görüyor olacağız.

[more]

Trace’i server side olarak toplatmak için aşağıdaki ilgili script’i execute ettiğimizde

/*************************************************************/
-- SQL Trace collection set generated from SQL Server Profiler
-- Date: 03/09/2010  17:17:40
/*************************************************************/

USE msdb
GO

BEGIN TRANSACTION
BEGIN TRY

-- Define collection set
-- ***
-- *** Replace 'SqlTrace Collection Set Name Here' in the following script
-- *** with the name you want to use for the collection set.
-- ***
DECLARE @collection_set_id int;
EXEC [dbo].[sp_syscollector_create_collection_set]
    @name = N'ServerSideLockTrace',
    @schedule_name = N'CollectorSchedule_Every_15min',
    @collection_mode = 0, -- cached mode needed for Trace collections
    @logging_level = 0, -- minimum logging
    @days_until_expiration = 5,
    @description = N'Collection set generated by SQL Server Profiler',
    @collection_set_id = @collection_set_id output;
SELECT @collection_set_id;

-- Define input and output varaibles for the collection item
DECLARE @trace_definition xml;
DECLARE @collection_item_id int;

-- Define the trace parameters as an XML variable
SELECT @trace_definition = convert(xml,
N'<ns:SqlTraceCollector xmlns:ns="DataCollectorType" use_default="0">
<Events>
  <EventType name="Errors and Warnings">
    <Event id="137" name="Blocked process report" columnslist="3,15,51,4,12,24,32,60,64,1,13,41,14,22,26" />
  </EventType>
</Events>
</ns:SqlTraceCollector>
');

-- Retrieve the collector type GUID for the trace collector type
DECLARE @collector_type_GUID uniqueidentifier;
SELECT @collector_type_GUID = collector_type_uid FROM [dbo].[syscollector_collector_types] WHERE name = N'Generic SQL Trace Collector Type';

-- Create the trace collection item
-- ***
-- *** Replace 'SqlTrace Collection Item Name Here' in the following script
-- *** with the name you want to use for the collection item.
-- ***
EXEC [dbo].[sp_syscollector_create_collection_item]
   @collection_set_id = @collection_set_id,
   @collector_type_uid = @collector_type_GUID,
   @name = N'ServerSideLockTrace',
   @frequency = 900, -- specified the frequency for checking to see if trace is still running
   @parameters = @trace_definition,
   @collection_item_id = @collection_item_id output;
SELECT @collection_item_id;

COMMIT TRANSACTION;
END TRY

BEGIN CATCH
ROLLBACK TRANSACTION;
DECLARE @ErrorMessage nvarchar(4000);
DECLARE @ErrorSeverity int;
DECLARE @ErrorState int;
DECLARE @ErrorNumber int;
DECLARE @ErrorLine int;
DECLARE @ErrorProcedure nvarchar(200);
SELECT @ErrorLine = ERROR_LINE(),
       @ErrorSeverity = ERROR_SEVERITY(),
       @ErrorState = ERROR_STATE(),
       @ErrorNumber = ERROR_NUMBER(),
       @ErrorMessage = ERROR_MESSAGE(),
       @ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-');
RAISERROR (14684, @ErrorSeverity, 1 , @ErrorNumber, @ErrorSeverity, @ErrorState, @ErrorProcedure, @ErrorLine, @ErrorMessage);
END CATCH;
GO

 

Aşağıdaki gibi bir hata almaktayız.

Msg 3903, Level 16, State 1, Line 58
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.
Msg 14684, Level 16, State 1, Line 71
Caught error#: 14684, Level: 16, State: 1, in Procedure: sp_syscollector_create_collection_item, Line: 144, with Message: Caught error#: 6908, Level: 16, State: 1, in Procedure: -, Line: 1, with Message: XML Validation: Invalid content. Expected element(s): 'Filters'. Location: /*:SqlTraceCollector[1]

Hatanın sebebi data collector setini tanımlayacak olan SP’nin gelen XML kod’da Filter bekliyor olması. Yani biz trace i hazırlarken filter verdiğimizde herhangi bir hata ile karşılaşmadan collection seti hazırlayabiliyorken, filter vermezsek yukarıdaki gibi bir hata ile kaşılaşıyoruz.

Hatayı çözmek için yapacağımız işlem basit. XML kod’da filter varmış gibi göstermek için şu şekilde bir şekilde değişiklik yapacağız.

SELECT @trace_definition = convert(xml,
N'<ns:SqlTraceCollector xmlns:ns="DataCollectorType" use_default="0">
<Events>
  <EventType name="Errors and Warnings">
    <Event id="137" name="Blocked process report" columnslist="3,15,51,4,12,24,32,60,64,1,13,41,14,22,26" />
  </EventType>
</Events>
<Filters>
</Filters>
</ns:SqlTraceCollector>
');

Bu değişiklik yaptıktan sonra query’i tekrar execute ettiğimizde Collection Set’in hatasız oluşturulduğunu göreceğiz.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Instance ım birinde çalışan Data Collector Disk Usage Data Collection Set’inde aşağıdaki gibi bir hata almaktaydım.

SSIS error. Component name: DFT - Collect Query 0, Code: -1073450974, Subcomponent: SSIS.Pipeline, Description: SSIS Error Code DTS_E_PROCESSINPUTFAILED. The ProcessInput method on component "Raw File Destination" (48) failed with error code 0xC020205D while processing input "Raw File Destination Input" (53). The identified component returned an error from the ProcessInput method. The error is specific to the component, but the error is fatal and will cause the Data Flow task to stop running. There may be error messages posted before this with more information about the failure.

Hata ile ilgili yaptığım araştırmalar sonucunda hatanın Cache Directory’de tutulan cache dosyalarının bozulmasından kaynaklandığı sonucuna ulaştım.

[more]

Bu bozulma şu durumlarda gerçekleşebilir;

  • Data Collector bir exception ile karşılaştığında
  • Data Collector cache file a yazarken disk’in dolması
  • Bir firmware yada driver problemi

Bu hata için çözümümüz ise Cache dosyaları cache’lendikleri klasörden silmek. Bu silme işleminide aşağıdaki adımlar eşliğinde yapabiliriz.

  1. Management >> Data Collection item’ına sağ tıklayıp Properties’i açıyoruz. 
    1
  2. Cache Directory kısmından cache dosyaların nerede tutulduğunu öğreniyoruz. 
    2
  3. Bu directory’e gidip cache dosyaları siliyoruz. 
    3
  4. Disk Usage collection Set’ini Collect and UploadNow işlemi ile tekrar çalıştırıyoruz ve hata almadan job’ların problemsiz çalıştığını görüyoruz. 
    4

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server Data Collector Hata - ODS - Get current snapshot of dm_exec_query_stats yazımda Data Collector de bulunan Query Statistics collection set inin verdiği “arithmetic overflow” hatasından bahsetmiş ve Microsoft’un bu hata çözümü için önerdiği yöntemin cumulative update 5 i yapmak olduğuna değinmiştim.

Cumulative update geniş ölçekli yapılarda evet diyilince yapılacak bir işlem değildir. Bu tarz güncelleştirmeler için sizin de firmanızda bazı prosedure ler bulunabilir. Ayrıca Microsoft dahi “ölümcül” bir hata olmadığı sürece cumulative update in production ortamına yapılmasını önermemektedir.

Bu yüzden bugünkü yazımda bahsi geçen hatayı cumulative update yapmadan “unsupported” bir yöntemle nasıl aşacağımızı anlatacağım. Unsported diyorum çünkü normalde bu hatanın çözümü için Microsoft cumulative update 5 in yapılmasını önermekte ve biz collection set in SSIS paketiyle oynayacağımız için bu durum unsupported bir durum oluşturmaktadır.

[more]

Bu kadar giriş cümlesinden sonra şimdi işleme dönelim. Dediğim gibi Query Statistics collection set inin SSIS paketinde oynama yapacağız ve hata veren kısmı çözmeye çalışacağız.

Bu collection set in upload işleminde hata olduğunu biliyorum. Dolayısıyla değişiklik yapacağım SSIS paket upload SSIS paketi olacak. Pakette değişiklik yapmak için Microsoft Visual Studio yu çalıştırıyorum.

File>>New>>Project>>Integration Service Project kısmından yeni bir Integration Service projesi başlatıyorum.

Clipboard01

SSIS Packages yazısına sağ tıklayıp Add Existing Package a tıklayalım.

Clipboard02

Gelen ekranda Server Name bilgisini yazarak ve Authentication Type ı seçerek Package Path in yanında bulunan butona basalım.

Clipboard03

Clipboard04

Değiştirmek istediğimiz paket olan QueryActivityUpload u seçerek OK e basalım. Bir önceki ekrandada OK e basalım ve ana ekrana düşelim.

Şimdi Solution Explorer kısmından bu paketi çift tıklayalım ve açalım.

Bizim hatamız DFT - Create Interesting Queries Upload Batch isimli Data Flow Task ta.

Clipboard05

Bu task ı çift tıklayarak Data Flow kısmına geçelim. Bu kısımda ise hata veren adım ODS - Get current snapshot of dm_exec_query_stats isimli OleDB Source ta.

Clipboard06

Bu objeyi çift tıklayarak properties ine erişelim.

Clipboard07

Şimdi can alıcı noktaya geliyoruz. Bu ekrandaki SQL Command ı alıp SSMS ten çalıştırdığınızda “arithmetic overflow” hatası alacaksınız. Dediğim gibi değişiklik yapacağımız kısım burası.

Hatanın sebebide 4 farklı satırda geçen aşağıdakine benzer çarpımlar.

r.total_elapsed_time * 1000 AS total_elapsed_time

 

Bu çarpım “arithmetic overflow” hatası vermekte. Cast kullanarak ufak bir trik le hatayı çözmeye çalışacağız.

cast(r.total_elapsed_time as float) * 1000 AS max_elapsed_time

 

Script in son hali aşağıdaki gibi olmalı.

SET NOCOUNT ON
DECLARE @p1 datetime
SET @p1 = GETDATE()

SELECT 
    [sql_handle],
    statement_start_offset,
    statement_end_offset,
    -- Use ISNULL here and in other columns to handle in-progress queries that are not yet in sys.dm_exec_query_stats.  
    -- These values only come from sys.dm_exec_query_stats. If the plan does not show up in sys.dm_exec_query_stats 
    -- (first execution of a still-in-progress query, visible in sys.dm_exec_requests), these values will be NULL. 
    MAX (plan_generation_num) AS plan_generation_num,
    plan_handle,
    MIN (creation_time) AS creation_time, 
    MAX (last_execution_time) AS last_execution_time,
    SUM (execution_count) AS execution_count,
    SUM (total_worker_time) AS total_worker_time,
    MIN (min_worker_time) AS min_worker_time,           -- NULLable
    MAX (max_worker_time) AS max_worker_time,
    SUM (total_physical_reads) AS total_physical_reads,
    MIN (min_physical_reads) AS min_physical_reads,     -- NULLable
    MAX (max_physical_reads) AS max_physical_reads,
    SUM (total_logical_writes) AS total_logical_writes,
    MIN (min_logical_writes) AS min_logical_writes,     -- NULLable
    MAX (max_logical_writes) AS max_logical_writes,
    SUM (total_logical_reads) AS total_logical_reads,
    MIN (min_logical_reads) AS min_logical_reads,       -- NULLable
    MAX (max_logical_reads) AS max_logical_reads,
    SUM (total_clr_time) AS total_clr_time,
    MIN (min_clr_time) AS min_clr_time,                 -- NULLable
    MAX (max_clr_time) AS max_clr_time,
    SUM (total_elapsed_time) AS total_elapsed_time,
    MIN (min_elapsed_time) AS min_elapsed_time,         -- NULLable
    MAX (max_elapsed_time) AS max_elapsed_time,
    @p1 AS collection_time
FROM
(
    SELECT  
        [sql_handle],
        statement_start_offset,
        statement_end_offset,
        plan_generation_num,
        plan_handle,
        creation_time,
        last_execution_time,
        execution_count,
        total_worker_time,
        min_worker_time,
        max_worker_time,
        total_physical_reads,
        min_physical_reads,
        max_physical_reads,
        total_logical_writes,
        min_logical_writes,
        max_logical_writes,
        total_logical_reads,
        min_logical_reads,
        max_logical_reads,
        total_clr_time,
        min_clr_time,
        max_clr_time,
        total_elapsed_time,
        min_elapsed_time,
        max_elapsed_time 
    FROM sys.dm_exec_query_stats AS q
    -- Temporary workaround for VSTS #91422.  This should be removed if/when sys.dm_exec_query_stats reflects in-progress queries. 
    UNION ALL 
    SELECT 
        r.[sql_handle],
        r.statement_start_offset,
        r.statement_end_offset,
        ISNULL (qs.plan_generation_num, 0) AS plan_generation_num,
        r.plan_handle,
        ISNULL (qs.creation_time, r.start_time) AS creation_time,
        r.start_time AS last_execution_time,
        1 AS execution_count,
        -- dm_exec_requests shows CPU time as ms, while dm_exec_query_stats 
        -- uses microseconds.  Convert ms to us. 
        --r.cpu_time * 1000 
        cast(r.cpu_time as float) * 1000 AS total_worker_time,
        qs.min_worker_time,     -- min should not be influenced by in-progress queries
        --r.cpu_time * 1000 
        cast(r.cpu_time as float) * 1000 AS max_worker_time,
        r.reads AS total_physical_reads,
        qs.min_physical_reads,  -- min should not be influenced by in-progress queries
        r.reads AS max_physical_reads,
        r.writes AS total_logical_writes,
        qs.min_logical_writes,  -- min should not be influenced by in-progress queries
        r.writes AS max_logical_writes,
        r.logical_reads AS total_logical_reads,
        qs.min_logical_reads,   -- min should not be influenced by in-progress queries
        r.logical_reads AS max_logical_reads,
        qs.total_clr_time,      -- CLR time is not available in dm_exec_requests
        qs.min_clr_time,        -- CLR time is not available in dm_exec_requests
        qs.max_clr_time,        -- CLR time is not available in dm_exec_requests
        -- dm_exec_requests shows elapsed time as ms, while dm_exec_query_stats 
        -- uses microseconds.  Convert ms to us. 
        --r.total_elapsed_time * 1000 
        cast(r.total_elapsed_time as float) * 1000 AS total_elapsed_time,
        qs.min_elapsed_time ,    -- min should not be influenced by in-progress queries
        --r.total_elapsed_time * 1000 
        cast(r.total_elapsed_time as float) * 1000 AS max_elapsed_time
    FROM sys.dm_exec_requests AS r 
    LEFT OUTER JOIN sys.dm_exec_query_stats AS qs ON r.plan_handle = qs.plan_handle AND r.statement_start_offset = qs.statement_start_offset 
        AND r.statement_end_offset = qs.statement_end_offset 
    WHERE r.sql_handle IS NOT NULL 
) AS query_stats 
OUTER APPLY sys.dm_exec_sql_text (sql_handle) AS sql
GROUP BY [sql_handle], plan_handle, statement_start_offset, statement_end_offset 
ORDER BY [sql_handle], plan_handle, statement_start_offset, statement_end_offset

 

İşimiz bitti. Bu ekranı OK diyerek kapatabiliriz. Daha sonrada değişiklik yaptığımız paketi save ediyoruz.

Şimdiki adımımız bu paketi hata aldığımız sunucuya deploy etmek.

Bunun için Integration Server a SSMS kullanarak bağlanıyoruz.

Clipboard08

Stored Packages >> MSDB >> Data Collector yazısına sağ tıklayıp Import Package ı seçiyoruz.

Clipboard09

Gerekli Import bilgilerini aşağıdaki gibi dolduruyorum ve paketi import ediyorum.

Clipboard10

Yapacaklarımız bu kadar :) Bende bu işlemlerden sonra collection set im şıkır şıkır çalışmaya başladı. Darısı sizin başınıza. :)

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server da Mirroring yapılan server lar arasında otomatik olarak heartbeat kontrolu bulunmaktadır. Principal server belirli aralıklarla mirroring server ı ping eder ve eğer cevap alamazsa bununla alakalı hata mesajı döndürür.

Otomatik olarak yapılacak bu heartbeat kontrolü için default bir frequency değeri vardır. Bu değer default olarak 10 sn dir ve principal server 10 sn de bir mirroring server a ping yaparak ayakta olup olmadığını kontrol eder.

Çok yoğun transaction alan DB lerde 10 sn lik bu değer yetmemekte ve Event Viewer a aşağıdaki TimeOut hatası düşmektedir.

The mirroring connection to "TCP://ServerName.DomainName:5022" has timed out for database "DBName" after 10 seconds without a response. Check the service and network connections.

Yapılması gereken işlem default 10 sn olan Partner Timeout değerini arttırmaktır.

Aşağıdaki script MyDB veritabanı için Partner Timeout değerini 60 sn ye set eder.

ALTER DATABASE MyDB SET PARTNER TIMEOUT 40

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server Data Collector collection setlerinden Query Statistics server larımdan birinde aşağıdaki hatayı vermekteydi.

SSIS error. Component name: DFT - Create Interesting Queries Upload Batch, Code: -1073450982, Subcomponent: SSIS.Pipeline, Description: component "ODS - Get current snapshot of dm_exec_query_stats" (16412) failed the pre-execute phase and returned error code 0xC0202009.

[more]

Hata ile alakalı google da arama yaptığımda aşağıdaki KB article a eriştim.

http://support.microsoft.com/kb/975915

Gerçekten de makaledeki script i server ımda uyguladığımda “arithmetic overflow” hatası gelmekte.

Microsoft bu hatanın giderilmesi için Cumulative Update 5 in yapılması gerektiğini söylemekte. Benim daha yapmaya fırsatım olmadı, belki siz o cesareti bulur yaparsınız :)

 

Ekleme (18.08.2010) : Bu hatanın unsupported çözümü için lütfen aşağıdaki makaleye bakınız.

http://www.turgaysahtiyan.com/post/SQL-Server-Data-Collector-Query-Statistisc-Collection-Set-indeki-Hatanc4b1n-Cozumu.aspx

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server Data Collector ın rutin izlemelerim sırasında bütün server larımda birden down olduğunu gördüm. 4 Collection setim inde job ları aşağıdaki hatayı vererek işlemleri sonlandırıyordu.

Executed as user: XXX\YYYYY. The step did not generate any output. Process Exit Code 5. The step failed.

[more]

image

Daha detaylı bakmak için execution log u sorguladığımda

use msdb
select * from syscollector_execution_log
where collection_set_id=1
order by start_time desc

 

aşağıdaki hata mesajına eriştim.

SSIS error. Component name: SQL - Get SnapshotID, Code: -1073548784, Subcomponent: Execute SQL Task, Description: Executing the query "{call core.sp_create_snapshot (?, ?, ?, ?, ?, ?)}" failed with the following error: "The specified @collector_type_uid (302E93D1-3424-4BE7-AA8E-84813ECF2419) is not valid in this data warehouse.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

Bu hata mesajıyla alakalı araştırma yapmaya devam ederken gün içinde SQL Server DataWarehouse DB sini temizlediğim aklıma geldi J Temizlik yaparken fazladan data silmiş olabileceğimi değerlendirdim.

Gerçekten de DataWarehouse yani dataların toplandığı DB de dbo.syscollector_collector_types tablosunu yanlışlıkla temizlediğimi gördüm. Oysaki burada data collection type larının bulunması gerekiyor. Ve bu tabloya SP de select çekerken boş değer döndüğü için hata alıyor.

Bu table ı doldurmak için Data Collector kurulu bir sistemden Insert sorgularını oluşturdum. Bu sorgularda aşağıdaki gibi.

insert core.supported_collector_types_internal    
	select '302E93D1-3424-4BE7-AA8E-84813ECF2419' 
insert core.supported_collector_types_internal    
	select '0E218CF8-ECB5-417B-B533-D851C0251271' 
insert core.supported_collector_types_internal    
	select '14AF3C12-38E6-4155-BD29-F33E7966BA23' 
insert core.supported_collector_types_internal    
	select '294605DD-21DE-40B2-B20F-F3E170EA1EC3'

 

Sizde aynı hatayla karşılaşırsanız DataWarehouse DB sinde yukarıdaki insert leri uygulamanız yeterli olacaktır.

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Gün geçmiyorki SQL Server Data Collector ün bir hatasıyla daha karşılaşmayayım J

Bugünkü hatamız, Server Side Trace Collection set inin upload unda karşılaştığım aşağıdaki hata.

SSIS error. Component name: SQL - Get trace info, Code: -1073548535, Subcomponent: Execute SQL Task, Description: An error occurred while assigning a value to variable "TraceStartTime": "Single Row result set is specified, but no rows were returned.".

[more]

SQL Server Collector job larını rutin olarak izlediğim bir anda ServerSide Trace ile alakalı olan collection ın upload job ının hata verdiğini gördüm.

Aşağıdaki sorgu ile hata detayını sorguladığımda;

select failure_message,* from syscollector_execution_log 
where collection_set_id=4 
order by start_time desc

 

failure_message kısmında aşağıda hataya eriştim.

SSIS error. Component name: SQL - Get trace info, Code: -1073548535, Subcomponent: Execute SQL Task, Description: An error occurred while assigning a value to variable "TraceStartTime": "Single Row result set is specified, but no rows were returned.".

İlk bakışta da anlayacağınız gibi hata SSIS paketi ile alakalı. Data Collector collection setler için SSIS paketi kullanmakta ve demekki bu hata bu paketlerden birinden gelmekte. Bizim hatamız Server Side Trace Colletion set inin upload unda olduğu için bu paketi server da bulup içini incelemeye koyuluyoruz.

res1

Hata detayında task Result set inin Single Row olduğu sonucuna varıyoruz. Aynı zamanda bu task ta TraceStartTime variable ı var. Bu 2 ipucunu kullanarak hata veren task ın SQL – Get Trace Info olduğu sonucuna varıyoruz. Bu Task ın detayını incelediğimizde

res2

Dikkatimizi hemen SQL Statement çekiyor. Demek ki bu statement çalıştığında sonuç döndüremiyor ve task failure oluyor. O zaman sıradaki işlemimiz bu statement daki SP yi yani dbo.sp_syscollector_get_trace_info SP sini incelemek.

SP oldukça basit.

CREATE PROCEDURE [dbo].[sp_syscollector_get_trace_info]  
    @trace_path  nvarchar(512),  
    @use_default int  
AS  
BEGIN  
    SELECT   
        CONVERT(nvarchar(30), t.start_time, 126) as start_time,  
        CASE t.status   
            WHEN 1 THEN 1   
            ELSE 0   
        END AS is_running,   
        ISNULL(t.dropped_event_count,0) as dropped_event_count,  
        t.id  
    FROM sys.traces t  
    WHERE (@use_default=1 and t.is_default=1)  
          OR (@use_default=0 AND t.path LIKE (@trace_path + N'%.trc'))  
END

 

BU SP nin yaptığı gelen parametreler ile sys.traces i sorgulayıp eşleşen trace i yakalamak.

Benim case imde sys.traces sadece default trace i döndürmekteydi. Yani bu collection ın kullandığı yada kullanması gerektiği trace uçmuş :) Dolayısıyla SP nin sonucu task a boş gelmekte oda Single Row özelliğinden dolayı fail edip akabinde de job fail etmekte. Çok zincirleme oldu değil mi :)

Çözüm olarak Server Side trace tanımlama işlemini tekrar gerçekleştirdim. Şu anda herhangi bir problem vermeden çalışmakta.

Bir sonraki Data Collector hatasında görüşmek üzere :)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan