<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Yunus Emre Işık arşivleri - Yunus Emre IŞIK</title>
	<atom:link href="https://ynsmr.com/tag/yunus-emre-isik/feed/" rel="self" type="application/rss+xml" />
	<link>https://ynsmr.com/tag/yunus-emre-isik/</link>
	<description>Microsoft SQL Server Günlükleri</description>
	<lastBuildDate>Mon, 21 Jul 2025 15:10:26 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.2</generator>
	<item>
		<title>SQL Server versiyonunu öğrenmek</title>
		<link>https://ynsmr.com/sql-server-versiyonunu-ogrenmek/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sql-server-versiyonunu-ogrenmek</link>
					<comments>https://ynsmr.com/sql-server-versiyonunu-ogrenmek/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 30 Dec 2021 07:50:15 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[select @@version]]></category>
		<category><![CDATA[sql server sürüm öğrenme]]></category>
		<category><![CDATA[SQL server versiyonu]]></category>
		<category><![CDATA[sql versiyon öğrenme]]></category>
		<category><![CDATA[Yunus Emre Işık]]></category>
		<guid isPermaLink="false">https://ynsmr.com/?p=530</guid>

					<description><![CDATA[<p>Sunucunuzda kurulu SQL server versiyonunu öğrenmenin çeşitli yolları vardır. Bunları sırayla ele alalım. 1 &#8211; Yeni bir query penceresi açıp şu kodu çalıştırmak: Select @@VERSION Bu komutu PowerShell ve Command Prompt pencerelerinde sqlps modülüne geçip aşağıdaki şekilde çalıştırarak da versiyon bilgisini alabiliriz. Invoke-Sqlcmd -Query &#8220;SELECT @@VERSION;&#8221; Comand Prompt&#8217;ta yine sqlcmd komutuyla veritabanına bağlanabiliyorsak, &#8220;Select @@VERSION&#8221; ... <a title="SQL Server versiyonunu öğrenmek" class="read-more" href="https://ynsmr.com/sql-server-versiyonunu-ogrenmek/" aria-label="More on SQL Server versiyonunu öğrenmek">Devamını oku</a></p>
<p><a href="https://ynsmr.com/sql-server-versiyonunu-ogrenmek/">SQL Server versiyonunu öğrenmek</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[<p>Sunucunuzda kurulu SQL server versiyonunu öğrenmenin çeşitli yolları vardır. Bunları sırayla ele alalım.<br />
1 &#8211; Yeni bir query penceresi açıp şu kodu çalıştırmak:<br />
<strong>Select @@VERSION<br />
</strong><br />
Bu komutu PowerShell ve Command Prompt pencerelerinde sqlps modülüne geçip aşağıdaki şekilde çalıştırarak da versiyon bilgisini alabiliriz.<br />
<strong>Invoke-Sqlcmd -Query &#8220;SELECT @@VERSION;&#8221;</strong></p>
<p>Comand Prompt&#8217;ta yine sqlcmd komutuyla veritabanına bağlanabiliyorsak, &#8220;<strong>Select @@VERSION&#8221; </strong>yazarak yine versiyon görüntüleyebiliriz.</p>
<p>2- Error Log dosyasını notepad ile açtığınızda en üst satırda versiyon bilgisini içeren bir satır bulunur. Error Log dosyasını, kendi kurulumunuzdaki versiyon farklılığını da gözönüne alarak  şu path&#8217;den bulabilirsiniz: <strong>C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log.<br />
</strong> SSMS içerisinden de bu log, Management&gt;&gt;SQL Server Logs altında açılabilir. Current log u seçip açtığınızda en alt satıra geldiğinizde yine versiyon bilgisini görebilirsiniz. <img fetchpriority="high" decoding="async" class=" wp-image-531 aligncenter" src="https://ynsmr.com/wp-content/uploads/2021/12/errorlog-300x128.png" alt="" width="603" height="257" srcset="https://ynsmr.com/wp-content/uploads/2021/12/errorlog-300x128.png 300w, https://ynsmr.com/wp-content/uploads/2021/12/errorlog-1024x436.png 1024w, https://ynsmr.com/wp-content/uploads/2021/12/errorlog-768x327.png 768w, https://ynsmr.com/wp-content/uploads/2021/12/errorlog.png 1391w" sizes="(max-width: 603px) 100vw, 603px" /></p>
<p>3 &#8211; SQL Server Management Studio&#8217;da sunucu isminde görebilirsiniz. Burada gördüğümüz rakam kurulu versiyonun numarasıdır. Bu numaralar şu versiyonları ifade etmektedir.<br />
SQL Server 2019:15 , 2017:14, 2016:13,2014:12, 2012:11, 2008R2:8.5 , 2008:10<br />
<img decoding="async" class="size-medium wp-image-533 alignleft" src="https://ynsmr.com/wp-content/uploads/2021/12/sunucuismi-300x243.png" alt="" width="300" height="243" srcset="https://ynsmr.com/wp-content/uploads/2021/12/sunucuismi-300x243.png 300w, https://ynsmr.com/wp-content/uploads/2021/12/sunucuismi.png 353w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>4 &#8211; Object Explorer&#8217;da sunucu ismine sağ tuş &gt;&gt; Properties penceresinde version bilgisinde yine bir üstteki maddedeki rakama ulaşılabilir.</p>
<p>5- Sunucu üzerindeki veritabanlarından herhangi birine sağ tuş&gt;&gt; properties penceresinde Options tabı içerisinde &#8220;compatibility level&#8221;  açılır kutusunda en yüksek veritabanı hangisi ise kurulu sql server versiyonu da odur.<br />
<img decoding="async" class="alignnone wp-image-536" src="https://ynsmr.com/wp-content/uploads/2021/12/compatibility-300x262.png" alt="" width="488" height="426" srcset="https://ynsmr.com/wp-content/uploads/2021/12/compatibility-300x262.png 300w, https://ynsmr.com/wp-content/uploads/2021/12/compatibility-768x670.png 768w, https://ynsmr.com/wp-content/uploads/2021/12/compatibility.png 930w" sizes="(max-width: 488px) 100vw, 488px" /></p>
<p>6 &#8211; EXEC sp_server_info komutunu çalıştırdığınızda DBMS_VER kolununda versiyon bilgisine yine ulaşabilirsiniz.</p>
<p><a href="https://ynsmr.com/sql-server-versiyonunu-ogrenmek/">SQL Server versiyonunu öğrenmek</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ynsmr.com/sql-server-versiyonunu-ogrenmek/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Master veritabanını taşımak</title>
		<link>https://ynsmr.com/master-veritabanini-tasimak/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=master-veritabanini-tasimak</link>
					<comments>https://ynsmr.com/master-veritabanini-tasimak/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 16 Nov 2021 13:38:37 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[master veritabanı]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[msdb]]></category>
		<category><![CDATA[tempdb]]></category>
		<category><![CDATA[Yunus Emre Işık]]></category>
		<guid isPermaLink="false">https://ynsmr.com/?p=494</guid>

					<description><![CDATA[<p>SQL Server&#8217;ın sistem veritabanlarından olan master veritabanını taşımak için aşağıdaki adımlar takip edilir. 1- SQL Server Configuration Manager&#8217;ı açıyoruz. 2- Servis özellikleri penceresini açalım. Startup parametreleri tabına geçelim. Alttaki barı sağa çektiğimizde bu parametrelerden bir tanesinin master veritabanının data dosyasına, bir tanesinin de log dosyasına ait path olduğunu görürüz. 3- Bu parametreleri yeni dosya yoluna ... <a title="Master veritabanını taşımak" class="read-more" href="https://ynsmr.com/master-veritabanini-tasimak/" aria-label="More on Master veritabanını taşımak">Devamını oku</a></p>
<p><a href="https://ynsmr.com/master-veritabanini-tasimak/">Master veritabanını taşımak</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[<p>SQL Server&#8217;ın sistem veritabanlarından olan master veritabanını taşımak için aşağıdaki adımlar takip edilir.</p>
<p>1- SQL Server Configuration Manager&#8217;ı açıyoruz.<br />
2- Servis özellikleri penceresini açalım. Startup parametreleri tabına geçelim. Alttaki barı sağa çektiğimizde bu parametrelerden bir tanesinin master veritabanının data dosyasına, bir tanesinin de log dosyasına ait path olduğunu görürüz.<br />
<img loading="lazy" decoding="async" class="size-medium wp-image-495 aligncenter" src="https://ynsmr.com/wp-content/uploads/2021/11/Untitled-237x300.jpg" alt="" width="237" height="300" srcset="https://ynsmr.com/wp-content/uploads/2021/11/Untitled-237x300.jpg 237w, https://ynsmr.com/wp-content/uploads/2021/11/Untitled.jpg 517w" sizes="(max-width: 237px) 100vw, 237px" /></p>
<p>3- Bu parametreleri yeni dosya yoluna ayarlayalım.<br />
4- SQL servisini durduralım.<br />
5- Master veritabanının mdf ve ldf dosyasını yeni konumuna taşıyalım.<br />
6- Servisi yeniden başlatalım.</p>
<p>MSDB, MODEL ve TEMPDB veritabanlarını taşımak için ise ALTER DATABASE .. MODIFY FILE komutunu kullanıyoruz. Sonrasında servisi durdurup, dosyaları yeni konumuna taşıyıp, servisi yeniden başlatıyoruz. Ancak TEMPDB veritabanı servis her başladığında baştan oluşturulduğu için, dosya taşımaya gerek yok. Yeni path girildikten sonra eski konumdan, eski dosyaları silmek yeterli.</p>
<p>Örnek:<br />
ALTER DATABASE tempdb<br />
MODIFY FILE (NAME= tempdev, FILENAME = &#8220;Z:\yeni path\tempdb.mdf&#8217;);</p>
<p>ALTER DATABASE tempdb<br />
MODIFY FILE (NAME= templog, FILENAME = &#8220;Z:\yeni path\templog.ldf&#8217;);</p>
<p>Bu komutlar çalıştırıldıktan sonra servis restart edilmek zorundadır.</p>
<p>&nbsp;</p>
<p><a href="https://ynsmr.com/master-veritabanini-tasimak/">Master veritabanını taşımak</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ynsmr.com/master-veritabanini-tasimak/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TempDB</title>
		<link>https://ynsmr.com/tempdb/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tempdb</link>
					<comments>https://ynsmr.com/tempdb/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Mon, 04 Oct 2021 11:03:40 +0000</pubDate>
				<category><![CDATA[Performans]]></category>
		<category><![CDATA[allocation contention]]></category>
		<category><![CDATA[latch queue]]></category>
		<category><![CDATA[SQL Server 2019 Kurulumu]]></category>
		<category><![CDATA[SQL Server Kurulumu]]></category>
		<category><![CDATA[sql server performance]]></category>
		<category><![CDATA[tempdb]]></category>
		<category><![CDATA[Yunus Emre Işık]]></category>
		<guid isPermaLink="false">https://ynsmr.com/?p=382</guid>

					<description><![CDATA[<p>TempDB veritabanı TempDb geçici işlemlerin tutulduğu bir sistem veritabanıdır. Diğer sistem veri tabanlarına nispeten daha kritik bir konumdadır. Genel olarak şunları barındırır: Geçici tablolar (temp tables) ve bu tablolara ait veriler İstatistik güncellemeleri (Statistics updates) Trigger’lar Online index işlemleri (sort_in_tempdb) Cursor’lar Geçici değişkenler DBCC CheckDb komutu operasyonları Join işlemleri SQL Server servisini yeniden başlattığımızda TempDB ... <a title="TempDB" class="read-more" href="https://ynsmr.com/tempdb/" aria-label="More on TempDB">Devamını oku</a></p>
<p><a href="https://ynsmr.com/tempdb/">TempDB</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>TempDB veritabanı</strong></p>
<p>TempDb geçici işlemlerin tutulduğu bir sistem veritabanıdır. Diğer sistem veri tabanlarına nispeten daha kritik bir konumdadır. Genel olarak şunları barındırır:</p>
<ul>
<li>Geçici tablolar (temp tables) ve bu tablolara ait veriler</li>
<li>İstatistik güncellemeleri (Statistics updates)</li>
<li>Trigger’lar</li>
<li>Online index işlemleri (sort_in_tempdb)</li>
<li>Cursor’lar</li>
<li>Geçici değişkenler</li>
<li>DBCC CheckDb komutu operasyonları</li>
<li>Join işlemleri</li>
</ul>
<p>SQL Server servisini yeniden başlattığımızda TempDB tekrar drop edilip oluşturulur. Diğer veritabanları gibi sürekli değildir. Servis her başladığında Model veritabanından kopyalanarak oluşturulur. TempDB’nin yedeği alınamaz, yedekten geri dönülemez ve recovery modeli değiştirilemez. Simple modeldedir. Drop edilemez. Filegroup sayısı artırılamaz. Collation bilgisi değiştirilemez. Offline ya da read only mode&#8217;a alınamaz. Yukarıda sıraladığımız içeriğinden dolayı, sorgu performansını direkt etkileyen bir sistem veritabanıdır.<br />
TempDb’de bir geçici tablo oluşturduğumuzda, normal veritabanında tablo oluşturduğumuzda nasıl yer ayrılıyorsa (allocation), tempdb de de öyle bir allocation süreci işler. Bu süreçte üç page sözkonusudur. PFS(Page Free Space) , GAM(Global Allocation Map), SGAM(Shared Global Allocation Map). Bir sql server objesini oluşturmak ya da silmek için Sql server PFS ve SGAM page&#8217;lerine yazar. Latch dediğimiz, aşağıda açıkladığımız yapılar bu page&#8217;leri hafızada korur. Her bir tempdb data file için birer adet PFS ve SGAM page mevcuttur.</p>
<p><strong> PFS(Page Free Space) : </strong>Her page için bir byte’lık bir bilgi tutar. Bu bilgi , ilgili page de ne kadar boş alan olduğunu, ne için kullanıldığını tutar. Bir PFS page yaklaşık 64MB boyutunda page’e dair bilgileri tutar. Bir data file içerisinde her 64MB için bir PFS page den söz edebiliriz. Herhangi bir veritabanı data file için ilk page PFS dir. Page ile ilgili bir veritabanı hatasında bunu görebiliriz. Örneğin 2:1:1 ifadesi, database id:2 ve 1 numaralı page demektir. Keza tempdb içn şu ifade 5:3:1 database id : 5, file id:3 ve ilk PFS page i göstermektedir.<br />
<strong>GAM (Global Allocation Map) : </strong>GAM Page her extent (8 page) için, hangisinin dolu hangisinin boş olduğunu gösteren bir bitlik bir bilgi tutar. SQL Server boş extent&#8217;leri bu page&#8217;lere bakarak tespit eder. Her extent için bir bit kullanılması bir GAM page’in 4GB bir alanı yönetmesine olanak tanır. Bir data file’daki ilk GAM page’in page numarası 2’dir. 2:1:2 TempDB deki ilk GAM page’i gösterir.<br />
<strong>SGAM (Shared Global Allocation Map) : </strong>Her extent için yine bir bit olarak mixed extent mi full extent mi bilgisini tutar. SQL server küçük verileri yerleştirmek için boş alan içeren mixed extentleri bulmak için bu page’i kullanır. GAM gibi 4GB lık bir alanı yönetir. Bir data file daki ilk SGAM page’in numarası 3 tür. Yani 2:1:3 tempdb nin ilk SGAM page’idir.</p>
<p>Tempdb içerisinde çok fazla nesne oluşturulduğunda <strong>tempdb contention </strong>oluşur. Yukarıda bahsettiğimiz PFS, GAM ve SGAM page&#8217;lerinde exclusive lock durumu oluşur. Bu durumda sistemde PAGELATCH_xx wait türü görülmeye başlanabilir. Bu beklemenin tempdb contention kaynaklı olduğuna amin olabilmek için wait&#8217;in açıklamasında page&#8217;a dair 2:1:1 gibi bir rakam dizisi görülüyorsa bu beklemenin tempdb contention kaynaklı olduğu söylenebilir. Zira rakam dizisindeki ilk rakam veri tabanı id&#8217;sidir ve tempdb&#8217;nin id&#8217;si 2&#8217;dir.</p>
<p><strong>Latch Kavramı</strong><br />
Buffer pool, işletim sisteminin SQL server için hafızada(memory) rezerve ettiği bir alandır. SQL Server gelen taleplere göre diskten ilgili page’leri memory de buffer pool’a atar. Bu sistem içerisinde, verinin buffer pool içerisinde tutarlılığını korumak için bir sisteme ihtiyaç vardır. Latch, SQL Server’ın memory içindeki bu verinin tutarlılığını sağladığı bir lock mekanizmasıdır. Paylaşılan hafıza haynaklarını korumaya yarar. Bir thread bir page üzerinde çalışmayı talep ettiğinde, aynı anda bir page&#8217;i sadece bir thread değiştirebileceğinden bu latch üzerinde &#8220;latch queue&#8221; denilen kuyruk oluşur. Bu page taleplerini dağıtmak amacıyla tempdb data file sayısının , işlemci çekirdek sayısıyla orantılı olarak artırılması önerilir. Çünkü her bir data file için ayrı bir &#8220;latch queue&#8221; vardır. Bu data file sayısını artırma işlemi thread&#8217;in page&#8217;i bekleme süresini azaltır. Bu da sorgu performansının artması demektir. Aşağıda bu konuyu resmetmeye çalıştım.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-553 size-large" src="https://ynsmr.com/wp-content/uploads/2021/10/latchqueue-1-1024x576.jpg" alt="" width="640" height="360" srcset="https://ynsmr.com/wp-content/uploads/2021/10/latchqueue-1-1024x576.jpg 1024w, https://ynsmr.com/wp-content/uploads/2021/10/latchqueue-1-300x169.jpg 300w, https://ynsmr.com/wp-content/uploads/2021/10/latchqueue-1-768x432.jpg 768w, https://ynsmr.com/wp-content/uploads/2021/10/latchqueue-1.jpg 1280w" sizes="(max-width: 640px) 100vw, 640px" /></p>
<p><strong>TempdDB Metadata Contention</strong><br />
Birden fazla session geçici tablo oluşturduğu esnada, TempDB’nin sistem tablolarına aynı anda erişmek istediğinde <strong>metadata contention </strong>oluşur. Bu iş yükü sistem tablolarında gecikmeye sebep olur ve sorgu performansları düşmeye başlar.</p>
<p><strong>TempDb yapılandırması için öneriler:</strong></p>
<ul>
<li>Antivirüs taramasından SQL Server dosyalarını exclude etmek</li>
<li>TempDB yi ayrı bir diskte ve mümkünse SSD üzerinde tutmak. Data ve Log dosyalarını ayrı diskte tutmak.</li>
<li>Raid0 ya da Raid10 yapısında tutmak.</li>
<li>TempDB yi başka uygulamaların, veritabanlarını kullandığı disklerde konumlandırmamak</li>
<li>Index Rebuild işleminde “sort in tempdb” seçeneği tempdb performansını etkiler. Gereksiz kullanımından kaçınılmalıdır.</li>
<li>Sec/Read ve Avg. Sec/Write oranını takip edip 50ms altında kalmasına dikkat etmek</li>
<li>Şu wait türleri TempDb performansıyla doğrudan ilişkilidir. PAGELATCH_EX, PAGELATCH_UP, CXPACKET</li>
<li>TempDb contention durumunu takip etmek. Microsoft&#8217;un &#8220;allocation contention&#8221; problemini azaltmak için önerilerine <a href="https://docs.microsoft.com/en-US/troubleshoot/sql/performance/recommendations-reduce-allocation-contention" target="_blank" rel="noopener">şu yazıdan</a> ulaşabilirsiniz.</li>
<li>TempDB data file sayısını, sisteminiz 8 core dan az ise core sayınız kadar, 8 core dan fazla ise 8 data file olarak ayarlamak. Data file boyutlarının aynı olması önemlidir. İşlemci sayısının 8 den fazla olduğu durumda 8 den fazla her 4 core için bir data file eklenebileceğini söyleyenler de vardır. Onlarca core içeren sunucular için bu düşünülebilir. Yani 12 core varsa 8 + 1 (kalan 4 core için bir file) = 9. Düşük ölçekli sunucularda daha önceleri 8 core için 8 dosya uygundu. Ancak onlarca core içeren sistemler için yük testi yaparak 8 den fazla dosya sayısına karar vermek daha yerindedir.</li>
<li>Autogrowth özelliği açık olmalı. Tempdb her otomatik büyüme esnasında &#8220;exclusive lock&#8221; mekanizmasıyla kilitlenir. Bu da performansı doğrudan kötü etkiler. Veritabanı kurulurken en uygun başlangıç boyutunu (en az 2048 MB gibi) ve auto growth boyutunu vermek bu yüzden çok önemlidir.</li>
</ul>
<p>TempDB nin sistem üzerinde tutulduğu yer bilgisi için <strong>sp_helpdb tempdb</strong> komutu kullanılabilir.</p>
<p>TempDb&#8217;nin kullandığı disk alanını <strong>sys.dm_db_file_space_usage </strong>DMV&#8217;sini sorgulayarak görebiliriz. Tempdb içerisinde çok fazla yer kaplayan nesneleri görmek için ise <strong>sys.dm_db_session_space_usage </strong>ve <strong>sys.dm_db_task_space_usage </strong>dmv&#8217;leri kullanılabilir.</p>
<p><a href="https://ynsmr.com/tempdb/">TempDB</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ynsmr.com/tempdb/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tips &#038;&#038; Tricks</title>
		<link>https://ynsmr.com/tips-tricks/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tips-tricks</link>
					<comments>https://ynsmr.com/tips-tricks/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 31 Aug 2021 06:15:45 +0000</pubDate>
				<category><![CDATA[İpuçları]]></category>
		<category><![CDATA[backup log db to disk = ‘NUL’]]></category>
		<category><![CDATA[include execution trace messages]]></category>
		<category><![CDATA[Installed SQL Server features discovery report]]></category>
		<category><![CDATA[lock escalation]]></category>
		<category><![CDATA[single user mode]]></category>
		<category><![CDATA[sp_configure]]></category>
		<category><![CDATA[sp_cycle_errorlog]]></category>
		<category><![CDATA[SQL Server Agent]]></category>
		<category><![CDATA[SQL server Tips && Tricks]]></category>
		<category><![CDATA[sys.server_principals]]></category>
		<category><![CDATA[xp_msver]]></category>
		<category><![CDATA[Yunus Emre Işık]]></category>
		<guid isPermaLink="false">https://ynsmr.com/?p=345</guid>

					<description><![CDATA[<p>SQL Server varsayılan port olarak 1433 numaralı portu kullanır. Ancak bu çok yaygın bilinen bir bilgi olduğu için veritabanı saldırılarına önlem olarak bazen DBA&#8217;ler tarafından değiştirilebilir. SQL Server, Always On, Cluster gibi kurulumları kendi domain hesabımızla yapmak daha sonra problem çıkartabilir. Sadece bu kurulumlar için kullanılacak, “password never expire” modunda oluşturulmuş, işletim sistemine oturum açmayan ... <a title="Tips &#038;&#038; Tricks" class="read-more" href="https://ynsmr.com/tips-tricks/" aria-label="More on Tips &#038;&#038; Tricks">Devamını oku</a></p>
<p><a href="https://ynsmr.com/tips-tricks/">Tips &#038;&#038; Tricks</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[<ul>
<li>SQL Server varsayılan port olarak 1433 numaralı portu kullanır. Ancak bu çok yaygın bilinen bir bilgi olduğu için veritabanı saldırılarına önlem olarak bazen DBA&#8217;ler tarafından değiştirilebilir.</li>
<li>SQL Server, Always On, Cluster gibi kurulumları kendi domain hesabımızla yapmak daha sonra problem çıkartabilir. Sadece bu kurulumlar için kullanılacak, “password never expire” modunda oluşturulmuş, işletim sistemine oturum açmayan ve “local admin olmayan” hesaplarla yapılması önerilir.</li>
<li>SQL Server veriyi diskte tutmak ve yönetmek için extent denilen yapıları kullanır. Bir extent 8 page’den oluşur. Her bir page 8 kb’dır ve extent 64 kb boyutundadır. Bu yüzden SQL Server’ın kullanacağı diskleri 64K ile biçimlendirmek önerilir.</li>
<li>SQL Server güncellemeleri ve versiyonları hakkında <a href="https://buildnumbers.wordpress.com/sqlserver/">https://buildnumbers.wordpress.com/sqlserver/</a> sitesinden bilgi alabilir. İhtiyacınız olan paketleri yükleyebilirsiniz.</li>
<li>Transaction Log’un truncate edilmesinin tek yolu transaction log yedeği almaktır. Backup almak ne kadar süre alıyorsa o periyotta yedek alınması önerilir.</li>
<li>Veritabanınızla ilgili güvenlik açıklarına dair Veritabanı &gt;&gt; sağ tuş &gt;&gt; Tasks &gt;&gt; Vulnerability Assessment &gt;&gt; scan for vulnerabilities menüsünden bilgi edinebilirsiniz.</li>
<li>Backup history msdb sistem veritabanında (backupfile, backupset tabloları) tutulur. Alternatif olarak veritabanı sağ tuş à Reports àStandard Reports &gt;&gt; Backup and Restore Events menüsünden de bilgi alınabilir.</li>
<li>Backup özelliklerinde “compressed backup” özelliğinin varsayılan olmasını sağlamak için sunucu özelliklerinde, database settings menüsünden seçim yapılır.</li>
<li>Veritabanı özelliklerinden son alınan backup tarih ve saat bilgisi görülebilir.</li>
<li>Transaction Log’u sanki backup almış gibi truncate edebilmek için şu kod kullanılabilir : “<strong>backup log db to disk = ‘NUL’</strong> “. Buradaki NUL ifadesinin NULL ifadesiyle ilgisi yoktur. Unix’teki \dev\nul gibi bir device ismidir. Ancak üzerine yedek alınması mümkün değildir ve sistem backup almış gibi davranır ve log truncate edilir. Ancak bu çözüm transaction log’un kontrolden çıktığı ve veritabanının durması gibi acil durumlarda kullanılabilecek olan bir çözümdür. Normal şartlarda kullanılması önerilmez.</li>
<li>DBCC LOGINFO komutu sonucunda status alanında “2” değeri görüyorsak o vlf lerin kullanımda olduğunu ve o logda truncate işlemi yapılabileceğini düşünürüz. Log yedeği alıp tekrar baktığımızda status alanındaki 2 rakamlarının büyük oranda kaybolduğunu görürüz.</li>
<li>SQL Server’da sunucu düzeyinde en yetkili rol <strong>sysadmin, </strong>veritabanı düzeyinde en yetkili rol <strong>db_owner</strong>’dır. Oluşturacağımız kullanıcının yönetici yetkileri olmayacaksa db_reader ve db_writer yekileri yeterli olacaktır. Üst seviyeden yetkilendirme yaptıysak (db_owner gibi) alt seviye yetkileri (db_reader, db_writer vb.) yetkileri vermeye gerek kalmaz.</li>
<li>SSMS de cmd komutları çalıştırabilmek mümkündür. Bunun için xp_cmdshell in açılması gerekir. Aşağıdaki şekilde yapılabilir. Ancak bu özelliği açmak ciddi güvenlik riskleri ortaya çıkarır. Dikkatli olunması gerekir. Sysadmin yetkisine sahip kullanıcı xp_cmdshell yardımıyla sisteme ciddi zarar verebileceğinden sysadmin yetkisinin kimseye verilmemesi önemlidir.<br />
<em>exec sp_configure &#8216;show_advanced_options&#8217;, 1</em><br />
<em>reconfigure</em><br />
<em>exec sp_configure &#8216;xp_cmdshell&#8217;, 1</em><br />
<em>reconfigure</em></li>
<li>Yeni bir veritabanı oluşturduğumuzda sistem veritabanlarından olan model veritabanı temel alınır. Oluşturacağımız veritabanlarına dair özellikleri baştan model veritabanı ile belirleyebiliriz.</li>
<li>Oluşturduğumuz bakım planları, job’lar msdb veritabanında tutulur. Bir felaket durumunda bunları kaybetmemek için mutlaka yedeği alınmalıdır.</li>
<li>Oluşturduğunuz Job’ların hangilerinin şu anda çalıştığını görmek için View &gt;&gt; Object Explorer details menüsünü kullanabilirsiniz. SQL Server Agent &gt;&gt; Jobs altında job larınızın mevcut durumu görüntülenir.</li>
<li>Backup/Restore işlemlerinden sonra indexler bozulmaya uğrar. Bu yüzden index bakımını bu işlemlerden sonra yapmakta fayda vardır. Bazı kaynaklarda farklı rakamlar yazsa da genelde fragmantasyon oranı %30 ve üzeri olan index için rebuild işlemi yapılır. %10 ve %30 arası fragmantasyon varsa reorganize işlemi yapılır. Küçük tablolarda defragmantasyon yapmak performans getirisi sağlamaz. Defragmantasyon yapılacak tablonun 1000 page üzerinde olması önerilir.</li>
<li>Rebuild işlemi tüm index verisini tekrardan oluşturur. Bu işlem online yapılır. Bu sebeple fazla disk alanı gerektirir. Online rebuild işlemi enterprise versiyonda mümkündür. Yoksa offline yapılır. Rebuild işleminden sonra istatistikler otomatik olarak güncellenir.</li>
<li>DBCC CHECKDB çok fazla I/O kullanabilen bir komuttur ve tempdb performansını çok etkiler. Bu komutu çalıştırdığımızda veritabanında bozulmalarla karşılaşırsak önerilen en tutarlı yol yedekten geri dönmektir.</li>
<li>Sisteminizde kurulu SQL Server bileşenlerini görmek için başlat menüsünde &#8220;SQL Server Installation Center&#8221; uygulamasını açıp tools menüsü altında <strong>&#8220;Installed SQL Server features discovery report&#8221;</strong> linkini tıklayabilirsiniz.</li>
<li>SQL Server kurulurken Instance&#8217;a isim verilmezse varsayılan olarak sunucu ismini alır. Bu isim &#8220;case sensitive&#8221; değildir. &#8220;DEFAULT&#8221; kelimesi isim olarak seçilemez ve en fazla 16 karakter uzunluğunda olabilir.</li>
<li>SQL Server instance&#8217;ı her restart edildiğinde mevcut error log sonlandırılır ve errorlog1 adını alır, mevcut errorlog1 dosyası errorlog2 adını alır. Belirlenen dosya sayısı limitine kadar bu böyle devam eder.Varsayılan sayı 6 dır. Bu süreç <a href="https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-cycle-errorlog-transact-sql?view=sql-server-ver15" data-linktype="relative-path">sp_cycle_errorlog</a> prosedürüyle servisi restart etmeden de yapılabilir.</li>
<li>Bir tablo için ancak bir tane full text index oluşturulabilir.</li>
<li>Bir kullanıcının disabled ya da enabled olduğunu <strong>sys.server_principals</strong> view&#8217;ından sorgulayabilirsiniz</li>
<li>SSMS de sunucu üzerine sağ tuşa basıp Activity Monitor&#8217;ü açtığımızda Processes tabında <strong>suspended</strong> modundaki işlemleri görmek mümkündür.</li>
<li>MSDB veritabanındaki dbo.backupset tablosundan alınan yedeklere dair bilgi alınabilir.</li>
<li>Sistem veritabanlarında bir bozulma oluşursa ya da sistem collation ayarını değiştirmek istersek bu veritabanlarını rebuild yapabiliriz. Ancak bu işlem sonunda kullanıcıya ait değişiklikler kaybedilir. Msdb veritabanındaki hob lar gibi.</li>
<li>Veritabanında yüksek miktarda verinin bulunduğu bir tablodan büyük boyutlarda veri veri silerken “<strong>lock escalation</strong>” ismi verilen durum ortaya çıkabilir. Bu durum aynı tabloyu kullanan diğer uygulamaların bu işlem bitmeden tabloya erişebilmesine engel olur. Bu işlem SQL Server’ın aslında satır ya da page bazında lock’ları daha kolay yönetmek için tablo bazında lock işlemine çevirmesidir.</li>
<li>Her checkpoint işleminde, SQL Server cache’i tarar ve bütün “dirty page&#8217;leri diske yazar. Dirty Page SQL server bir veriyi diskten okuduktan sonra değişmiş olan veridir. Cache’deki veri ile diskteki veri farklıdır.</li>
<li>Deadlock oluştuğu sırada SQL Server transaction’lardan birini seçip rollback yapar. SQL Server profiler’da yeni trace oluştururken “TSQL_Locks” ile lock’lar izlenebilir.</li>
<li>DAC (Dedicated Admin Connection), SQL Server’a bağlanma problemleri yaşadığımız, istemcilerin bağlanamadığı sıradışı durumlarda bir arka kapı bağlantısı yapmamızı sağlayan bir özelliktir. Veritabanına bağlanıp, mevcut problemi anlamaya çalışmak için sorgular çalıştırmamızı sağlar. Varsayılan olarak sadece lokal bağlantılara izin verir. Uzak yönetici bağlantısı için <strong>sp_configure</strong> prosedürüyle uzak yönetici bağlantısına izin verilmesi gerekir.Bu konu hakkında detay bilgi için <a href="https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/diagnostic-connection-for-database-administrators?view=sql-server-ver15" target="_blank" rel="noopener">şu sayfaya</a> göz atabilirsiniz.</li>
<li>SQL Server loglarının çok büyümesini engellemek için, SQL Agent’ın özelliklerinden <strong>“include execution trace messages”</strong> seçeneğini kapatmak faydalı olacaktır. Bu özelliği sadece Agent ile ilgili problemleri araştırırken açmak önerilir.</li>
<li>SQL Server&#8217;ı &#8220;<strong>single user mode</strong>&#8221; ile başlatmak, sunucudaki lokal yönetici hesaplarının veritabanında sysadmin yetkileriyle oturum açmasını sağlar.</li>
<li>Restore işlemleri esnasında backup dosyalarımızın olduğu klasör boş görünüyorsa, o klasöre servis hesabının izinli olarak eklenmesi gerekir.</li>
<li><strong>xp_msver</strong> komutu SQL server versiyonu ve üzerinde çalıştığı sunucu hakkında bilgiler verir.</li>
<li>Proxy account bir job adımının çalışırken servis hesabı dışında biaşka bir hesapla çalışmasını sağlayan bir yapıdır. Proxy account’un bir de yetkili bir kullanıcı adı ve şifresini saklayan credential nesnesi vardır.</li>
<li>Veritabanınızdaki güvenlik açıklarını Veritabanı &gt;&gt; sağ tuş &gt;&gt; tasks &gt;&gt; vulnerability assessment menüsünden tespit edebilirsiniz</li>
<li>Veritabanınızın mevcut konfigürasyon ayarlarını şu komut yardımıyla öğrenebilirsiniz.<br />
USE master;<br />
GO<br />
SELECT * FROM sys.configurations;<br />
GO</li>
<li>Bir veritabanını yeni versiyon bir instance&#8217;a restore ya da attach ettiğinizde, siz değiştirmedikçe database compatibility level değişmez. Database özelliklerinden değiştirmek zorundasınız.</li>
<li>Bir login silindiğinde ya da bir veritabanı yeni bir instance&#8217;a taşındığında login ile ilişkili &#8220;database user&#8221; <strong>orphaned (yetim)</strong> statüsüne düşer. <strong>sp_change_users_login</strong> sistem prosedürüyle bu kullanıcılar öğrenilebilir ve bir login&#8217;e atanabilir.</li>
<li>SQL Server backup dosyalarında da , data ve log dosyalarında da (mdf, ndf, ldf) farklı uzantılar kullanılabilir. Ancak, örneğin primary data file için <strong>mdf</strong> uzantısı önerilmektedir.</li>
<li>Master veritabanı zarar görürse SQL Server başlamaz. Bu yüzden düzenli yedeğinin alınması önerilir. Aynı şekilde model veritabanı da hazır bulunmadığı sürece SQL Server başlamaz.</li>
<li>Msdb veritabanı bakım planları, job&#8217;lar, operatörler vb. SQL Agent tarafından yürütülen bir çok iş ve objeyi tutar. Bu yüzden yedek alınması önerilir.</li>
<li>Management Studio&#8217;da gördüğümüz dört sistem veritabanı haricinde bir görünmeyen resources sistem veritabanı vardır. Sistem objelerini tutar. Detaylı bilgi için <a href="https://docs.microsoft.com/en-us/sql/relational-databases/databases/resource-database?view=sql-server-ver15" target="_blank" rel="noopener">şu yazıya</a> bakabilirsiniz.</li>
<li>Veritabanı dosyalarının diskte ne kadar yer tuttuğuna dair sys.dm_db_file_space_usage dmv&#8217;sini sorgulayabilirsiniz.</li>
<li>Buffer Pool Extension buffer pool&#8217;u kalıcı disklere extend etmek(genişlertmek) için kullanılan bir disk alanıdır. SSD disk kullanılması hem fiyat hem performans açısından önerilir. Disk bozulmalarında veri kaybı yaşanmaması için Buffer Pool Extension alanında commit edilmiş veri tutulur. Dirty page dediğimiz yapılar tutulmaz. Sisteminizde aktif olup olmadığını aşağıdaki dmv&#8217;yi sorgulayarak öğrenebilirsiniz. <strong>sys.dm_os_buffer_pool_extension_configuration </strong></li>
<li>DBCC CHECKDB komutu, kontrol edilen veritabanıyla aynı disk bölümünde gizli dosyalar oluşturur. Bu yüzden veritabanının olduğu bölümde yeterli boş alan olması gerekir. Tutarlı verinin yedeğini aldığımız bilgisini bize vereceği için DBCC CHECKDB komutunu cyedek almadan önce çalıştırmak tavsiye edilir.</li>
<li>7/24 çalışan sistemlerde DBCC CHECKDB komutunu aktif veritabanında değil de, en son yedeğin yüklendiği test veritabanında ya da always on kullanıyorsak ikincil veritabanında çalıştırmak performans açısından daha iyi olacaktır.</li>
<li>İndex&#8217;lerin fragmantasyon durumlarını <strong>sys.dm_db_index_physical_stats</strong> DMV&#8217;sinden avg_fragmentation_in_percent kolonundan gözlemleyebilirsiniz. SSMS&#8217;de de bu bilgiye erişmek mümkündür.</li>
<li>SQL Server&#8217;da veritabanı şu durumlardan birinde bulunur: ONLINE, OFFLINE, RESTORING, RECOVERING, RECOVERY PENDING, SUSPECT, EMERGENCY. Bu durumların ne anlama geldiğini <a href="https://docs.microsoft.com/en-us/sql/relational-databases/databases/database-states?view=sql-server-ver15" target="_blank" rel="noopener">şu yazıdan</a> öğrenebilirsiniz.</li>
<li>Veritabanımızın iş yükünü (data ve log için I/O miktarı) <strong>dm_io_virtual_file_stats </strong>dmf&#8217;sini sorgulayarak öğrenebiliriz. Parantez içindeki iki parametreyi NULL girerek tüm veritabanlarına dair sonuç alabiliriz.<br />
SELECT * FROM sys.dm_io_virtual_file_stats (database_id, file_id );<br />
GO</li>
<li>Veritabanın database_id değerini <strong>SELECT DB_ID(N&#8217;database_name&#8217;) AS [Database ID]</strong> sorgusuyla bulabiliriz.</li>
<li>Veritabanı her büyümede işletim sisteminden alan istediğinde, performans kaybı oluşmaması için auto growth boyutunun makul verilmesi önemlidir. Duruma göre değişebilmekle birlikte genel best practice öneri data file boyutunun sekizde biri kadar artış vermektir.</li>
<li>Always On ortamında secondary sunucu backup almak isterse, primary sunucuya bunu bildirir. Primary sunucu, birden fazla secondary sunucunun aynı anda backup almasını engellemek için veritabanını BulkOp adı verilen mekanizma ile kilitler ve bu durumu ikincil sunucuya bildirir</li>
<li>Sql Server instance&#8217;ının &#8220;Locked memory model&#8221; de çalışıp çalışmadığını Error Log&#8217;un başında şu cümle varsa anlayabiliriz: &#8220;Using locked pages in the memory manager&#8221;</li>
<li>Alınan başarılı yedeklerin log oluşturmasını engellemek için 3226 numaralı tracel flag&#8217;i açabiliriz</li>
<li>SQL Server içerisinde mevcut bulunan mevcut stored prosedür&#8217;lerin listesini almak için <strong>&#8220;exec sp_help&#8221;</strong> yazıp çalıştırabilirsiniz</li>
</ul>
<p><a href="https://ynsmr.com/tips-tricks/">Tips &#038;&#038; Tricks</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ynsmr.com/tips-tricks/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Server&#8217;da Wait Statistics Konusu</title>
		<link>https://ynsmr.com/sql-serverda-wait-statistics-konusu/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sql-serverda-wait-statistics-konusu</link>
					<comments>https://ynsmr.com/sql-serverda-wait-statistics-konusu/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 13 Jul 2021 14:16:43 +0000</pubDate>
				<category><![CDATA[Performans]]></category>
		<category><![CDATA[LCK_M_]]></category>
		<category><![CDATA[LCK_M_U]]></category>
		<category><![CDATA[PAGEIOLATCH]]></category>
		<category><![CDATA[PAGELATCH]]></category>
		<category><![CDATA[performance tuning]]></category>
		<category><![CDATA[Sql Server]]></category>
		<category><![CDATA[sql server performance]]></category>
		<category><![CDATA[wait statistics]]></category>
		<category><![CDATA[wait types]]></category>
		<category><![CDATA[WRITELOG]]></category>
		<category><![CDATA[Yunus Emre Işık]]></category>
		<guid isPermaLink="false">https://ynsmr.com/?p=298</guid>

					<description><![CDATA[<p>SQL server’da “wait statistics” performans ve performans kaynaklı sorunların analizi ve de optimizasyon  için çok önemli bir araçtır.  SQL server’a bir veri isteği geldiğinde bu istek normal, optimum şartlarda işlemcinin hızına göre hemen gerçekleştirilebilecek bir işlem iken, kaynakların (ram, işlemci core sayısı, disk boyut ve hızı vb.) sınırlı olması ve gelen isteğin çokluğu sebebiyle işlemci ... <a title="SQL Server&#8217;da Wait Statistics Konusu" class="read-more" href="https://ynsmr.com/sql-serverda-wait-statistics-konusu/" aria-label="More on SQL Server&#8217;da Wait Statistics Konusu">Devamını oku</a></p>
<p><a href="https://ynsmr.com/sql-serverda-wait-statistics-konusu/">SQL Server&#8217;da Wait Statistics Konusu</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p>SQL server’da <strong>“wait statistics”</strong> performans ve performans kaynaklı sorunların analizi ve de optimizasyon  için çok önemli bir araçtır.</p>



<p> SQL server’a bir veri isteği geldiğinde bu istek normal, optimum şartlarda işlemcinin hızına göre hemen gerçekleştirilebilecek bir işlem iken, kaynakların (ram, işlemci core sayısı, disk boyut ve hızı vb.) sınırlı olması ve gelen isteğin çokluğu sebebiyle işlemci bu istekleri hemen yerine getiremez, bir işlem kuyruğuna sokar ve bu istekler için bekleme sözkonusu olur. İşte SQL Server bu beklemeleri türü, süresi vb. bilgileriyle kaydeder. Çeşitli bekleme türleriyle ilgili bu kayıtlara wait statistics adı verilir. Yüzlerce wait türü vardır. Performans analizi yapabilmemiz için çok önemli göstergelerdir. Performance counters ile birlikte yorumlamak daha doğru sonuçlar üretmemizi sağlar.</p>





<p>Beklemeler temel olarak iki kategoriye ayrılır:</p>



<p><strong>Kaynak Beklemeleri (Resource Wait)</strong> : Görev bekleme listesindedir ve <strong>suspended </strong>statüsündedir. Disk/hafıza&#8217;da yazma/okuma beklemesi ya da başka bir transaction tarafından kilitlenen page&#8217;in beklenmesi gibi.</p>



<p><strong>Sinyal Beklemeleri (Signal Wait) : </strong>Görev <strong>runnable </strong>statüsündedir ancak işlemcide sıra beklemektedir</p>



<p> SQL server’a bir istek(request) geldiğinde bu istek kendisine bir “worker thread” atanan bir  göreve dönüştürülür. Bir istek “worker thread” talep ettiğinde,  SQL server bu isteğe atamak için boşta bir worker thread arar. Bulamazsa ya da sunucunun maximum worker threads limitine ulaşılmışsa istek kuyruğa eklenir ve herhangi bir worker thread’in boşa çıkmasını bekler. Worker thread sayısı sunucumuzun özelliklerine göre parametrik belirlenen bir rakamdır. Örneğin 64 bit ve 4’ten fazla core içeren bir sunucuda worker thread sayısı 512+((core sayısı -4)*16) formülüyle bulunur. 16 core içeren bir sunucu için bu rakam 704 e tekabül eder. Aşağıdaki ekranda maximum worker threads ile iligili bir ayar sözkonusudur.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-312" src="https://ynsmr.com/wp-content/uploads/2021/07/image-2.png" alt="" width="557" height="487" srcset="https://ynsmr.com/wp-content/uploads/2021/07/image-2.png 743w, https://ynsmr.com/wp-content/uploads/2021/07/image-2-300x262.png 300w" sizes="(max-width: 557px) 100vw, 557px" /></figure>



<p> Proses diskte yüklü uygulamanın çalıştırıldığı, hafızaya yüklendiği, işlemci tarafından yürütüldüğü anda aldığı isimdir. Bir proses birden fazla thread barındırabilir ve buna <strong>multithreading</strong> adı verilir.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&nbsp;</p>
</blockquote>



<p>  Örneğin bir select sorgusu çalıştırdık diyelim, bu sorgunun istediği bilgi için önce buffer pool’a bakılır. Burada yoksa diske gider thread, diskten yanıt beklediği sırada <strong>suspended</strong> statüsündedir ve PAGEIOLATCH wait türü oluşur. Veri diskten alınıp buffer pool’a taşındığında statüsü <strong>runnable</strong> dır ancak bu kez de CPU zamanlayıcısından sinyal beklemeye başlar. Kuyruğun sonundadır. CPU core ları başka threat lerle meşguldür. Sıra kendisine geldiğinde listenin başına alınır ve sorgu çalıştırılır. <span style="font-size: inherit;">Her ne kadar bu işlemlerin bazısı eş zamanlı gerçekleşse de aşağıda bu işlemleri bir nebze sıralı olarak şematize etmeye çalıştım:</span></p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-301" src="https://ynsmr.com/wp-content/uploads/2021/07/waitsema-1-1024x576.png" alt="" width="768" height="432" srcset="https://ynsmr.com/wp-content/uploads/2021/07/waitsema-1-1024x576.png 1024w, https://ynsmr.com/wp-content/uploads/2021/07/waitsema-1-300x169.png 300w, https://ynsmr.com/wp-content/uploads/2021/07/waitsema-1-768x432.png 768w, https://ynsmr.com/wp-content/uploads/2021/07/waitsema-1.png 1280w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>Wait istatistiklerine ait bilgi alabileceğimiz iki önemli DMV (dynamic management view) vardır:<br /><strong>sys.dm_os_waiting_tasks :  </strong>herhangi bir kaynağı bekleyen aktif görevleri<br /><strong>sys.dm_os_wait_stats</strong> :  instance seviyesinde, sql server servisinin son başlamasından bu yana toplam bekleme sürelerini gösterir.</p>



<p>Sunucunun son başlamasından bu yana toplanmış olan bu istatistikler aşağıdaki komutla temizlenebilir:</p>



<p>DBCC SQLPERF(&#8216;sys.dm_os_wait_stats&#8217;,CLEAR);Bir de SQL Server 2016 versiyonuyla birlikte gelen<strong> sys.dm_exec_session_wait_stats</strong> view’ı vardır ve session bazında thread’lerin karşılaştığı beklemeleri gösterir.</p>





<p> Yukarda bahsettiğimiz <strong>sys.dm_os_wait_stats</strong> view’ını sorguladığımızda aşağıdaki bilgileri alırız:<br /><strong><br />Wait_type :</strong> Gerçekleşen bekleme türü<br /><strong>Waiting_task_count :</strong> Bu bekleme türü kaç kez gerçekleşti<br /><strong>Wait_time_ms :</strong> Wait_type alanında belirtilen beklemenin toplam geçen zamanı. signal_wait_time_ms bekleme süresini de içerir. Runnable ve suspended statüsünde kuyrukta harcanan toplam zamanı gösterir. <br /><strong>Max_wait_time_ms :</strong> Bir thread in bu bekleme türü için beklediği en fazla süre<br /><strong>signal_wait_time_ms</strong> : Thread’in runnable statüsünde kuyrukta CPU beklediği zaman. Yüksek değerler görüyorsak CPU darboğazı(bottleneck) olduğunu düşünürüz.<br /><br />Latch, Hafızadaki veriyi korumak için kullanılan bir lock mekanizmasıdır ve kullanıcı tarafından kontrol edilemez. Bir proses latch için beklediğinde de bazı beklemeler oluşur. Latch&#8217;in üç türü vardır ve bu üç türe göre aşağıdaki isimlendirmelerde beklemeler kaydedilir: <br />      &#8211; <strong>I/O Latch :</strong> PAGEIOLATCH_*<br />      &#8211; <strong>Buffer Latch :</strong> PAGELATCH_*<br />      &#8211; <strong>Non-buffer latch :</strong> LATCH_*<br /><br />Yukarıdaki tanımlamalardan sonra SQL Server’ı gözlemlemek için hangi wait türlerinin takibinin önemli olduğu konusuna geçebiliriz. CPU yoğunluğu, I/O yoğunluğu, memory yoğunluğu, block/deadlock durumları gibi durumları analiz etmek için yaygın olarak gözlemlediğimiz wait türleri vardır. Yüzlerce bekleme türü var ancak SQL Server performansını gözlemlemek için yaygın olarak aşağıdakiler izlenir.</p>



<p><strong>PAGEIOLATCH_* :</strong> Bir görev buffer pool&#8217;da olmayan bir Page&#8217;in diskten getirilmesini bekliyor. I/O yoğunluğu yüksek veri tabanlarında çok sık görülen bir beklemedir. Bu beklemeyi sık görüyorsak diskte I/O darboğaz(bottleneck) oluştuğundan söz edebiliriz. Disk sistemlerinizin Sql Sever&#8217;a cevap vermekte yavaş kaldığına işaret eder. Ancak bu gecikme başka sebeplerden de kaynaklanabilir. Optimize olmayan sorgular, index sorunları, güncel olmayan istatistikler, implicit conversion gibi konular da sebep olabilir. _sh shared latch , _up update latch, _ex exclusive latch için beklendiğini gösterir.<br /><br /><strong>PAGELATCH : </strong>PAGELATCH beklemesi, bir görevin(task), başka bir task tarafından latch edilmiş(lock), buffer pool&#8217;daki page&#8217;e erişmek için beklediğini gösterir. İndex&#8217;lemenin gözden geçirilmesi, partitioning çalışması ve tempdb performansının iyileştirimlesi gibi çalışmalarla azaltılabilir. </p>
<p><strong>WRITELOG : </strong>Transaction commit edildiğinde ya da checkpoint işleminde log block diske yazılırken oluşan bekleme türüdür. Bir task transaction log bloğunun diske yazılmasını beklemektedir. Çok sık karşılaşılıyorsa transaction log&#8217;ların bulunduğu disklerde bir problem varlığından söz edilebilir. Ancak yine tek sorun diskler olmayabilir. Çok fazla transaction çok sık aralıklarla commit ediliyorsa bu da sebep olabilir. Transaction sayısı azaltılabilir. Yine gereksiz index&#8217;ler de bu beklemeye sebep olur. Bir tabloda ne kadar fazla index varsa, tablo her insert/update aldığında oluşan log miktarı da o kadar fazla olur. İndex parçalanmaları da yine bu beklemeye sebep olabilir. <br /><br /><strong>LCK_M_* : </strong>Thread veriye erişmek ve lock koymak için başka bir görevin kilitlediği kaynağı bekliyor. M harfinden sonra gelen harf lock türünü gösterir. LCK_M_S shared lock, LCK_M_U update lock, LCK_M_X exclusive lock bazı örnekleridir. 60&#8217;dan fazla türü vardır. Şu sebeplerle görülür genel olarak:<br />&#8211; Büyük bir tablo tarama ya da update işlemi tabloda &#8220;lock escalation&#8221; a sebep oluyor.<br />&#8211; Ulaşılan datadaki gereksiz shared lock&#8217;lar <br />&#8211; Optimize edilmesi gereken update, insert sorguları var (LCK_M_U )<br />&#8211; Optimize edilmesi gereken select sorguları var (LCK_M_S )</p>



<p><strong>RESOURCE_SEMAPHORE</strong> : Bir worker thread bir sorgu için memory kaynağı beklerken ortaya çıkar. Çok fazla hafıza ihtiyacı olan eş zamanlı sorguların çok fazla olduğu sistemlerde görülür. Bu bekleme türünü ve memory_allocation_ext beklemesini alıyorsak veri tabanımız üzerinde memory baskısı olduğunu düşünebiliriz.</p>



<p><strong>I/O_COMPLETION, ASYNC_I/O_COMNPLETION : </strong>Backup gibi uzun süren I/O işlemlerinde görülebilir. Bu bekleme türünü görüyorsak diskte bir darboğaz(bottleneck) oluştuğunu düşünebiliriz.<br /><br /><strong>CXPACKET : </strong>Paralel sorgu çalıştırılması sırasında thread&#8217;lerin senkronizasyonu için beklenen zamandır. Kaynaklara dair bir darboğaz olduğunu göstermez. Veri tabanında paralel sorguların çalıştığını ve beklenenden fazla zaman aldığını gösterir. Belirli bir miktar işi on tane işçiye paylaştırdığımızı farzedelim, işçilerden bazıları işlerini erkenden bitirdi ve yeni iş bekliyorlar. İstatistikler güncellenerek azaltılabilir.<br /><br /><strong>SOS_SCHEDULER_YIELD: </strong>Thread’in işlemciden zamanlayıcı(scheduler) beklediği ve runnable statüsünde olduğu süredir.<br /><br /><strong>THREADPOOL : </strong>Yukarda daha önce bir isteğin kendisine “worker thread” atanması için beklediğinden bahsetmiştik. Bu bekleme o anda oluşur. İşlemci sayısına göre worker thread sayısı olduğunu gözönüne alırsak, bu beklemeyi sürekli görüyorsak sunucumuzun işlemci core sayısını artırmamız gerektiğini düşünebiliriz. Ya da maximum worker thread sayısı düşük kalmış olabilir.<br /><br /><strong>ASYNC_NETWORK_IO : </strong>Network’te darboğaz oluştuğu gibi yorumlanır ama tek sebebi bu değildir. Veri tabanımızı kullanan uygulamanın satır satır veri çekip işlediği durumlarda oluşur. Bir satır çeker işler, bir satır daha çeker işler böyle devam eder. İstemcinin veri tabanından çektiği veriyi kullanma şekli sebebiyle oluşturduğu bir beklemedir. </p>



<p><strong>HADR_WORK_QUEUE : </strong>Always On yapısına dahil olan veri tabanları için ayrılmış olan thread&#8217;lerin görev atanmasını beklediklerini gösterir. Boşta kalma bekleme süresini gösterdiği için yüksek olması umulur.</p>
<p>Son olarak, beklemeler tek başlarına tüm sistem performansı hakkında yeterli bilgi vermezler. Sql Server&#8217;ı barındıran işletim sisteminin performansına dair bazı bilgilere de ihtiyaç duyarız. İşletim sistemine dair bu bilgilere de performans counters adı verilen sayaçları izleyerek ulaşırız. Bu sayaçlar bize sistem kaynakları üzerindeki yoğunluğu ve beklemeleri(queue) gösterir. Wait türlerini ve kuyrukları(queue) birlikte izlemek daha iyi sonuç verecektir</p>



<p>&nbsp;</p>



<p>&nbsp;</p>
<p><a href="https://ynsmr.com/sql-serverda-wait-statistics-konusu/">SQL Server&#8217;da Wait Statistics Konusu</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ynsmr.com/sql-serverda-wait-statistics-konusu/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>I/O Bottleneck</title>
		<link>https://ynsmr.com/i-o-bottleneck/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=i-o-bottleneck</link>
					<comments>https://ynsmr.com/i-o-bottleneck/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 29 Jun 2021 21:24:49 +0000</pubDate>
				<category><![CDATA[Performans]]></category>
		<category><![CDATA[I/O bottleneck]]></category>
		<category><![CDATA[sql server performans]]></category>
		<category><![CDATA[Yunus Emre Işık]]></category>
		<guid isPermaLink="false">https://ynsmr.com/?p=136</guid>

					<description><![CDATA[<p>  Sql Server performansını etkileyen en önemli etkenlerden biri depolama(storage) performansıdır. Çünkü Yazma, okuma işlemlerinde aygıtlar içerisinde en yavaşı olan depolama birimleri ve özellikle disklerdir. Veri depolama yapılarında(disk, ssd vb.) tutulur ve çalışma esnasında hafızaya(memory) taşıma, güncelleme, kopyalama vb. gibi bir çok işlem görebilir. Diskten hafızaya oradan tekrar diske taşınabilir. Sql Server’ın yürüttüğü bu işlemlerde ... <a title="I/O Bottleneck" class="read-more" href="https://ynsmr.com/i-o-bottleneck/" aria-label="More on I/O Bottleneck">Devamını oku</a></p>
<p><a href="https://ynsmr.com/i-o-bottleneck/">I/O Bottleneck</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p>  Sql Server performansını etkileyen en önemli etkenlerden biri depolama(storage) performansıdır. Çünkü Yazma, okuma işlemlerinde aygıtlar içerisinde en yavaşı olan depolama birimleri ve özellikle disklerdir. Veri depolama yapılarında(disk, ssd vb.) tutulur ve çalışma esnasında hafızaya(memory) taşıma, güncelleme, kopyalama vb. gibi bir çok işlem görebilir. Diskten hafızaya oradan tekrar diske taşınabilir. Sql Server’ın yürüttüğü bu işlemlerde performans kaybı oluştuğunda I/O Bottleneck (darboğaz) durumu oluşabilir. Bu performans kayıpları bazı bekleme türlerinde(wait types) kendisini gösterir. Bu durumda işlemlerimizin optimum performansla yürütülmeye devam edilebilmesi için depolama performansının gözlenmesi gerekir.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-141" src="https://ynsmr.com/wp-content/uploads/2021/06/image-11.png" alt="" width="696" height="233" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-11.png 928w, https://ynsmr.com/wp-content/uploads/2021/06/image-11-300x100.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/image-11-768x257.png 768w" sizes="(max-width: 696px) 100vw, 696px" /></figure>



<p><strong>Bu bekleme türlerine (wait types) dikkat!</strong><br /><br /><strong>sys.dm_os_wait_stats</strong> view’ı çalıştırılan tüm görevlere dair bekleme durumları ile ilgili edinebileceğimiz view’dır. Aşağıdaki bekleme türlerinde performas kaybı gözlediğimizde sistemde I/O Bottleneck oluştuğunu düşünebiliriz.<br /><br />•PAGEIOLATCH <br />•WRITELOG <br />•TRACEWRITE <br />•SQLTRACE_FILE_WRITE_IO_COMPLETION <br />•ASYNC_IO_COMPLETION <br />•IO_COMPLETION <br />•LOG_BUFFER</p>



<p><strong>Nasıl İzlenir?</strong></p>



<p>Microsoft’un «best practice» en iyi deneyimlerinde bottleneck(darboğaz) durumu ile ilgili bazı sayaçlar (performance counter) ve referans değerler belirlenmiştir. Bu darboğazı gözlemlemek için <strong>Performance Monitor</strong> aracı ve sayaçlar (performance counters) kullanılır. SQL server ile ilgili yüzlerce sayaç vardır ancak disk performansını gözlemlemek için gerekli olanları aşağıda özetlemeye çalıştım. Bunları <strong>sys.dm_os_performance_counters</strong> dmv’si aracılığıyla görebiliriz. Bu izleme yavaş diskler, tıkanan işlemler vb. sorunlarda bize yardımcı olur.</p>



<figure class="wp-block-image size-large is-resized"><a href="https://ynsmr.com/wp-content/uploads/2021/06/image-12.png"><img loading="lazy" decoding="async" class="wp-image-143" src="https://ynsmr.com/wp-content/uploads/2021/06/image-12.png" alt="" width="331" height="200" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-12.png 662w, https://ynsmr.com/wp-content/uploads/2021/06/image-12-300x181.png 300w" sizes="(max-width: 331px) 100vw, 331px" /></a></figure>



<figure class="wp-block-image size-large is-resized"><a href="https://ynsmr.com/wp-content/uploads/2021/06/image-13.png"><img loading="lazy" decoding="async" class="wp-image-145" src="https://ynsmr.com/wp-content/uploads/2021/06/image-13.png" alt="" width="423" height="282" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-13.png 846w, https://ynsmr.com/wp-content/uploads/2021/06/image-13-300x200.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/image-13-768x511.png 768w" sizes="(max-width: 423px) 100vw, 423px" /></a></figure>



<p>SQL Server’ın kullandığı depolama ünitelerinin performansı üç farklı yönden ölçülür. Bunlar:</p>
<ul>
<li>Saniyedeki I/O işlemleri (I/O operations per second, IOPS)</li>
<li>Akan veri miktarı diyebileceğimiz disk throughput</li>
<li>Gecikme (Disk Latency)</li>
</ul>
<p>Bunların nasıl ölçülebileceğini sırayla açıklayalım</p>
<ul>
<li>IOPS şu performans sayaçlarıyla ölçülür:</li>
</ul>
<p><strong>Disk Reads / Sec :</strong> Saniyedeki okuma sayısı<br /><strong>Disk Writes / Sec :</strong> Saniyedeki yazma sayısı</p>
<ul>
<li>Throughput kavramı periyodik belirli bir sürede aktarılan veri miktarını ifade eder. Şu sayaçlarla ölçülür:</li>
</ul>
<p><strong>Disk Read Bytes / Sec :</strong> Okuma işlemleri sırasında diskten saniyede okunan veri miktarı<br /><strong>Disk Bytes /Sec :</strong> Okuma ya da yazma işlemleri boyunca diskten okunan ya da yazılan veri miktarı<br /><strong>Disk Write Bytes / Sec : </strong>Yazma işlemleri boyunca saniyede diske yazılan veri miktarı</p>
<ul>
<li>Latency(gecikme) I/O isteğinin oluşmasından cevap gelmesi arasında geçen süreyi ifade eder. Şu sayaçlarla ölçülür:</li>
</ul>
<p><strong>Avg. Disk sec / Read : </strong>Diskten veriyi okumak için geçen ortalama zaman<strong><br />Avg. Disc Sec / Write : </strong>Diske veriyi yazmak için geçen ortalama zaman <strong> </strong></p>
<p>Microsoft’un her  iki sayaç için best practice değerleri şunlardır:</p>
<p>Log Dosyaları için 1-5 ms (1ms ideal)<br />OLTP Data dosyaları için 4-20 ms (10 ms ideal)<br />OLAP Data dosyaları için &lt;= 30 ms</p>
<p>Aşağıdaki tabloda I/O performansını ölçmek için kullanılan diğer bazı sayaçların anlamlarını ve referans değerlerini görebiliriz. </p>



<figure class="wp-block-table">
<table class="has-subtle-light-gray-background-color has-fixed-layout has-background">
<tbody>
<tr>
<td> </td>
<td> </td>
<td><span style="color: #ff0000;"><strong>Referans Değeri</strong></span></td>
</tr>
<tr>
<td><strong><span class="has-inline-color" style="color: #a30012;">Physical Disk</span></strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><strong>%DiskTime</strong></td>
<td>Fiziksel ya da mantıksal disk bölümlerinin ne yoğunlukta kullanıldığı</td>
<td>Avg Disk Queue Length değerinin 100 katından fazla olmamalı</td>
</tr>
<tr>
<td><strong>Avg. Disk Queue Length</strong></td>
<td>Her bir disk ya da disk bölümü için I/O kuyruğu oluşturan ortalama bekleyen kuyruk (okuma ve yazma) sayısı</td>
<td>=2</td>
</tr>
<tr>
<td><strong>Split IO/Sec</strong></td>
<td>Diske yapılan I/O’nun birden çok I/O&#8217;ya bölünme hızını gösterir.Sıfırdan farklı bir değer diskteki fragmantasyonu ve performansın etkilendiğini gösterir.</td>
<td>=0</td>
</tr>
<tr>
<td><strong><span class="has-inline-color" style="color: #a30028;">Process</span></strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><strong>IO Data Bytes/sec</strong></td>
<td>Her bir prosesin disk kullanımı toplam diskten ne kadarını kullanıyor? En çok I/O tüketen proses.</td>
<td> </td>
</tr>
<tr>
<td><strong>IO Other Bytes/sec</strong></td>
<td>Sql Server’ın veritabanı hariç kullandığı sistem kaynağı</td>
<td> </td>
</tr>
</tbody>
</table>
</figure>



<p>&nbsp;</p>
<p><a href="https://ynsmr.com/i-o-bottleneck/">I/O Bottleneck</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ynsmr.com/i-o-bottleneck/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Server&#8217;da Backup Seçenekleri, Transaction Log Yapısı ve Restore</title>
		<link>https://ynsmr.com/sql-serverda-backup-restore/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sql-serverda-backup-restore</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sat, 26 Jun 2021 21:33:53 +0000</pubDate>
				<category><![CDATA[Yedekleme]]></category>
		<category><![CDATA[Differential Backup]]></category>
		<category><![CDATA[Full Backup]]></category>
		<category><![CDATA[Log Sequence Number]]></category>
		<category><![CDATA[Restore]]></category>
		<category><![CDATA[Sql Server]]></category>
		<category><![CDATA[sql server backup]]></category>
		<category><![CDATA[Transaction Log]]></category>
		<category><![CDATA[Transaction Log Backup]]></category>
		<category><![CDATA[transaction log nedir]]></category>
		<category><![CDATA[write ahead logging]]></category>
		<category><![CDATA[Yunus Emre Işık]]></category>
		<guid isPermaLink="false">https://ynsmr.com/?p=62</guid>

					<description><![CDATA[<p>SQL Server&#8217;da üç tür backup almak mümkündür. Full, Differantial ve Transaction Log backup. Alınan backup&#8217;ların history bilgisi MSDB veritabanında tutulur. Bununla ilgili şu sayfaya bakabilirsiniz. Full Backup : İsminden tahmin edileceği üzere veritabanının tamamının kopyasının alınmasıdır. Kopyanın alındığı tarih ve saate, veritabanımızı başka bir dosyaya ihtiyaç duyulmadan restore yani geri yükleme yapabiliriz. Differantial Backup : ... <a title="SQL Server&#8217;da Backup Seçenekleri, Transaction Log Yapısı ve Restore" class="read-more" href="https://ynsmr.com/sql-serverda-backup-restore/" aria-label="More on SQL Server&#8217;da Backup Seçenekleri, Transaction Log Yapısı ve Restore">Devamını oku</a></p>
<p><a href="https://ynsmr.com/sql-serverda-backup-restore/">SQL Server&#8217;da Backup Seçenekleri, Transaction Log Yapısı ve Restore</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p>SQL Server&#8217;da üç tür backup almak mümkündür. Full, Differantial ve Transaction Log backup. Alınan backup&#8217;ların history bilgisi MSDB veritabanında tutulur. Bununla ilgili <a href="https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/backup-history-and-header-information-sql-server?view=sql-server-ver15" target="_blank" rel="noopener">şu sayfaya</a> bakabilirsiniz.</p>



<p><strong>Full Backup : </strong>İsminden tahmin edileceği üzere veritabanının tamamının kopyasının alınmasıdır. Kopyanın alındığı tarih ve saate, veritabanımızı başka bir dosyaya ihtiyaç duyulmadan restore yani geri yükleme yapabiliriz.</p>



<figure class="wp-block-image size-large is-resized is-style-default"><img loading="lazy" decoding="async" class="wp-image-63" src="https://ynsmr.com/wp-content/uploads/2021/06/fullBackup.png" alt="Full backup" width="183" height="171" srcset="https://ynsmr.com/wp-content/uploads/2021/06/fullBackup.png 365w, https://ynsmr.com/wp-content/uploads/2021/06/fullBackup-300x281.png 300w" sizes="(max-width: 183px) 100vw, 183px" /></figure>



<p><strong>Differantial Backup : </strong>Bir önceki full backup&#8217;tan bu yana veritabanında yapılmış olan değişikliklerin yedeğidir<strong>. </strong>Büyük boyutlu, yoğun işlem gören veritabanlarında sürekli full backup almak hem donanım kaynakları açısından hem de zaman yönetimi açısından maliyetli bir işlemdir. Bu maliyeti tolere edebilmek differantial backup alarak mümkündür. Bu backup türü bir full backup’ı temel alır ve temel aldığı full backup tan bu yana veritabanının uğradığı değişiklikleri tutar. Dikkat edilecek önemli nokta şudur ki; differential en son alınan full backup&#8217;tan bu yana yapılan değişikliklerin yedeğidir. Bir önceki differential backup&#8217;tan bu yana alınan değişikliklerin yedeği değildir.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-65" src="https://ynsmr.com/wp-content/uploads/2021/06/diffBackup-1024x402.png" alt="" width="512" height="201" srcset="https://ynsmr.com/wp-content/uploads/2021/06/diffBackup-1024x402.png 1024w, https://ynsmr.com/wp-content/uploads/2021/06/diffBackup-300x118.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/diffBackup-768x302.png 768w, https://ynsmr.com/wp-content/uploads/2021/06/diffBackup.png 1120w" sizes="(max-width: 512px) 100vw, 512px" /></figure>



<p><strong>Transaction Log Backup :  </strong>Transaction Log veritabanı üzerinde yapılan her bir değişikliğin kaydının tutulduğu log dosyasıdır. Bu logların yedeğinin alınması da üçüncü backup türümüzdür. Transaction Log backup veritabanımızın son full ya da differential yedekten sonra tutarlılığını sağlar. Bu yüzden yoğun işlem gören veritabanlarında olmazsa olmazdır.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-67" src="https://ynsmr.com/wp-content/uploads/2021/06/transactionLogBackup-1024x390.png" alt="" width="512" height="195" srcset="https://ynsmr.com/wp-content/uploads/2021/06/transactionLogBackup-1024x390.png 1024w, https://ynsmr.com/wp-content/uploads/2021/06/transactionLogBackup-300x114.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/transactionLogBackup-768x293.png 768w, https://ynsmr.com/wp-content/uploads/2021/06/transactionLogBackup.png 1045w" sizes="(max-width: 512px) 100vw, 512px" /></figure>



<p class="has-text-align-left">Backup konusunun ve özellikle transaction log backup&#8217;ın anlaşılabilmesi için transaction log yapısının anlaşılması çok önemlidir. Transaction Log bir ya da daha fazla fiziksel dosyadan oluşabilir. Ancak Sql Server transaction log dosyalarını sequential yani sıralı olarak kullanır, eş zamanlı paralel olarak kullanmaz. Bu yüzden birden çok transaction log dosyasının log performansı anlamında bir katkısı yoktur. <strong>Diskte ayrılan tüm alana fiziksel log, bu fiziksel alan içerisindeki loga logical log (mantıksal log) adı verilir.</strong> Kavramsal olarak log kayıtlarından oluşan bir dizidir transaction log ve başında 8KB boyutunda header bulunur. Bu header tr log dosyasına ait boyut ve auto growth ayarları gibi bilgiler tutar. <br /><br />Sql server motoru transaction log dosyasını, belirli parametrelere göre VLF olarak kısaltılan Virtual Log parçalarına böler. Bu parçalı yapı tr log&#8217;un yönetimini kolaylaştırır. VLF sayısını ya da boyutunu biz belirleyemeyiz. Şöyle ki;<br />Transaction Log dosyası boyutu <strong>64 MB</strong> dan küçükse <strong>4 VLF</strong>, <strong>64MB ile 1GB</strong> arasındaysa <strong>8VLF</strong>, 1GB&#8217;dan büyükse <strong>16 VLF</strong> oluşur. Verdiğimiz autogrowth boyutuna göre vlf sayısı ve log boyutu bu parametrelere göre artmaya devam eder. Transaction Log sarmal (circular) bir yapıya sahiptir.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-108" src="https://ynsmr.com/wp-content/uploads/2021/06/image.png" alt="" width="539" height="104" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image.png 718w, https://ynsmr.com/wp-content/uploads/2021/06/image-300x58.png 300w" sizes="(max-width: 539px) 100vw, 539px" /></figure>



<p class="has-text-align-left">Eğer VLF içerisinde bir log kaydı var ise bu aktif bir VLF dir ve SQL server bu alanı kullanamaz. Yeni oluşturulan VLF inaktif ve kullanılmaz durumdadır. Yeni oluşturulmuş veritabanı hariç ilk VLF de her zaman kullanılır. Bir transaction log da en az bir tane VLF aktif ve kullanılıyor durumda olur. Bu VLF&#8217;lerin içerisinde de boyutları 512 byte ila 60 kb arasında değişen ve log kayıtlarını tutan log blokları bulunur. Log blok dolduğunda diske yazılmak zorundadur. <strong>Transaction Log</strong> <strong>Backup alındığında log truncate edilir yani commit olan kayıtlar diske yazılarak, bu kayıtları tutan VLF ler boş olarak işaretlenir ve unused statüsüne geçer yani kullanıma açılır.</strong> Truncate işleminin bu kayıtları sildiği bilgisi genelde yanlış algılanmış bir bilgidir. Kaydı içeren VLF kullanılabilir olarak işaretlernir. Ancak VLF açık bir transaction&#8217;a ait log kaydı barındırıyorsa istisnadır ve aktif durumda kalabilir. Log truncate etmenin tek yolu log backup&#8217;ı almaktır. Log dosyasının büyümesini engellemek için mümkün olduğunca sık transaction log backup alınır. Log&#8217;u truncate etmeden backup almanın yolu &#8220;<strong>Copy Only</strong>&#8221; backup seçeneğidir. Copy Only backup konusunda <a href="https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/copy-only-backups-sql-server?view=sql-server-ver16" target="_blank" rel="noreferrer noopener">şu yazıdan</a> detaylı bilgi alabilirsiniz. Aşağıdaki şekildeki <strong>MinLSN</strong> değeri log içerisindeki en eski ve açık transaction&#8217;a ait LSN değeridir. Sql Server peşi sıra gelen tüm kayıtları logical log&#8217;un sonuna yazar.</p>



<p><strong>Backup Zinciri &amp;&amp; LSN Numaraları</strong></p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="333" height="105" data-id="71" class="wp-image-71" src="https://ynsmr.com/wp-content/uploads/2021/06/trlog1-1.png" alt="" srcset="https://ynsmr.com/wp-content/uploads/2021/06/trlog1-1.png 333w, https://ynsmr.com/wp-content/uploads/2021/06/trlog1-1-300x95.png 300w" sizes="(max-width: 333px) 100vw, 333px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="345" height="113" data-id="72" class="wp-image-72" src="https://ynsmr.com/wp-content/uploads/2021/06/trlog2.png" alt="" srcset="https://ynsmr.com/wp-content/uploads/2021/06/trlog2.png 345w, https://ynsmr.com/wp-content/uploads/2021/06/trlog2-300x98.png 300w" sizes="(max-width: 345px) 100vw, 345px" /></figure>
</figure>



<p><br />SQL Server transaction log içerisindeki her kayıt için kendine ait bir sıra numarası verir. Bu sıra numarasına <strong>«Log Sequence Number, LSN» </strong>adı verilir. LSN numarası büyük olan kayıt log dosyasına LSN numarası küçük olan kayıttan sonra işlenmiştir. Log yedekleri LSN değeri üzerinden son Full backup ı referans alarak bir <strong>backup zinciri</strong> oluşturur. LSN üç parçadan oluşan decimal ya da hexadecimal formatta bir sayıdır <br />•VLF sıra numarası (Virtual Log File) <br />•Log Blok Numarası <br />•Log Kayıt Numarası</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-99" src="https://ynsmr.com/wp-content/uploads/2021/06/LSNstructure.png" alt="" width="495" height="171" srcset="https://ynsmr.com/wp-content/uploads/2021/06/LSNstructure.png 990w, https://ynsmr.com/wp-content/uploads/2021/06/LSNstructure-300x104.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/LSNstructure-768x265.png 768w" sizes="(max-width: 495px) 100vw, 495px" /></figure>



<p><strong><code>RESTORE HEADERONLY FROM DISK</code> = <code>'fullyedek.bak'</code></strong><br />Bu komut bize yedeğin niteliklerine dair birçok bilginin yanında dört tane LSN değeri döndürür <br /><em><strong>FirstLSN</strong></em> –Backup seti içerisindeki ilk transaction’a ait Log Sequence Number <br /><strong><em>LastLSN</em> </strong>– Backup setinden sonraki ilk log kaydının LSN‘i <br /><strong><em>CheckpointLSN</em> </strong>– Son checkpoint’e ait LSN <br /><strong><em>DatabaseBackupLSN</em> </strong>– Son full backup’a ait LSN</p>



<p>CHECKPOINT işlemi memory&#8217;de veri üzerinde yapılan değişikliklerin diske kaydedilmesidir. Diskten buffer cache&#8217;e getirilen data değiştiğinde henüz diske yaılmadığı için dirty page olarak adlandırılır. Verideki bu değişime dair log buffer&#8217;da bir log record oluşur. Log Flush adı verilen işlemle Log buffer&#8217;daki bu kayıt transaction log dosyasına yazılır. Hemen akabinde de buffer cache&#8217;deki ilgili değişiklik diskteki mdf dosyasına yazılır. Yani önce transaction log dosyasına sonra mdf dosyasına yazılır. Bir felaket durumunda log dosyası ile verinin tutarlılığının korunması için gerçekleşen bu mekanizmaya <strong>write ahead logging </strong>denir.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-102" src="https://ynsmr.com/wp-content/uploads/2021/06/checkpoint-1024x458.png" alt="" width="512" height="229" srcset="https://ynsmr.com/wp-content/uploads/2021/06/checkpoint-1024x458.png 1024w, https://ynsmr.com/wp-content/uploads/2021/06/checkpoint-300x134.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/checkpoint-768x344.png 768w, https://ynsmr.com/wp-content/uploads/2021/06/checkpoint.png 1151w" sizes="(max-width: 512px) 100vw, 512px" /></figure>



<p>Bir veritabanını restore ederken, LSN zincirine dikkat etmek gerekir. Aksi takdirde şu hata alınır “<strong>Unable to Create Restore Plan Due to Break in the LSN Chain</strong>”. LSN zincirini korumak için şu hususları bilmek faydalı olacaktır:</p>



<p>Alınan ilk full backup&#8217;da DatabaseBackupLSN değeri daima sıfırdır. <br />Alınan ilk full backup&#8217;da FirstLSN ve CheckpointLSN değerleri aynıdır.<br />Veritabanını geri yükleyeceğimiz zaman hangi differential backup bizim full backup’ımızla ilintiliyse anlamak için<br /><strong>DatabaseBackupLSN (differential backup) = CheckpointLSN (full backup)</strong></p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-115" src="https://ynsmr.com/wp-content/uploads/2021/06/image-1.png" alt="" width="591" height="236" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-1.png 788w, https://ynsmr.com/wp-content/uploads/2021/06/image-1-300x120.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/image-1-768x307.png 768w" sizes="(max-width: 591px) 100vw, 591px" /></figure>



<p>Eğer differential backup&#8217;ımız yoksa, full backup ve transaction log yedeklerimiz varsa LSN zincirini korumak için şu konuya dikkat etmemiz gerekir:<br /><strong>FirstLSN(TransactionLog) &lt; LastLSN (Full Backup) &lt; LastLSN(TransactionLog</strong>)</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-116" src="https://ynsmr.com/wp-content/uploads/2021/06/image-2.png" alt="" width="557" height="250" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-2.png 742w, https://ynsmr.com/wp-content/uploads/2021/06/image-2-300x135.png 300w" sizes="(max-width: 557px) 100vw, 557px" /></figure>



<p>Differential backup&#8217;tan sonra hangi transaction log&#8217;un geleceğini anlamak için:<strong>FirstLSN(TrLog) &lt; LastLSN(Diff) &lt; LastLSN(TrLog)</strong></p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-118" src="https://ynsmr.com/wp-content/uploads/2021/06/image-3.png" alt="" width="605" height="269" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-3.png 807w, https://ynsmr.com/wp-content/uploads/2021/06/image-3-300x133.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/image-3-768x341.png 768w" sizes="(max-width: 605px) 100vw, 605px" /></figure>



<p>Transaction Log LSN zincirini de aşağıdaki şekildeki gibi kontrol edebiliriz.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" class="wp-image-120" src="https://ynsmr.com/wp-content/uploads/2021/06/image-4-1024x327.png" alt="" width="512" height="164" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-4-1024x327.png 1024w, https://ynsmr.com/wp-content/uploads/2021/06/image-4-300x96.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/image-4-768x245.png 768w, https://ynsmr.com/wp-content/uploads/2021/06/image-4.png 1112w" sizes="(max-width: 512px) 100vw, 512px" /></figure>



<p>Bütün bu bilgiler ışığında veritabanı restore işlemleri aşağıdaki ekrandan yapılır. LSN zinciri bozulmadığı sürece bir sorun çıkmayacaktır. Veritabanımızı elimizdeki yedeklerimizin elverdiği istenilen zamana geri döndürebiiriz.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="895" height="442" class="wp-image-128" src="https://ynsmr.com/wp-content/uploads/2021/06/image-5.png" alt="" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-5.png 895w, https://ynsmr.com/wp-content/uploads/2021/06/image-5-300x148.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/image-5-768x379.png 768w" sizes="(max-width: 895px) 100vw, 895px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="548" height="443" class="wp-image-130" src="https://ynsmr.com/wp-content/uploads/2021/06/image-6.png" alt="" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-6.png 548w, https://ynsmr.com/wp-content/uploads/2021/06/image-6-300x243.png 300w" sizes="(max-width: 548px) 100vw, 548px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="855" height="481" class="wp-image-131" src="https://ynsmr.com/wp-content/uploads/2021/06/image-7.png" alt="" srcset="https://ynsmr.com/wp-content/uploads/2021/06/image-7.png 855w, https://ynsmr.com/wp-content/uploads/2021/06/image-7-300x169.png 300w, https://ynsmr.com/wp-content/uploads/2021/06/image-7-768x432.png 768w" sizes="(max-width: 855px) 100vw, 855px" /></figure>



<p>Son olarak veritabanı simple recovery modeldeyken de bir transaction log dosyamız vardır. Ancak bu modda transaction&#8217;lar bu log dosyasında kısa bir süre için (aktif olduğu süre boyunca) tutulur. Transaction buffer&#8217;dan diske yazıldığında (checkpoint işlemiyle log flush işlemi yani log buffer&#8217;dan transaction log&#8217;a) log truncate edilir. Yani yukarıda bahsedildiği gibi, logdaki vlf&#8217;ler kullanılabilir(unused) statüsüne alınır. Full modda belirttiğimiz boyut dolduğunda, log dosyası döngüsünde yeni log dosyası oluşturulurken, burada varolan dosya üzerine dönüp dönüp tekrar yazar. Bu yüzden &#8220;point in time recovery&#8221; mümkün değildir</p>
<p><a href="https://ynsmr.com/sql-serverda-backup-restore/">SQL Server&#8217;da Backup Seçenekleri, Transaction Log Yapısı ve Restore</a> yazısı ilk önce <a href="https://ynsmr.com">Yunus Emre IŞIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
