<?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>SQL Solutions Group</title>
	<atom:link href="https://sqlsolutionsgroup.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://sqlsolutionsgroup.com/</link>
	<description></description>
	<lastBuildDate>Mon, 04 May 2026 20:32:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://sqlsolutionsgroup.com/wp-content/uploads/2021/01/cropped-SSG_FAVICON0002-32x32.png</url>
	<title>SQL Solutions Group</title>
	<link>https://sqlsolutionsgroup.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Moving System Databases: A How-To</title>
		<link>https://sqlsolutionsgroup.com/moving-system-databases/</link>
					<comments>https://sqlsolutionsgroup.com/moving-system-databases/#comments</comments>
		
		<dc:creator><![CDATA[Rich Benner]]></dc:creator>
		<pubDate>Mon, 04 May 2026 06:19:46 +0000</pubDate>
				<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=7482</guid>

					<description><![CDATA[<p>As consultants, we often see system databases existing on the C drive on SQL Servers. There are some issues with this setup, and the biggest is: if one of your system databases grows and fills your C drive, you will likely crash the OS. If that happens, we’re in big trouble. Therefore, moving system databases [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/moving-system-databases/">Moving System Databases: A How-To</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>As consultants, we often see system databases existing on the C drive on SQL Servers. There are some issues with this setup, and the biggest is: <span style="color: #f25e00;"><strong>if one of your system databases grows and fills your C drive, you will likely crash the OS</strong></span>. If that happens, we’re in big trouble. Therefore, moving system databases becomes a necessary operation at times.</p>
<p>This is such a common issue because the default locations are set to C for these databases and that’s where they end up on fresh installs 99% of the time. Don’t worry! If you’re in this situation you’re not alone.</p>
<p>Not sure? Let’s check if you have this problem:</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span>
&nbsp;
db.<span class="me1">name</span> <span class="kw1">AS</span> database_name,
&nbsp;
mf.<span class="me1">name</span> <span class="kw1">AS</span> logical_name,
&nbsp;
mf.<span class="me1">physical_name</span> <span class="kw1">AS</span> file_path,
&nbsp;
<span class="kw1">LEFT</span><span class="br0">&#40;</span>mf.<span class="me1">physical_name</span>, 3<span class="br0">&#41;</span> <span class="kw1">AS</span> drive,
&nbsp;
mf.<span class="me1">type_desc</span> <span class="kw1">AS</span> file_type,
&nbsp;
<span class="kw1">CAST</span><span class="br0">&#40;</span>mf.<span class="kw1">SIZE</span> <span class="sy0">*</span> 8.0 <span class="sy0">/</span> 1024 <span class="kw1">AS</span> <span class="kw1">DECIMAL</span><span class="br0">&#40;</span>10,2<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">AS</span> size_mb
&nbsp;
<span class="kw1">FROM</span> sys.<span class="me1">master_files</span> mf
&nbsp;
<span class="sy0">JOIN</span> sys.<span class="me1">databases</span> db <span class="kw1">ON</span> db.<span class="me1">database_id</span> <span class="sy0">=</span> mf.<span class="me1">database_id</span>
&nbsp;
<span class="kw1">WHERE</span> db.<span class="me1">database_id</span> <span class="sy0">&lt;=</span> <span class="nu0">4</span> <span class="co1">-- system databases: master, tempdb, model, msdb</span>
&nbsp;
<span class="kw1">ORDER</span> <span class="kw1">BY</span> db.<span class="me1">name</span>, mf.<span class="me1">type_desc</span>;</pre></div></div>
<p>&nbsp;</p>
<p>The output will look something like this. As you can see, this server has all system databases on C:</p>
<p><img fetchpriority="high" decoding="async" width="930" height="273" class="wp-image-7593" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-1-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-1-6.png 930w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-1-6-300x88.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-1-6-768x225.png 768w" sizes="(max-width: 930px) 100vw, 930px" /></p>
<p><span style="color: #f25e00;"><strong>So let’s go ahead and fix this.</strong></span></p>
<p>This process can be scary the first handful of times you do it. But don’t worry! As long as we prepare properly we shouldn’t have any problems and it’ll go smooth as butter.</p>
<p>One very important thing to note is that fixing this will require <span style="color: #f25e00;"><strong>turning off the SQL Server instance</strong></span> so none of your databases will be available while we do this. You’ll definitely need to do this during a maintenance window.</p>
<h3><strong>How to fix?</strong></h3>
<p>On my server I have this drive layout. Please note your specific setup.</p>
<p><img decoding="async" width="803" height="168" class="wp-image-7594" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-2-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-2-6.png 803w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-2-6-300x63.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-2-6-768x161.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-2-6-800x168.png 800w" sizes="(max-width: 803px) 100vw, 803px" /></p>
<p>Our starting recommendation is to have three separate drives for database files:<span style="color: #f25e00;"><strong> A data drive, a log file drive and a drive for tempdb</strong></span>. The last one is important because tempdb is an absolute spaghetti mess internally and deals with all of the stuff on your server that the other databases don’t want to deal with. It tends to be the most busy drive so we want to separate it from our other databases. Otherwise there will be arguments, like a house full of cats.</p>
<p>Considering the layout I have here (in above image), I’m going to move my tempdb files to the X drive, the other .mdf (data) files are going to R and the .ldf (log) files are going to L.</p>
<h3><strong>SQL Account server permissions</strong></h3>
<p>One very important thing is to check the SQL Service account has access to the file locations that we’re moving to. <strong><span style="color: #f25e00;">Note</span></strong>: This is not your account, this is the SQL Account. You can check this in configuration manager or in the services app:</p>
<p><img decoding="async" width="1045" height="221" class="wp-image-7595" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-3-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-3-6.png 1045w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-3-6-300x63.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-3-6-1024x217.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-3-6-768x162.png 768w" sizes="(max-width: 1045px) 100vw, 1045px" /></p>
<p>We want to navigate to the Windows folder and ensure that this account has full control of the folder. It’ll need to read/write and also create new database files.</p>
<p><img loading="lazy" decoding="async" width="362" height="436" class="wp-image-7596" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-4-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-4-6.png 362w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-4-6-249x300.png 249w" sizes="(max-width: 362px) 100vw, 362px" /></p>
<p>If you try starting the instance and you haven’t done this, you’ll get errors like this in the log:</p>
<p><img loading="lazy" decoding="async" width="1369" height="73" class="wp-image-7597" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-5-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-5-6.png 1369w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-5-6-300x16.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-5-6-1024x55.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-5-6-768x41.png 768w" sizes="(max-width: 1369px) 100vw, 1369px" /></p>
<p><span style="color: #f25e00;"><strong>Skip this step at your peril!</strong></span></p>
<h3><strong>Moving the Master</strong></h3>
<p>The master database is different to all other databases as you can’t move this with an ALTER DATABASE command; it has to be done in SQL Server Configuration Manager.</p>
<p><img loading="lazy" decoding="async" width="519" height="321" class="wp-image-7598" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-6-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-6-6.png 519w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-6-6-300x186.png 300w" sizes="(max-width: 519px) 100vw, 519px" /></p>
<p>Once you have the config manager open, navigate to SQL Server Services -&gt; SQL Server -&gt; right click and choose Properties:</p>
<p><img loading="lazy" decoding="async" width="806" height="350" class="wp-image-7599" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-7-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-7-6.png 806w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-7-6-300x130.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-7-6-768x333.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></p>
<p>In here, navigate to our startup parameters. We’ll have at least three options (there may be more), and these are the three we care about for this process:</p>
<ul>
<li>-d: This is the master.mdf (data) file location</li>
<li>-l: This is the master.ldf (log) file location</li>
<li>-e: This is the SQL Server error log output location. We will not be changing this but definitely take a note of this location. If, at the end of this process, the SQL Server refuses to start up, we’ll want to dig into the log files here to find out what’s happening.</li>
</ul>
<p><img loading="lazy" decoding="async" width="418" height="496" class="wp-image-7600" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-8-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-8-6.png 418w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-8-6-253x300.png 253w" sizes="(max-width: 418px) 100vw, 418px" /></p>
<p><img loading="lazy" decoding="async" width="412" height="248" class="wp-image-7601" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-9-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-9-6.png 412w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-9-6-300x181.png 300w" sizes="(max-width: 412px) 100vw, 412px" /></p>
<p>To tell SQL Server where we want to move master to, you’ll want to change the file locations to your new filepath by highlighting it and changing the file path from within the “Specify a startup parameter” window and hitting Update. Once you’ve done both file locations and they reflect the new locations in the ‘Existing Parameters’ window, we’re golden.</p>
<p>Once you save you’ll get this window:</p>
<p><img loading="lazy" decoding="async" width="406" height="152" class="wp-image-7602" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-10-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-10-6.png 406w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-10-6-300x112.png 300w" sizes="(max-width: 406px) 100vw, 406px" /></p>
<p>This is important to understand. We haven’t moved anything yet, <span style="color: #f25e00;"><strong>we’ve just told SQL Server where they will be</strong></span>. Remember, these are startup parameters so that’s when the check will be run for the location.</p>
<h3><strong>Other System Databases: msdb, model, tempdb</strong></h3>
<p>These ones we can do from within SSMS, so let’s take the query below, replace the parameters <strong><span style="color: #f25e00;">with your new filepaths</span></strong>, and hit execute. This won’t do anything other than create the scripts. You’ll have to execute them manually (don’t worry!).</p>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">DECLARE</span> @NewDataFilepath <span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">4000</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="st0">'R:<span class="es0">\'</span>
&nbsp;
,@NewLogFilepath nvarchar(4000) = '</span>L:\<span class="st0">'
&nbsp;
,@NewTempdbFilepath nvarchar(4000) = '</span>X:\<span class="st0">'
&nbsp;
SELECT
&nbsp;
db.name AS database_name,
&nbsp;
mf.name AS logical_name,
&nbsp;
mf.physical_name AS file_path,
&nbsp;
mf.type_desc AS file_type,
&nbsp;
CASE WHEN db.name = '</span>tempdb<span class="st0">' THEN '</span><span class="kw1">ALTER</span> <span class="kw1">DATABASE</span> <span class="br0">[</span><span class="st0">' + db.name + '</span><span class="br0">]</span> <span class="kw1">MODIFY</span> <span class="kw1">FILE</span> <span class="br0">&#40;</span>NAME <span class="sy0">=</span> <span class="st0">' + mf.name + '</span>, FILENAME <span class="sy0">=</span> <span class="st0">''</span><span class="st0">' + @NewTempdbFilepath + REVERSE(LEFT(REVERSE(mf.physical_name), CHARINDEX('</span>\<span class="st0">', REVERSE(mf.physical_name)) - 1)) + '</span><span class="st0">''</span> <span class="br0">&#41;</span><span class="st0">'
&nbsp;
WHEN mf.type_desc = '</span><span class="kw1">ROWS</span><span class="st0">' THEN '</span><span class="kw1">ALTER</span> <span class="kw1">DATABASE</span> <span class="br0">[</span><span class="st0">' + db.name + '</span><span class="br0">]</span> <span class="kw1">MODIFY</span> <span class="kw1">FILE</span> <span class="br0">&#40;</span>NAME <span class="sy0">=</span> <span class="st0">' + mf.name + '</span>, FILENAME <span class="sy0">=</span> <span class="st0">''</span><span class="st0">' + @NewDataFilepath + REVERSE(LEFT(REVERSE(mf.physical_name), CHARINDEX('</span>\<span class="st0">', REVERSE(mf.physical_name)) - 1)) + '</span><span class="st0">''</span> <span class="br0">&#41;</span><span class="st0">'
&nbsp;
WHEN mf.type_desc = '</span><span class="kw2">LOG</span><span class="st0">' THEN '</span><span class="kw1">ALTER</span> <span class="kw1">DATABASE</span> <span class="br0">[</span><span class="st0">' + db.name + '</span><span class="br0">]</span> <span class="kw1">MODIFY</span> <span class="kw1">FILE</span> <span class="br0">&#40;</span>NAME <span class="sy0">=</span> <span class="st0">' + mf.name + '</span>, FILENAME <span class="sy0">=</span> <span class="st0">''</span><span class="st0">' + @NewLogFilepath + REVERSE(LEFT(REVERSE(mf.physical_name), CHARINDEX('</span>\<span class="st0">', REVERSE(mf.physical_name)) - 1)) + '</span><span class="st0">''</span> <span class="br0">&#41;</span><span class="st0">'
&nbsp;
END AS AlterDatabaseCommand
&nbsp;
FROM sys.master_files mf
&nbsp;
JOIN sys.databases db ON db.database_id = mf.database_id
&nbsp;
WHERE db.database_id &lt;= 4 -- system databases: master, tempdb, model, msdb
&nbsp;
AND db.name &lt;&gt; '</span>master<span class="st0">'
&nbsp;
ORDER BY db.name, mf.type_desc;</span></pre></div></div>
<p>&nbsp;</p>
<p>The output will look something like this:</p>
<p><img loading="lazy" decoding="async" width="1277" height="225" class="wp-image-7603" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-11-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-11-6.png 1277w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-11-6-300x53.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-11-6-1024x180.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-11-6-768x135.png 768w" sizes="(max-width: 1277px) 100vw, 1277px" /></p>
<p>The very important part here is to ensure the new file locations match the actual new locations exactly otherwise you’re going to take your server down and not be able to get it back online.</p>
<p>Once you’re sure the locations are correct, copy the AlterDatabaseCommand column into a new query window, check the new filepaths thoroughly again, and then hit execute. You’ll get a message similar to this in the messages result window:</p>
<p><img loading="lazy" decoding="async" width="966" height="170" class="wp-image-7604" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-12-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-12-6.png 966w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-12-6-300x53.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-12-6-768x135.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<p>Once we’ve done this, we’ve told SQL Server the new file locations for our system databases.</p>
<h3><strong>Stopping the instance and moving files</strong></h3>
<p>Now that we’ve told SQL the new file locations, we need to go ahead and actually move the files. To do that, we’ll need the SQL Server instance to be stopped. Otherwise, the files will be locked (and remember, these are startup parameters)</p>
<p>Head back into configuration manager, find the SQL Server and hit ‘Stop’:</p>
<p><img loading="lazy" decoding="async" width="809" height="351" class="wp-image-7605" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-13-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-13-6.png 809w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-13-6-300x130.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-13-6-768x333.png 768w" sizes="(max-width: 809px) 100vw, 809px" /></p>
<p>You’ll also have to give the go ahead to stop related services:</p>
<p><img loading="lazy" decoding="async" width="369" height="149" class="wp-image-7606" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-14-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-14-6.png 369w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-14-6-300x121.png 300w" sizes="(max-width: 369px) 100vw, 369px" /></p>
<h3><strong>Moving the Database Files</strong></h3>
<p>From this point you can actually move all of our database files to the new file locations in Windows. Go ahead and move the master, model and msdb data and log files to the new locations.</p>
<p>You don’t need to move any of the tempdb files. These are created automatically when the SQL instance starts up so the old ones will no longer be used. As a best practice, you should delete your old tempdb files if they still exist in order to reclaim the disk space.</p>
<p>Remember to enable ‘View file name extensions’ in Windows Explorer so you are sure which file you’re moving to which location.</p>
<h3><strong>Starting SQL Server</strong></h3>
<p>At this point we need to restart the service, head back to configuration manager, and start the SQL Server service:</p>
<p><img loading="lazy" decoding="async" width="813" height="469" class="wp-image-7607" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-15-6.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-15-6.png 813w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-15-6-300x173.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-15-6-768x443.png 768w" sizes="(max-width: 813px) 100vw, 813px" /></p>
<p>Hopefully you’ll see this screen with the services running as planned:</p>
<p><img loading="lazy" decoding="async" width="815" height="275" class="wp-image-7608" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-16-5.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-16-5.png 815w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-16-5-300x101.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-16-5-768x259.png 768w" sizes="(max-width: 815px) 100vw, 815px" /></p>
<p>Remember to manually start any services (<em><strong><span style="color: #f25e00;">cough</span></strong></em> SQL Server Agent <em><strong><span style="color: #f25e00;">cough</span></strong></em>) that we had to shut down in order to stop the SQL Server service.</p>
<p>As long as they all start you’re golden, you can skip down to the bottom of this article to run our final checks.</p>
<h3><strong>SQL Server Start Failing</strong></h3>
<p>If SQL won’t start, don’t worry, we can fix that!</p>
<p>Go to the log file location from the beginning of this process and open the ERRORLOG file:</p>
<p><img loading="lazy" decoding="async" width="880" height="201" class="wp-image-7609" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-17-5.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-17-5.png 880w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-17-5-300x69.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-17-5-768x175.png 768w" sizes="(max-width: 880px) 100vw, 880px" /></p>
<p>Open this one (it’s a text file so notepad is fine) and scroll to the bottom. It tells you exactly what the problem is:</p>
<p><img loading="lazy" decoding="async" width="1451" height="170" class="wp-image-7610" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-18-5.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-18-5.png 1451w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-18-5-300x35.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-18-5-1024x120.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-18-5-768x90.png 768w" sizes="(max-width: 1451px) 100vw, 1451px" /></p>
<p>In this instance, there was an access denied error (intentional for this demo, promise 😊) which I fixed by giving permission to the SQL Server service account to those individual files. We don’t have enough space in this blog post to be able to explain every problem you may encounter, but you’re a grown up, you can work it out (or go use your Google fingers furiously like the rest of us).</p>
<h3><strong>Final Checks</strong></h3>
<p>Let’s run our original script to find the locations of our system database files (your query window will ask you to reconnect to the server, this is just because we’ve restarted it).</p>
<p><img loading="lazy" decoding="async" width="891" height="259" class="wp-image-7611" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-19-5.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-19-5.png 891w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-19-5-300x87.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/05/word-image-7482-19-5-768x223.png 768w" sizes="(max-width: 891px) 100vw, 891px" /></p>
<p>Happy with these file locations? Great! You have a job well done, be proud of yourself!</p>
<p>Now, go tell your boss how good you are at your job and go for a lay down while your heart rate returns to normal.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/moving-system-databases/">Moving System Databases: A How-To</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/moving-system-databases/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Group Managed Service Accounts and SQL Server: What You Actually Need to Know</title>
		<link>https://sqlsolutionsgroup.com/group-managed-service-accounts/</link>
					<comments>https://sqlsolutionsgroup.com/group-managed-service-accounts/#comments</comments>
		
		<dc:creator><![CDATA[Randy Knight]]></dc:creator>
		<pubDate>Fri, 01 May 2026 14:33:39 +0000</pubDate>
				<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=7479</guid>

					<description><![CDATA[<p>Service account management is one of the quietest ways a SQL Server estate goes wrong. Passwords get set once during install, written down somewhere (or worse, not written down), and then never rotated. The DBA who built the environment leaves. A security audit shows up. Suddenly you&#8217;re staring at a hundred service account passwords nobody [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/group-managed-service-accounts/">Group Managed Service Accounts and SQL Server: What You Actually Need to Know</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Service account management is one of the quietest ways a SQL Server estate goes wrong. Passwords get set once during install, written down somewhere <em>(or worse, not written down)</em>, and then never rotated. The DBA who built the environment leaves. A security audit shows up. Suddenly you&#8217;re staring at a hundred service account passwords nobody remembers, and the prospect of changing them all on a maintenance window nobody wants to schedule. <span style="color: #f25e00;"><strong>Group Managed Service Accounts (gMSAs) solve this</strong></span>.</p>
<p>They&#8217;ve been a fully supported option for SQL Server since 2014, they work with Failover Cluster Instances and Availability Groups, and Active Directory rotates the passwords for you on a schedule you control. We use them by default on every new SQL Server build at SSG.</p>
<p>And yet, in a decade of Health Checks, we still rarely see them deployed. The most common reasons we hear: &#8220;I tried it once and SPNs broke,&#8221; or, &#8220;I wasn&#8217;t sure it would work with our AG.&#8221; Both are addressable. Here&#8217;s what you need to know to deploy gMSAs successfully.</p>
<h3>Why gMSAs Win</h3>
<p>A gMSA is an Active Directory account whose password is generated by the Key Distribution Service (KDS), rotated automatically (default every 30 days), and retrievable only by computer accounts you explicitly authorize. That gives you four things:</p>
<ul>
<li><strong>Passwords you don&#8217;t know, can&#8217;t leak, and can&#8217;t forget to rotate</strong>. The password is 240 bytes of cryptographic randomness. No human ever sees it.</li>
<li><strong>No service restart on rotation</strong>. When AD rotates the password, the SQL Server service keeps running. This is the part most people don&#8217;t believe until they see it.</li>
<li><strong>Automatic SPN management</strong>. The account can register and update its own Service Principal Names, eliminating one of the most painful manual chores in Kerberos troubleshooting.</li>
<li><strong>Cluster-aware</strong>. Unlike standalone Managed Service Accounts (sMSAs), a gMSA can be used by multiple computers, which means it works for Failover Cluster Instances and Availability Group replicas.</li>
</ul>
<p>If you&#8217;re still managing SQL Server service accounts as regular AD user accounts with a 90-day password expiry policy and a coordinated change window, you&#8217;re doing work that <span style="color: #f25e00;"><strong>AD will do for you free</strong></span>.</p>
<h3>Prerequisites</h3>
<p>Before you create your first gMSA, the domain needs a KDS root key. This is a one-time, domain-wide setup step. By default, AD enforces a 10-hour wait after key creation before the key becomes usable, which is a safety mechanism to ensure replication completes across all domain controllers.</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;"><span class="co1"># On a domain controller (or any machine with AD module)</span>
<span class="co1"># Production: just run this and wait 10 hours</span>
Add<span class="sy0">-</span>KdsRootKey <span class="sy0">-</span>EffectiveImmediately
&nbsp;
<span class="co1"># Lab/test only: bypass the 10-hour wait</span>
Add<span class="sy0">-</span>KdsRootKey <span class="sy0">-</span>EffectiveTime <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">Get-Date</span><span class="br0">&#41;</span>.AddHours<span class="br0">&#40;</span><span class="sy0">-</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div>
<p>&nbsp;</p>
<p>Verify a key exists before proceeding:</p>
<div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_4"></a><a id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4"  onClick="javascript:wpsh_toggleBlock(4)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_4" onClick="javascript:wpsh_code(4)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_print(4)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;">Get<span class="sy0">-</span>KdsRootKey</pre></div></div>
<p>You also need:</p>
<ul>
<li>Windows Server 2012 or higher on the SQL Server hosts (we strongly recommend 2019+)</li>
<li>SQL Server 2014 or higher (every supported version qualifies)</li>
<li>The RSAT Active Directory PowerShell module on whichever machine you&#8217;re using to create the accounts</li>
</ul>
<h3>Account Structure: One Per Service, Per Server (Mostly)</h3>
<p>The pattern we deploy at SSG: a separate gMSA for each SQL Server service <em>type</em> (Database Engine, SQL Agent, SSRS, SSAS) on each standalone server. For clustered services — FCIs and AG replicas — we use a single gMSA shared across all nodes in that cluster.</p>
<p>Why separate accounts per service type? Least privilege. Your SQL Agent account often needs different rights than your Database Engine account (proxy operations, file system access for job output, etc.). Putting them on the same account means you grant the union of all permissions to both, which is exactly what we&#8217;re trying to avoid.</p>
<p>Why a single account across cluster nodes? Because all nodes need to authenticate as the same identity to the network. The whole point of an FCI or AG is that clients connect to a virtual name that can move; the underlying service identity must be consistent.</p>
<p>A naming convention that holds up over time:</p>
<table>
<thead>
<tr>
<th><strong>Service</strong></th>
<th><strong>Standalone</strong></th>
<th><strong>Clustered (FCI/AG)</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Database Engine</td>
<td>SQLEng_&lt;server&gt;</td>
<td>SQLEng_&lt;cluster&gt;</td>
</tr>
<tr>
<td>SQL Agent</td>
<td>SQLAgent_&lt;server&gt;</td>
<td>SQLAgent_&lt;cluster&gt;</td>
</tr>
<tr>
<td>SSRS / SSAS</td>
<td>SSRS_&lt;server&gt;</td>
<td>SSAS_&lt;cluster&gt;</td>
</tr>
</tbody>
</table>
<p><span style="color: #f25e00;"><strong>Heads up</strong></span>: gMSA sAMAccountName is capped at 15 characters (with a $ suffix that AD adds automatically). Long server names will collide with this. Plan your naming convention before you start creating accounts. That is why the suggested naming convention above does not have a lot of extra fluff like gmsa_svc_sql_&lt;server&gt; or the like. Every gmsa account will have a $ at the end so that’s how it is clear that it is a service account and is a gmsa.</p>
<h3>Creating the Account</h3>
<p>Two-step process: create an AD security group containing the computer accounts that will use the gMSA, then create the gMSA itself referencing that group. The security group is the indirection layer that makes gMSAs cluster-friendly — adding a new node to an FCI or AG later means adding its computer account to the group, not creating a new gMSA.</p>
<div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_5"></a><a id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5"  onClick="javascript:wpsh_toggleBlock(5)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_5" onClick="javascript:wpsh_code(5)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_print(5)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;"><span class="co1"># 1. Create the security group, add computer accounts</span>
New<span class="sy0">-</span>ADGroup <span class="kw5">-Name</span> <span class="st0">'gsg_SQL_PRODAG01'</span> \
    <span class="sy0">-</span>GroupScope Global <span class="sy0">-</span>GroupCategory Security \
    <span class="kw5">-Path</span> <span class="st0">'OU=Service Groups,DC=contoso,DC=com'</span>
&nbsp;
Add<span class="sy0">-</span>ADGroupMember <span class="sy0">-</span>Identity <span class="st0">'gsg_SQL_PRODAG01'</span> \
    <span class="sy0">-</span>Members <span class="st0">'SQLNODE01$'</span><span class="sy0">,</span><span class="st0">'SQLNODE02$'</span><span class="sy0">,</span><span class="st0">'SQLNODE03$'</span>
&nbsp;
<span class="co1"># 2. Create the gMSA</span>
New<span class="sy0">-</span>ADServiceAccount <span class="kw5">-Name</span> <span class="st0">'SQLEng_PRODAG01'</span> \
    <span class="sy0">-</span>DNSHostName <span class="st0">'PRODAG01.contoso.com'</span> \
    <span class="sy0">-</span>PrincipalsAllowedToRetrieveManagedPassword <span class="st0">'gsg_SQL_PRODAG01'</span> \
    <span class="sy0">-</span>ManagedPasswordIntervalInDays <span class="nu0">30</span> \
    <span class="sy0">-</span>ServicePrincipalNames <span class="sy0">@</span><span class="br0">&#40;</span>
        <span class="st0">'MSSQLSvc/PRODAG01.contoso.com'</span><span class="sy0">,</span>
        <span class="st0">'MSSQLSvc/PRODAG01.contoso.com:1433'</span>
    <span class="br0">&#41;</span> \
    <span class="kw5">-Path</span> <span class="st0">'OU=Service Accounts,DC=contoso,DC=com'</span>
&nbsp;
<span class="co1"># 3. Reboot each node OR run gpupdate /force + klist purge -li 0x3e7</span>
<span class="co1">#    so the computer picks up its new group membership</span></pre></div></div>
<p>That last step is the one most people skip and then spend an hour debugging. Computer Kerberos tickets are issued at boot. Adding a computer to a new security group requires a reboot or a TGT refresh before the computer can retrieve the gMSA password.</p>
<p>Then on each SQL Server host:</p>
<div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_6"></a><a id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6"  onClick="javascript:wpsh_toggleBlock(6)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_6" onClick="javascript:wpsh_code(6)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_print(6)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;"><span class="co1"># Install the AD PowerShell module if not present</span>
Install<span class="sy0">-</span>WindowsFeature RSAT<span class="sy0">-</span>AD<span class="sy0">-</span>PowerShell
&nbsp;
<span class="co1"># Install and verify the gMSA on this host</span>
Install<span class="sy0">-</span>ADServiceAccount <span class="sy0">-</span>Identity <span class="st0">'SQLEng_PRODAG01'</span>
Test<span class="sy0">-</span>ADServiceAccount <span class="sy0">-</span>Identity <span class="st0">'SQLEng_PRODAG01'</span>   <span class="co1"># must return True</span></pre></div></div>
<p><strong>Test-ADServiceAccount</strong> returning <strong>True</strong> is the gate. If it returns <strong>False</strong>, do not proceed to the SQL Server side — the problem is upstream in AD or group membership.</p>
<h3>Assigning the gMSA to SQL Server</h3>
<p>Use SQL Server Configuration Manager. Always. Not services.msc, not Server Manager, not the Services snap-in. SQL Server Configuration Manager grants the necessary local rights (<em>Log on as a service</em>, <em>Lock pages in memory</em>, file system ACLs, registry ACLs) automatically. The other tools don&#8217;t, and you&#8217;ll spend the rest of your afternoon figuring out why SQL Server won&#8217;t start.</p>
<p>In Configuration Manager: right-click the SQL Server service, Properties, Log On tab, enter <strong>CONTOSO\SQLEng_PRODAG01$</strong> in the account name field. Two things to remember:</p>
<ul>
<li>Always include the trailing $. This is how Windows distinguishes a managed service account from a regular user account.</li>
<li>Leave the password fields blank. If you type anything in them, the dialog will reject the save.</li>
</ul>
<p>Repeat for SQL Agent, SSRS, etc., each with its own gMSA. Then restart the services.</p>
<h3>Availability Groups and FCIs: The Extra Step</h3>
<p>For Always On Availability Groups, after switching the Database Engine service to a gMSA, you need to grant the new account CONNECT permission on the HADR endpoint on every replica. This is the step that breaks AGs silently — the cluster looks fine, but synchronization stops.</p>
<div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdt_7" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_7"></a><a id="wpshat_7" class="wp-synhighlighter-title" href="#codesyntax_7"  onClick="javascript:wpsh_toggleBlock(7)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_7" onClick="javascript:wpsh_code(7)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_7" onClick="javascript:wpsh_print(7)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> master;
&nbsp;
GO
&nbsp;
<span class="kw1">CREATE</span> LOG<span class="sy0">IN</span> <span class="br0">[</span>CONTOSO\svc_SQL_PRODAG01$<span class="br0">]</span> <span class="kw1">FROM</span> W<span class="sy0">IN</span>DOWS;
&nbsp;
<span class="kw1">GRANT</span> <span class="kw1">CONNECT</span> <span class="kw1">ON</span> ENDPO<span class="sy0">IN</span>T::Hadr_endpoint <span class="kw1">TO</span> <span class="br0">[</span>CONTOSO\svc_SQL_PRODAG01$<span class="br0">]</span>;
&nbsp;
GO</pre></div></div>
<p>Run that on every replica. If you forget one, the missed replica will fall out of sync the moment its old service account credential expires.</p>
<p>For FCIs, no equivalent step is needed — the gMSA is just the service account, and the cluster resource picks it up.</p>
<h3>Deploying at Scale with dbatools</h3>
<p>If you&#8217;re rolling gMSAs across an estate, do it with dbatools. The <strong>Update-DbaServiceAccount</strong> command handles the local rights assignment correctly — same as Configuration Manager, but scriptable across many servers in a single pipeline.</p>
<div id="wpshdo_8" class="wp-synhighlighter-outer"><div id="wpshdt_8" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_8"></a><a id="wpshat_8" class="wp-synhighlighter-title" href="#codesyntax_8"  onClick="javascript:wpsh_toggleBlock(8)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_8" onClick="javascript:wpsh_code(8)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_8" onClick="javascript:wpsh_print(8)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_8" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;"><span class="co1"># Switch the Database Engine on a list of servers to a gMSA</span>
<span class="re0">$instances</span> <span class="sy0">=</span> <span class="st0">'SQLNODE01'</span><span class="sy0">,</span><span class="st0">'SQLNODE02'</span><span class="sy0">,</span><span class="st0">'SQLNODE03'</span>
&nbsp;
Get<span class="sy0">-</span>DbaService <span class="kw5">-ComputerName</span> <span class="re0">$instances</span> <span class="sy0">-</span><span class="kw2">Type</span> Engine <span class="sy0">|</span>
    Update<span class="sy0">-</span>DbaServiceAccount <span class="sy0">-</span>Username <span class="st0">'CONTOSO\SQLEngPRODAG01$'</span>
&nbsp;
<span class="co1"># Verify it took</span>
Get<span class="sy0">-</span>DbaService <span class="kw5">-ComputerName</span> <span class="re0">$instances</span> <span class="sy0">-</span><span class="kw2">Type</span> Engine <span class="sy0">|</span>
    <span class="kw1">Select-Object</span> ComputerName<span class="sy0">,</span> ServiceName<span class="sy0">,</span> StartName<span class="sy0">,</span> State</pre></div></div>
<p>Note the lack of a <strong>-Password</strong> parameter. dbatools detects the trailing $ and treats the account as a managed service account, skipping the password prompt entirely. This is the kind of small touch that makes dbatools the right tool for this job.</p>
<h3>Common Pitfalls and How to Diagnose Them</h3>
<h4>&#8220;Cannot generate SSPI context&#8221;</h4>
<p>This is the canonical Kerberos failure. After switching to a gMSA, clients can&#8217;t connect via Kerberos and either fall back to NTLM (slow, less secure) or fail outright. The cause is almost always SPN-related — either the SPNs didn&#8217;t transfer to the gMSA, or duplicates exist on the old account.</p>
<p>Diagnose:</p>
<div id="wpshdo_9" class="wp-synhighlighter-outer"><div id="wpshdt_9" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_9"></a><a id="wpshat_9" class="wp-synhighlighter-title" href="#codesyntax_9"  onClick="javascript:wpsh_toggleBlock(9)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_9" onClick="javascript:wpsh_code(9)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_9" onClick="javascript:wpsh_print(9)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_9" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;"><span class="co1"># Check what authentication SQL is using</span>
<span class="kw2">SELECT</span> auth_scheme FROM sys.dm_exec_connections <span class="kw3">WHERE</span> session_id <span class="sy0">=</span> <span class="sy0">@@</span>SPID;
<span class="sy0">--</span> Should <span class="kw3">return</span> KERBEROS<span class="sy0">,</span> not NTLM
&nbsp;
<span class="co1"># Find any SPN registered for your SQL service</span>
setspn <span class="sy0">-</span>Q MSSQLSvc<span class="sy0">/</span>PRODAG01.contoso.com
setspn <span class="sy0">-</span>Q MSSQLSvc<span class="sy0">/</span>PRODAG01.contoso.com:<span class="nu0">1433</span>
&nbsp;
<span class="co1"># Find duplicates (these break Kerberos entirely)</span>
setspn <span class="sy0">-</span>X</pre></div></div>
<p><strong>Fix</strong>: remove SPNs from the old service account, ensure they&#8217;re on the gMSA. If you registered SPNs in the <strong>New-ADServiceAccount</strong> command, AD will refresh them automatically going forward — that&#8217;s the gMSA SPN management benefit. If you didn&#8217;t, register them manually now and let AD take it from there.</p>
<h4>Linked servers and cross-server delegation</h4>
<p>If your SQL Server uses linked servers configured for Windows authentication pass-through, you need Kerberos delegation set on the gMSA. In AD Users and Computers, the gMSA must be configured for constrained delegation to the target SQL Server&#8217;s MSSQLSvc SPN. This is the same requirement as for any service account — gMSAs don&#8217;t change it — but it&#8217;s worth checking before you migrate, because constrained delegation settings don&#8217;t migrate automatically when you change accounts.</p>
<h4>Service won&#8217;t start after the switch</h4>
<p>Almost always one of:</p>
<ul>
<li>The gMSA wasn&#8217;t installed on the host (skipped Install-ADServiceAccount)</li>
<li>The computer account isn&#8217;t in the security group (or wasn&#8217;t rebooted after being added), or</li>
<li>The account was assigned via the wrong tool and didn&#8217;t get <em>Log on as a service</em>.</li>
</ul>
<p>The error in the event log is usually generic; the diagnostic order is: confirm Test-ADServiceAccount returns True, confirm group membership, redo the assignment via Configuration Manager.</p>
<h3>When Not to Use a gMSA</h3>
<p>Two scenarios where we don&#8217;t recommend gMSAs:</p>
<ul>
<li><strong>Servers in domains where you don&#8217;t control the KDS root key</strong>. You&#8217;ll need a Domain Admin to create that one-time. If your AD team won&#8217;t, it&#8217;s a non-starter.</li>
<li><strong>Cross-forest scenarios</strong>. gMSAs do not work across AD forest boundaries. If your SQL Server needs to authenticate to resources in a different forest, you need a regular service account or a different design.</li>
</ul>
<h3>Bottom Line</h3>
<p>gMSAs are the right default for service accounts on any domain-joined SQL Server built in the last decade. The setup overhead is real but one-time. The ongoing operational savings — no password rotations, no expiry surprises, no &#8220;who has the spreadsheet of service account passwords&#8221; conversations — pay for it many times over.</p>
<p>If you&#8217;re standing up a new SQL Server in 2026 and you&#8217;re not using a gMSA, you should have a specific reason why. &#8220;We&#8217;ve always done it this way&#8221; isn&#8217;t one.</p>
<hr />
<h4><em><strong>Need help rolling gMSAs out across an existing estate? </strong></em></h4>
<p>SSG has done this dozens of times across customer environments — including the messy migrations from legacy service accounts on production AGs. <a href="https://sqlsolutionsgroup.com/contact-us/">Get in touch with us</a> and we&#8217;d be happy to support you.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/group-managed-service-accounts/">Group Managed Service Accounts and SQL Server: What You Actually Need to Know</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/group-managed-service-accounts/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Still Running SQL Server 2016? Here’s Why It’s Time to Upgrade</title>
		<link>https://sqlsolutionsgroup.com/still-running-sql-server-2016-heres-why-its-time-to-upgrade/</link>
					<comments>https://sqlsolutionsgroup.com/still-running-sql-server-2016-heres-why-its-time-to-upgrade/#respond</comments>
		
		<dc:creator><![CDATA[A.K. Gonzalez]]></dc:creator>
		<pubDate>Fri, 03 Apr 2026 03:16:37 +0000</pubDate>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL Server 2025]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#sql2016]]></category>
		<category><![CDATA[#sql2025]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=7459</guid>

					<description><![CDATA[<p>Many organizations are still relying on SQL Server 2016 to power critical systems. It’s familiar, stable, and “still working”—so it’s easy to push an upgrade down the priority list. But here’s the reality: SQL Server 2016 has reached end of life. And that shouldn&#8217;t be ignored. What “End of Life” Actually Means When Microsoft ends [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/still-running-sql-server-2016-heres-why-its-time-to-upgrade/">Still Running SQL Server 2016? Here’s Why It’s Time to Upgrade</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="p1"><em><strong><span class="s1">Many organizations are still relying on <span class="s2">SQL Server 2016</span> to power critical systems. It’s familiar, stable, and “still working”—so it’s easy to push an upgrade down the priority list.</span></strong></em></p>
<p class="p1"><em><strong><span class="s1">But here’s the reality: SQL Server 2016 has reached end of life. And that shouldn&#8217;t be ignored.</span></strong></em></p>
<hr />
<h2><span class="s1">What “End of Life” Actually Means</span></h2>
<p class="p1"><span class="s1">When Microsoft ends support for a product, it’s not just a technical milestone—it’s a risk shift. The list of &#8216;cons&#8217; becomes much longer than the list of  &#8216;pros&#8217; when deciding if an upgrade is neccesary yet, or if you can put it off another year. </span></p>
<p class="p1"><span class="s1">Officially SQL Server 2016 will have:</span></p>
<ul>
<li>
<p class="p1"><span class="s1">No more security updates</span></p>
</li>
<li>
<p class="p1"><span class="s1">No bug fixes or patches</span></p>
</li>
<li>
<p class="p1"><span class="s1">No official Microsoft support</span></p>
</li>
<li>
<p class="p1"><span class="s1">Increased exposure to vulnerabilities and compliance risks</span></p>
</li>
</ul>
<p class="p1"><span class="s1">Even if your system seems stable today, it’s now operating without a safety net. And in today’s environment, that’s a serious concern.</span></p>
<h2><span class="s1">The Hidden Cost of Staying Put</span></h2>
<p class="p1"><span class="s1">Delaying an upgrade might feel like the easier (and cheaper) option—but it often comes with hidden costs such as security risks, compliance issues, performance limiations and the need for emergency migrations.</span></p>
<p class="p1"><span class="s1">Without ongoing patches, your database becomes more vulnerable to attacks, especially ransomware targeting outdated systems. </span><span class="s1">Many industries require supported software. Running end-of-life systems can put you out of compliance with security standars. </span><span class="s1">Older systems miss out on years of performance improvements, optimization features, and efficiency gains. </span><span class="s1">Waiting too long often leads to rushed, reactive upgrades after a failure or breach—which are far more expensive and disruptive.</span></p>
<h2><span class="s1">What You Gain by Upgrading</span></h2>
<p class="p1"><span class="s1">Moving to a modern platform like <span class="s2">S</span><span class="s2">QL Server 2025</span> isn’t just about staying supported, it’s about unlocking better performance, resilience, and flexibility. </span><span class="s1">Newer versions bring query optimization, smarter resource usage, and faster processing, improving overall performance. There&#8217;s also some exciting new ways to make backup recovery smarter like: </span></p>
<ul>
<li>
<p class="p1"><span class="s1">True full and differential backups on secondary replicas</span></p>
</li>
<li>
<p class="p1"><span class="s1">Improved compression with ZSTD</span></p>
</li>
<li>
<p class="p1"><span class="s1">Immutable backup storage options</span></p>
</li>
</ul>
<p><span class="s1">The new upgrade also means stronger security and cloud-ready flexibility. </span><span class="s1">Modern encryption, threat detection, and tighter integration with cloud security tools help protect your data. And e</span><span class="s1">asier integration with Azure and hybrid environments gives you more options for scaling and disaster  recoverry.</span></p>
<h2><span class="s1">Migration Doesn’t Have to Be Overwhelming</span></h2>
<p class="p1"><span class="s1">One of the biggest reasons businesses delay upgrading is fear of disruption. </span><span class="s1">Downtime, data loss, compatibility issues, etc.  </span><span class="s1">But with the right strategy migrations can be smoooth, controlled, and predictable.</span></p>
<p class="p1"><span class="s1">A well executed upgrade includes:</span></p>
<ul>
<li>
<p class="p1"><span class="s1">A full assessment of your current environment</span></p>
</li>
<li>
<p class="p1"><span class="s1">Compatibility and workload analysis</span></p>
</li>
<li>
<p class="p1"><span class="s1">A clear migration plan with rollback options</span></p>
</li>
<li>
<p class="p1"><span class="s1">Testing before going live</span></p>
</li>
<li>
<p class="p1"><span class="s1">Minimal downtime during cutover</span></p>
</li>
</ul>
<h2><span class="s1">How We Help</span></h2>
<p class="p1"><span class="s1">We specialize in helping businesses move from outdated systems to modern, optimized environments—without the chaos.</span></p>
<p class="p1"><span class="s1">Our approach focuses on:</span></p>
<p class="p1"><span class="s1">✔️ Safe, secure data migration</span></p>
<p class="p1"><span class="s1">✔️ Minimal disruption to your operations</span></p>
<p class="p1"><span class="s1">✔️ Performance tuning post-upgrade</span></p>
<p class="p1"><span class="s1">✔️ Modern backup and recovery setup</span></p>
<p class="p1"><span class="s1">✔️ Long-term scalability and support</span></p>
<p class="p1"><span class="s1">Whether you’re running a single database or a complex environment, we make the transition manageable and worth it.</span></p>
<h2><span class="s1">Ready to Modernize Your SQL Environment?</span></h2>
<p class="p1"><span class="s1">If you’re still on SQL Server 2016, now is the time to act. </span><span class="s1">Let’s build a plan to upgrade your system, migrate your data safely, and set you up with a faster, more secure, and more resilient environment.</span></p>
<p class="p1"><span class="s1">Reach out today to start your upgrade the right way.</span></p>
<p>The post <a href="https://sqlsolutionsgroup.com/still-running-sql-server-2016-heres-why-its-time-to-upgrade/">Still Running SQL Server 2016? Here’s Why It’s Time to Upgrade</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/still-running-sql-server-2016-heres-why-its-time-to-upgrade/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Why use PowerShell when you can use T-SQL?</title>
		<link>https://sqlsolutionsgroup.com/why-use-powershell/</link>
					<comments>https://sqlsolutionsgroup.com/why-use-powershell/#comments</comments>
		
		<dc:creator><![CDATA[Kyle Burwell]]></dc:creator>
		<pubDate>Wed, 11 Mar 2026 20:27:28 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster #microsftpartner]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<guid isPermaLink="false">https://sqlgroupstg.wpengine.com/?p=7450</guid>

					<description><![CDATA[<p>Why use PowerShell? I’ve lost count of how many times I have been asked this question. Most of the time, the inquirer is asking out of genuine curiosity. Other times, there is some obvious (negative) judgement in the question. Either way, my answer is the same: “It’s easier.” I will go through a couple of [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/why-use-powershell/">Why use PowerShell when you can use T-SQL?</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em><strong><span style="color: #f25e00;">Why use PowerShell?</span></strong></em> I’ve lost count of how many times I have been asked this question. Most of the time, the inquirer is asking out of genuine curiosity. Other times, there is some obvious (negative) judgement in the question. Either way, my answer is the same: “<span style="color: #f25e00;"><strong>It’s easier</strong></span>.”</p>
<p>I will go through a couple of common scenarios that we frequently encounter and give T-SQL and PowerShell solutions.</p>
<h3>Is Max Memory Set Appropriately?</h3>
<p>Let’s start small: Finding max memory values and evaluating if they are appropriate.</p>
<p><strong>T-SQL Script:</strong></p>
<div id="wpshdo_10" class="wp-synhighlighter-outer"><div id="wpshdt_10" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_10"></a><a id="wpshat_10" class="wp-synhighlighter-title" href="#codesyntax_10"  onClick="javascript:wpsh_toggleBlock(10)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_10" onClick="javascript:wpsh_code(10)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_10" onClick="javascript:wpsh_print(10)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_10" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> mem.<span class="me1">total_physical_memory_kb</span> <span class="sy0">/</span> <span class="nu0">1024</span> <span class="st0">'server memory (MB)'</span>
&nbsp;
,configs.<span class="me1">value_in_use</span> <span class="st0">'max server memory (MB)'</span>
&nbsp;
<span class="kw1">FROM</span> sys.<span class="me1">dm_os_sys_memory</span> mem
&nbsp;
cross apply <span class="br0">&#40;</span>
&nbsp;
<span class="kw1">SELECT</span> value_in_use
&nbsp;
<span class="kw1">FROM</span> sys.<span class="me1">configurations</span>
&nbsp;
<span class="kw1">WHERE</span> name <span class="sy0">=</span> <span class="st0">'max server memory (MB)'</span>
&nbsp;
<span class="br0">&#41;</span> configs</pre></div></div>
<p><strong>T-SQL Results:</strong><br />
<img loading="lazy" decoding="async" width="277" height="46" class="wp-image-7451" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/word-image-7450-1.png" /></p>
<p>With that information, I can make a determination if Max Memory is set appropriately. If not, I can calculate an appropriate value and go implement the change.</p>
<p><strong>PowerShell Script:</strong></p>
<div id="wpshdo_11" class="wp-synhighlighter-outer"><div id="wpshdt_11" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_11"></a><a id="wpshat_11" class="wp-synhighlighter-title" href="#codesyntax_11"  onClick="javascript:wpsh_toggleBlock(11)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_11" onClick="javascript:wpsh_code(11)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_11" onClick="javascript:wpsh_print(11)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_11" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;">Test<span class="sy0">-</span>DbaMaxMemory <span class="sy0">-</span>SqlInstance SSG<span class="kw4">-LT</span><span class="sy0">-</span>KBURWELL</pre></div></div>
<p><strong>PowerShell Results:<br />
<img loading="lazy" decoding="async" width="250" height="130" class="wp-image-7452" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/a-screenshot-of-a-computer-screen-ai-generated-co.png" alt="A screenshot of a computer screen AI-generated content may be incorrect." /></strong></p>
<p>Again, this is a basic example, and the T-SQL isn’t exactly complex, but the PowerShell is much easier and even gives you a recommendation for Max Memory.</p>
<h3>LastFullBackup</h3>
<p>The T-SQL for this is also rather easy, but the tricky part is running it against multiple instances and returning a single result set.</p>
<p><strong>T-SQL Script:</strong></p>
<div id="wpshdo_12" class="wp-synhighlighter-outer"><div id="wpshdt_12" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_12"></a><a id="wpshat_12" class="wp-synhighlighter-title" href="#codesyntax_12"  onClick="javascript:wpsh_toggleBlock(12)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_12" onClick="javascript:wpsh_code(12)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_12" onClick="javascript:wpsh_print(12)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_12" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> database_name
&nbsp;
,<span class="kw2">MAX</span><span class="br0">&#40;</span>backup_start_date<span class="br0">&#41;</span> latest_full
&nbsp;
<span class="kw1">FROM</span> msdb.<span class="me1">dbo</span>.<span class="me1">backupset</span> s
&nbsp;
<span class="kw1">WHERE</span> s.<span class="me1">type</span> <span class="sy0">=</span> <span class="st0">'D'</span>
&nbsp;
<span class="kw1">GROUP</span> <span class="kw1">BY</span> s.<span class="me1">database_name</span></pre></div></div>
<p><strong>T-SQL Results:</strong></p>
<p><strong><img loading="lazy" decoding="async" width="352" height="110" class="wp-image-7453" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/a-screenshot-of-a-computer-ai-generated-content-m.png" alt="A screenshot of a computer AI-generated content may be incorrect." srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/a-screenshot-of-a-computer-ai-generated-content-m.png 352w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/a-screenshot-of-a-computer-ai-generated-content-m-300x94.png 300w" sizes="(max-width: 352px) 100vw, 352px" /></strong></p>
<p>As I mentioned, this is a very simple script, but this is <span style="color: #f25e00;"><strong>only for one instance</strong></span>. If you want to run this against multiple instances, you will need to do some additional setup, such as configuring linked servers or a Central Management Server, neither of which I will be detailing here. Instead, I will show how easy it is to query multiple instances in PowerShell.</p>
<p><strong>PowerShell Script:</strong></p>
<div id="wpshdo_13" class="wp-synhighlighter-outer"><div id="wpshdt_13" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_13"></a><a id="wpshat_13" class="wp-synhighlighter-title" href="#codesyntax_13"  onClick="javascript:wpsh_toggleBlock(13)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_13" onClick="javascript:wpsh_code(13)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_13" onClick="javascript:wpsh_print(13)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_13" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;">Get<span class="sy0">-</span>DbaLastBackup <span class="sy0">-</span>SqlInstance SSG<span class="kw4">-LT</span><span class="sy0">-</span>KBURWELL</pre></div></div>
<p><strong>PowerShell Results:<br />
<img loading="lazy" decoding="async" width="377" height="555" class="wp-image-7454" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/word-image-7450-4.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/word-image-7450-4.png 377w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/word-image-7450-4-204x300.png 204w" sizes="(max-width: 377px) 100vw, 377px" /></strong></p>
<p>One simple command and I get the same info, plus details for latest diff and log backups as well. Now let’s make a couple of changes so we can get results for multiple instances and make the output a little more friendly.</p>
<p><strong>PowerShell Script:</strong></p>
<div id="wpshdo_14" class="wp-synhighlighter-outer"><div id="wpshdt_14" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_14"></a><a id="wpshat_14" class="wp-synhighlighter-title" href="#codesyntax_14"  onClick="javascript:wpsh_toggleBlock(14)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_14" onClick="javascript:wpsh_code(14)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_14" onClick="javascript:wpsh_print(14)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_14" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;">Get<span class="sy0">-</span>DbaLastBackup <span class="sy0">-</span>SqlInstance SSG<span class="kw4">-LT</span><span class="sy0">-</span>KBURWELL<span class="sy0">,</span>SSG<span class="kw4">-LT</span><span class="sy0">-</span>KBURWELL\MSSQLSERVER01 <span class="sy0">-</span>ExcludeDatabase msdb<span class="sy0">,</span>model<span class="sy0">,</span>master <span class="sy0">|</span> <span class="kw1">Format-Table</span></pre></div></div>
<p>I made 3 minor changes to the script, but it is still a single line of code and now reads from multiple instances and formats the output as a table.</p>
<ul>
<li><span style="color: #f25e00;"><strong>Change 1</strong></span>: Added an additional SQL instance to the -SqlInstance parameter.</li>
<li><span style="color: #f25e00;"><strong>Change 2</strong></span>: Added the -ExcludeDatabase parameter and passed in the system databases.</li>
<li><span style="color: #f25e00;"><strong>Change 3</strong></span>: Piped the results to Format-Table</li>
</ul>
<p><strong>PowerShell Results:</strong></p>
<p><strong><img loading="lazy" decoding="async" width="1185" height="182" class="wp-image-7455" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/word-image-7450-5.png" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/word-image-7450-5.png 1185w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/word-image-7450-5-300x46.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/word-image-7450-5-1024x157.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/word-image-7450-5-768x118.png 768w" sizes="(max-width: 1185px) 100vw, 1185px" /></strong></p>
<p>Let’s take it one step further and generate a spreadsheet from the results.</p>
<p><strong>PowerShell Script:</strong></p>
<div id="wpshdo_15" class="wp-synhighlighter-outer"><div id="wpshdt_15" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_15"></a><a id="wpshat_15" class="wp-synhighlighter-title" href="#codesyntax_15"  onClick="javascript:wpsh_toggleBlock(15)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_15" onClick="javascript:wpsh_code(15)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_15" onClick="javascript:wpsh_print(15)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_15" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;">Get<span class="sy0">-</span>DbaLastBackup <span class="sy0">-</span>SqlInstance SSG<span class="kw4">-LT</span><span class="sy0">-</span>KBURWELL<span class="sy0">,</span>SSG<span class="kw4">-LT</span><span class="sy0">-</span>KBURWELL\MSSQLSERVER01 <span class="sy0">-</span>ExcludeDatabase msdb<span class="sy0">,</span>model<span class="sy0">,</span>master <span class="sy0">|</span> Export<span class="sy0">-</span>Excel <span class="kw5">-Path</span> C:\Temp\LastBackups.xlsx</pre></div></div>
<p>Instead of piping the results to Format-Table, I am piping the results to Export-Excel and providing a file path and name. Now I have a spreadsheet that I can share with whomever might want to see it.</p>
<p><img loading="lazy" decoding="async" width="327" height="153" class="wp-image-7456" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/a-screenshot-of-a-computer-ai-generated-content-m-1.png" alt="A screenshot of a computer AI-generated content may be incorrect." srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/a-screenshot-of-a-computer-ai-generated-content-m-1.png 327w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/03/a-screenshot-of-a-computer-ai-generated-content-m-1-300x140.png 300w" sizes="(max-width: 327px) 100vw, 327px" /></p>
<p>Getting results from SSMS into Excel is obviously possible, it just requires extra manual steps. It&#8217;s much quicker to just have PowerShell do it for you.</p>
<h3>“It’s easier”</h3>
<p>When I say PowerShell is easier, I’m not just talking about the simplicity of commands. I’m also talking about how easy it is to add in functionality, such as querying multiple instances, combining the results, and exporting them to Excel.</p>
<p>If you are perfectly happy using T-SQL and SSMS, then by all means, continue to do so. <em><strong>But</strong></em>, I do encourage you to explore PowerShell, specifically the <a href="dbatools.io">DBATools</a> module. I will be following up this post with more complex Powershell examples such as copying databases between SQL instances and keeping AG objects synchronized between replicas. Stay tuned for more answers to the question &#8220;why use PowerShell?&#8221;</p>
<p>&nbsp;</p>
<p>The post <a href="https://sqlsolutionsgroup.com/why-use-powershell/">Why use PowerShell when you can use T-SQL?</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/why-use-powershell/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Backup Just Got Smarter: What’s New in Microsoft SQL Server 2025</title>
		<link>https://sqlsolutionsgroup.com/backup-just-got-smarter-whats-new-in-microsoft-sql-server-2025/</link>
					<comments>https://sqlsolutionsgroup.com/backup-just-got-smarter-whats-new-in-microsoft-sql-server-2025/#respond</comments>
		
		<dc:creator><![CDATA[A.K. Gonzalez]]></dc:creator>
		<pubDate>Mon, 02 Mar 2026 06:29:59 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=7438</guid>

					<description><![CDATA[<p>In a recent webinar, Randy Knight walked through the backup enhancements in SQL Server 2025—and one update in particular changes everything for Availability Groups. True Full and Differential Backups on Secondary Replicas For years, database professionals faced a frustrating limitation. With Availability Groups, you could offload some workloads to secondary replicas—but not your real backup [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/backup-just-got-smarter-whats-new-in-microsoft-sql-server-2025/">Backup Just Got Smarter: What’s New in Microsoft SQL Server 2025</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="p1"><em><strong><span class="s1">In a recent webinar, <a href="chatgpt://generic-entity?number=0"><span class="s2">Randy Knight</span></a> walked through the backup enhancements in <a href="chatgpt://generic-entity?number=1"><span class="s2">SQL Server 2025</span></a>—and one update in particular changes everything for Availability Groups.</span></strong></em></p>

<h3><span class="s1">True Full and Differential Backups on Secondary Replicas</span></h3>
<p class="p1"><span class="s1">For years, database professionals faced a frustrating limitation. With Availability Groups, you could offload some workloads to secondary replicas—but not your real backup strategy.</span><span class="s1">Yes, you could run copy-only backups on a secondary. But true full backups? Differential backups that maintain the LSN chain? Those had to run on the primary replica, u</span><span class="s1">ntil now. </span><span class="s1">SQL Server 2025 introduces the ability to run </span><span class="s4">true full backups and true differential backups on secondary replicas</span><span class="s1">.</span></p>
<p class="p1"><span class="s1">That means:</span></p>

<ul>
 	<li>
<p class="p1"><span class="s1">You can move your entire backup workload off the primary.</span></p>
</li>
 	<li>
<p class="p1"><span class="s1">Your backup plan behaves exactly the same as if it were running on the primary.</span></p>
</li>
 	<li>
<p class="p1"><span class="s1">You potentially reduce your RPO by running backups more frequently.</span></p>
</li>
</ul>
<p class="p1"><span class="s1">This isn’t just a convenience feature—it’s a performance and resilience upgrade.</span></p>


<hr />

<h3><span class="s1">ZSTD Backup Compression</span></h3>
<p class="p1"><span class="s1">Another enhancement is the introduction of </span><span class="s4">ZSTD backup compression</span><span class="s1">, an algorithm originally developed at Facebook. </span><span class="s1">Until now, SQL Server used MSXpress as the default compression method. ZSTD brings:</span></p>

<ul>
 	<li>
<p class="p1"><span class="s1">Slightly better compression ratios</span></p>
</li>
 	<li>
<p class="p1"><span class="s1">Faster compression in many cases</span></p>
</li>
 	<li>
<p class="p1"><span class="s1">Less CPU overhead during decompression</span></p>
</li>
 	<li>
<p class="p1"><span class="s1">Potentially faster restores</span></p>
</li>
</ul>
<p class="p1"><span class="s1">In Randy’s testing—and in benchmarking done by <a href="chatgpt://generic-entity?number=2"><span class="s2">Aaron Bertrand</span></a> on an 8TB Stack Overflow database—backup sizes weren’t dramatically smaller. A 50GB database might shrink from 15GB to 14.5GB. </span><span class="s1">That doesn’t sound revolutionary, b</span><span class="s1">ut at scale it really adds up!</span></p>
<p class="p1"><span class="s1">If you’re backing up multi-terabyte databases with long retention periods, even small savings compound quickly. Smaller backups also mean improved storage efficiency and potential restore performance gains. </span><span class="s1">It’s not flashy—but it’s practical, which matters. </span></p>


<hr />

<h3><span class="s1">Immutable Backups in Azure Blob Storage</span></h3>
<p class="p1"><span class="s1">Backing up directly to Azure Blob Storage isn’t new. But SQL Server 2025 now supports backups to </span><span class="s4">immutable Azure Blob storage accounts</span><span class="s1">.</span><span class="s1">This enhancement strengthens ransomware protection. </span><span class="s1">Immutable storage ensures that once a backup is written, it cannot be modified. The only permitted action is deletion under defined rules. While not truly air-gapped, this approach creates a powerful safeguard against backup tampering. </span><span class="s1">In a world where ransomware targets backups first, this feature significantly improves recovery confidence.</span></p>


<hr />

<h3><span class="s1">Why These Enhancements Matter</span></h3>
<p class="p1"><span class="s1">SQL Server 2025 doesn’t reinvent backup strategy—it strengthens it.</span></p>

<ul>
 	<li>
<p class="p1"><span class="s1">Offload backup workloads to secondary replicas</span></p>
</li>
 	<li>
<p class="p1"><span class="s1">Improve compression efficiency at scale</span></p>
</li>
 	<li>
<p class="p1"><span class="s1">Harden backup security against ransomware</span></p>
</li>
</ul>
<p class="p1"><span class="s1">Individually, these updates are incremental. Together, they represent a meaningful evolution in database resilience and performance. F</span><span class="s1">or organizations running mission-critical systems, that’s an especially big deal.</span></p>
<!-- /wp:post-content --><p>The post <a href="https://sqlsolutionsgroup.com/backup-just-got-smarter-whats-new-in-microsoft-sql-server-2025/">Backup Just Got Smarter: What’s New in Microsoft SQL Server 2025</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/backup-just-got-smarter-whats-new-in-microsoft-sql-server-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fixing Full-Text Index Issues</title>
		<link>https://sqlsolutionsgroup.com/fixing-full-text-index/</link>
					<comments>https://sqlsolutionsgroup.com/fixing-full-text-index/#respond</comments>
		
		<dc:creator><![CDATA[Rich Benner]]></dc:creator>
		<pubDate>Thu, 05 Feb 2026 17:34:52 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#Full-TextSearch]]></category>
		<category><![CDATA[#FullTextIndex]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#SQLPerformance]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=7396</guid>

					<description><![CDATA[<p>We’ve had Full-Text index issues come up with surprising frequency lately, so I thought I’d share the fix with all of you lovely people who read this blog. For reference, the customer in this example asked us to look at this problem on a server that is not managed by us.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/fixing-full-text-index/">Fixing Full-Text Index Issues</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>We’ve had Full-Text index issues come up with surprising frequency lately. I thought I’d share the fix with all of you lovely people who read this blog. For reference, the customer in this example asked us to look at this problem on a server that is not managed by us.</p>



<h3 class="wp-block-heading">Problem Statement</h3>



<p>The client noticed the D (data) drive was running out of free space and they asked us to investigate. We found that the SQL Logs folder was much larger than we’d expect. A considerable amount of this data was not database files (.mdf, .ldf, .ndf), but rather log files (.log and anything with a .Number file extension):</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="941" height="159" class="wp-image-7397" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-1.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-1.png 941w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-1-300x51.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-1-768x130.png 768w" sizes="(max-width: 941px) 100vw, 941px" /></figure>



<p>&nbsp;</p>



<p>Upon further investigation we could see that there were a large number of files starting with SQLFT%. These are full text error files:</p>



<p>&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" class="wp-image-7398" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-2.png" alt="" /></figure>



<p>&nbsp;</p>



<p>At this point we knew the culprit and had to dig into our full text indexes.</p>



<p>&nbsp;</p>



<h3 class="wp-block-heading">Investigation</h3>



<p><strong>SQL Error Log</strong></p>



<p>If you also check your SQL Error log in SSMS, you will likely see a constant stop and restart of the Full-Text process:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="776" height="400" class="wp-image-7399" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-3.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-3.png 776w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-3-300x155.webp 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-3-768x396.webp 768w" sizes="(max-width: 776px) 100vw, 776px" /></figure>



<p>&nbsp;</p>



<p>If we want specific details around which table/index is causing issues, we will have to check the Full-Text error log directly.</p>



<p><strong>Reading Your Full-Text Error Log</strong></p>



<p>There’s no GUI way of reading the Full-Text error log in SSMS. To do that, you’ll have to read the file off disk directly. And for that, you’ll need xp_cmdshell enabled, as follows:</p>



<div id="wpshdo_16" class="wp-synhighlighter-outer"><div id="wpshdt_16" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_16"></a><a id="wpshat_16" class="wp-synhighlighter-title" href="#codesyntax_16"  onClick="javascript:wpsh_toggleBlock(16)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_16" onClick="javascript:wpsh_code(16)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_16" onClick="javascript:wpsh_print(16)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_16" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXEC</span> <span class="kw3">SP_CONFIGURE</span> <span class="st0">'show advanced options'</span>, <span class="nu0">1</span>;
<span class="kw1">RECONFIGURE</span>;
<span class="kw1">EXEC</span> <span class="kw3">SP_CONFIGURE</span> <span class="st0">'xp_cmdshell'</span>, <span class="nu0">1</span>;
<span class="kw1">RECONFIGURE</span>;</pre></div></div>
<p>

</p>
<p>You can then read this file (and any others) using the query below:</p>
<p>

</p>
<div id="wpshdo_17" class="wp-synhighlighter-outer"><div id="wpshdt_17" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_17"></a><a id="wpshat_17" class="wp-synhighlighter-title" href="#codesyntax_17"  onClick="javascript:wpsh_toggleBlock(17)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_17" onClick="javascript:wpsh_code(17)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_17" onClick="javascript:wpsh_print(17)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_17" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXEC</span> xp_cmdshell <span class="st0">'type &quot;D:<span class="es0">\P</span>rogram Files<span class="es0">\M</span>icrosoft SQL Server<span class="es0">\M</span>SSQL13.MSSQLSERVER<span class="es0">\M</span>SSQL<span class="es0">\L</span>og<span class="es0">\F</span>DLAUNCHERRORLOG&quot;'</span>;</pre></div></div>
<p>

</p>
<p>The potential challenge here is: if you’ve got an issue with Full-Text then this file has the potential to be very large (in this scenario, it was 2.4GB). A file of that size may well make this approach prohibitive.</p>
<p>

</p>
<p><strong>Manually Reading the Error Log</strong></p>
<p>

</p>
<p>You won’t be able to open the FDLAUNCHERRORLOG file directly if it’s in use with SQL Server so in this case you will have to take a copy of the file and read the copy. However, there are file size limitations with tools such as Notepad. You will need to use an application that can deal with these large files (<a href="https://code.visualstudio.com/download">VScode</a>, <a href="https://notepad-plus-plus.org/downloads/">Notepad++</a>, etc.) or something that’s specifically designed to open large text files (<a href="https://apps.microsoft.com/detail/9nblggh4mcm8?hl=en-US&amp;gl=US">Large Text File Viewer</a>, <a href="https://klogg.filimonov.dev/">KLOGG</a>, etc).</p>
<p>

</p>
<p>If you need to copy this text file to a different server, I highly recommend zipping the file first. The files are often multiple GB but because it’s a lot of repeated data, they compress really well. It’ll save you a bunch of time in data transfer over your network.</p>
<p>

</p>
<p><strong>Error Log Output</strong></p>
<p>

</p>
<p>Once you’re able to read the error log, you will see an output like this which gives you the specific table or indexed view which is the issue here:</p>
<p>

</p>
<p>

</p>
<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1652" height="305" class="wp-image-7400" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-4.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-4.png 1652w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-4-300x55.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-4-1024x189.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-4-768x142.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-4-1536x284.png 1536w" sizes="(max-width: 1652px) 100vw, 1652px" /></figure>
<p>

</p>
<p>This is where (at least one) of our issues are. It’s worth noting that there may well be more than one object involved here. We’re looking for the largest culprit, but once we that one we may well have others that will require our attention. We’ll deal with that when we come to it, though.</p>
<p>

</p>
<p>&nbsp;</p>
<p>

</p>
<h3 class="wp-block-heading">Remediation</h3>
<p>

</p>
<p><strong>Rebuilding Full-Text Catalogue</strong></p>
<p>

</p>
<p>The first thing we want to do is to rebuild our Full-Text catalogue for the affected database. You can easily do this in SSMS:</p>
<p>

</p>
<p>&nbsp;</p>
<p>

</p>
<figure class="wp-block-image"><img decoding="async" class="wp-image-7401" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-5.png" alt="" /></figure>
<p>

</p>
<p>A rebuild should fix the issue. But if not, you’ll have to go to the next step.</p>
<p>

</p>
<p class="wp-block-heading"><strong>Rebuilding Indexes</strong></p>
<p>

</p>
<p>Luckily, in our scenario the table involved was small so this wasn’t a concern. However, rebuilding indexes comes with the dual caveats that, in larger environments, it can take a long time to complete a rebuild, and it will also consume resources and may potentially cause blocking. In this scenario, you’ll want to do this out of hours or inside a maintenance window.</p>
<p>

</p>
<p><strong>An important note here</strong>: We’d recommend just rebuilding the clustered index if you have one. By doing this, the system will automatically rebuild all other indexes on the table. You can do this using the GUI:</p>
<p>

</p>
<p>&nbsp;</p>
<p>

</p>
<figure class="wp-block-image"><img decoding="async" class="wp-image-7402" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-6.png" alt="" /></figure>
<p>

</p>
<p>If you’re more comfortable working with code, then you can perform this manually too:</p>
<p>

</p>
<div id="wpshdo_18" class="wp-synhighlighter-outer"><div id="wpshdt_18" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_18"></a><a id="wpshat_18" class="wp-synhighlighter-title" href="#codesyntax_18"  onClick="javascript:wpsh_toggleBlock(18)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_18" onClick="javascript:wpsh_code(18)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_18" onClick="javascript:wpsh_print(18)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_18" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">ALTER</span> <span class="kw1">INDEX</span> <span class="br0">[</span>IndexName<span class="br0">]</span> <span class="kw1">ON</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TableName<span class="br0">]</span> REBUILD</pre></div></div>
<p>

</p>
<p>Once this is rebuilt (and assuming it returns without errors), you should be golden. You then want to follow the process below to allow you to cycle the log files.</p>
<p>

</p>
<p class="wp-block-heading"><strong>Cycling your Full-Text Log Files</strong></p>
<p>

</p>
<p>There is an undocumented stored procedure that lets you cycle your Full-Text log files the same way you are (hopefully) cycling your SQL Error Logs:</p>
<p>

</p>
<div id="wpshdo_19" class="wp-synhighlighter-outer"><div id="wpshdt_19" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_19"></a><a id="wpshat_19" class="wp-synhighlighter-title" href="#codesyntax_19"  onClick="javascript:wpsh_toggleBlock(19)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_19" onClick="javascript:wpsh_code(19)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_19" onClick="javascript:wpsh_print(19)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_19" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXEC</span> sp_fulltext_recycle_crawl_log @ftcat <span class="sy0">=</span> ‘FullText <span class="kw1">CATALOG</span> Name;</pre></div></div>
<p>

</p>
<p>This will deallocate the old log files and create new ones. At this point you’re free to delete or move these log files that are filling the drive to free up the disk space. And don’t worry: If you try to delete a file that’s currently in use by SQL Server (the current log files, for example) you won’t be able to.</p>
<p>

</p>
<p><strong>Cycling your Full-Text master error log</strong></p>
<p>

</p>
<p>There is no way of doing this within SSMS. You can do it with this command:</p>
<p>

</p>
<div id="wpshdo_20" class="wp-synhighlighter-outer"><div id="wpshdt_20" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_20"></a><a id="wpshat_20" class="wp-synhighlighter-title" href="#codesyntax_20"  onClick="javascript:wpsh_toggleBlock(20)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_20" onClick="javascript:wpsh_code(20)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_20" onClick="javascript:wpsh_print(20)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_20" class="wp-synhighlighter-inner" style="display: block;"><pre class="php" style="font-family:monospace;"><a href="http://www.php.net/exec"><span class="kw3">EXEC</span></a> sp_fulltext_service <span class="st_h">'cycle_errorlog'</span><span class="sy0">;</span></pre></div></div>
<p>

</p>
<p>This will allow you to cycle out this error log, too, if you need to delete the file to free up space.</p>
<p>

</p>
<p>At this point, we have fixed the full text indexes on this database. We may, however, have issues with multiple databases. If we check the SQL Error log and see new errors appearing, then we haven’t quite fixed the whole problem. We will want to go through this process again (check the logs, rebuild indexes, cycle error log files) until we’ve fixed all our problems.</p>
<p>

</p>
<p class="wp-block-heading"><strong>DBCC CHECKTABLE</strong></p>
<p>

</p>
<p>Once we’ve fixed all the issues with Full-Text search it’s a great idea to perform a DBCC CHECKTABLE on the affected tables to ensure we’re not dealing with a corruption issue. CHECKTABLE is much lighter than a full CHECKDB, but it still does read the entire table  to perform the check. Yes, this is another process that we would want to be careful and <strong>perform outside of working hours if at all possible</strong> if the table we’re dealing with is large in our environment.</p>
<p>

</p>
<div id="wpshdo_21" class="wp-synhighlighter-outer"><div id="wpshdt_21" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_21"></a><a id="wpshat_21" class="wp-synhighlighter-title" href="#codesyntax_21"  onClick="javascript:wpsh_toggleBlock(21)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_21" onClick="javascript:wpsh_code(21)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_21" onClick="javascript:wpsh_print(21)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_21" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> <span class="br0">[</span>DBName<span class="br0">]</span>
&nbsp;
GO
&nbsp;
<span class="kw1">DBCC</span> CHECKTABLE <span class="br0">&#40;</span>‘TableName’<span class="br0">&#41;</span> <span class="kw1">WITH</span> <span class="kw1">WITH</span> <span class="sy0">ALL</span>_ERR<span class="sy0">OR</span>MSGS, NO_<span class="sy0">IN</span>FOMSGS</pre></div></div>
<p>

</p>
<p>This will return any errors encountered while also avoiding any noise from informational messages.</p>
<p>

</p>
<p>You can see the output in the error log:</p>
<p>

</p>
<p>&nbsp;</p>
<p>

</p>
<figure class="wp-block-image"><img decoding="async" class="wp-image-7403" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/02/word-image-7396-7.png" alt="" /></figure>
<p>

</p>
<p>&nbsp;</p>
<p>

</p>
<h3 class="wp-block-heading">Final Thoughts</h3>
<p>

</p>
<p>If you discover corruption, review <a href="https://sqlsolutionsgroup.com/blindsided-by-database-corruption/">this post</a> I wrote on the topic. If you don’t, you should be good to go — and give yourself a pat on your back for a job well done!</p>
<p>

</p>
<p>And, if you find you can’t solve a Full-Text index issue yourself, we’re always standing by to assist you.</p>
<p>

</p>
<p>&nbsp;</p>
<p></p><p>The post <a href="https://sqlsolutionsgroup.com/fixing-full-text-index/">Fixing Full-Text Index Issues</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/fixing-full-text-index/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Server 2025 Performance Enhancements: What Developers and DBAs Need to Know</title>
		<link>https://sqlsolutionsgroup.com/sql-server-2025-performance-enhancements-what-developers-and-dbas-need-to-know/</link>
					<comments>https://sqlsolutionsgroup.com/sql-server-2025-performance-enhancements-what-developers-and-dbas-need-to-know/#respond</comments>
		
		<dc:creator><![CDATA[A.K. Gonzalez]]></dc:creator>
		<pubDate>Wed, 21 Jan 2026 19:01:28 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=7391</guid>

					<description><![CDATA[<p>SQL Server 2025 continues Microsoft’s steady focus on performance, reliability, and intelligent automation. Rather than introducing one dramatic overhaul, this release delivers a collection of meaningful, incremental improvements that—when combined—can result in noticeable gains for many workloads. During a recent discussion, Rich and Kyle walked through several of the most impactful enhancements, focusing on Intelligent [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/sql-server-2025-performance-enhancements-what-developers-and-dbas-need-to-know/">SQL Server 2025 Performance Enhancements: What Developers and DBAs Need to Know</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<blockquote>
<p><em><strong>SQL Server 2025 continues Microsoft’s steady focus on performance, reliability, and intelligent automation. Rather than introducing one dramatic overhaul, this release delivers a collection of meaningful, incremental improvements that—when combined—can result in noticeable gains for many workloads.</strong></em></p>
</blockquote>
<p><span style="font-weight: 400;">During a recent discussion, Rich and Kyle walked through several of the most impactful enhancements, focusing on Intelligent Query Processing, concurrency improvements, columnstore indexes, and long-awaited TempDB upgrades.</span></p>
<h3><b>Smarter Query Performance with Intelligent Query Processing (IQP)</b></h3>
<p><span style="font-weight: 400;">Intelligent Query Processing isn’t new, but SQL Server 2025 refines it further. IQP is an umbrella term covering a set of features designed to make the query optimizer more adaptive and accurate over time.</span></p>
<p><span style="font-weight: 400;">One key area of improvement is cardinality estimation—the process SQL Server uses to estimate how many rows will flow through each step of a query plan. Anyone who has tuned performance knows how damaging a mismatch between estimated and actual rows can be. SQL Server 2025 introduces incremental enhancements to these estimations, which, in most cases, translate to better execution plans and improved default performance without any code changes.</span></p>
<p><span style="font-weight: 400;">As with any optimizer change, edge cases still exist. Large jumps in behavior—such as the one between SQL Server 2014 and 2016—sometimes caused regressions in specific workloads. While the changes in 2025 are far less dramatic, testing remains essential when upgrading.</span></p>
<p><span style="font-weight: 400;">Another IQP enhancement is parameter-sensitive optimization, which addresses long-standing issues related to parameter sniffing. When query parameters vary significantly between executions, SQL Server can now better recognize those differences and adjust execution strategies accordingly, reducing performance instability.</span></p>
<p><span style="font-weight: 400;">Degree of parallelism (DOP) feedback also continues to evolve. Rather than making a one-time decision based solely on cost thresholds and configuration values, SQL Server now evaluates how well a query performs when running in parallel and adjusts its behavior over time. This allows the engine to fine-tune parallelism instead of blindly running at maximum settings. While powerful, it does require familiarity with execution plans to fully understand how SQL Server is adapting behind the scenes.</span></p>
<h3><b>Adaptive Joins That Adjust on the Fly</b></h3>
<p><span style="font-weight: 400;">Adaptive joins build on SQL Server’s ability to recover from imperfect statistics. Traditionally, SQL Server commits to a join strategy—such as nested loops or hash joins—based on cardinality estimates. If those estimates are wrong, the query can suffer dramatically.</span></p>
<p><span style="font-weight: 400;">With adaptive joins, SQL Server can change its mind mid-execution. If a join starts as a loop join but processes far more rows than expected, the engine can switch to a more appropriate join type, such as a hash join, while the query is still running.</span></p>
<p><span style="font-weight: 400;">SQL Server 2025 improves adaptive joins further, especially in complex scenarios involving multiple joins. This makes the engine more resilient in real-world environments where statistics are rarely perfect.</span></p>
<h3><b>Improved Concurrency Through Smarter Locking</b></h3>
<p><span style="font-weight: 400;">Concurrency is another area receiving meaningful attention. SQL Server has long relied on various lock types—row, key, page, range, and table locks—with relatively rigid thresholds for escalation.</span></p>
<p><span style="font-weight: 400;">Historically, modifying a few thousand rows could trigger escalation to a full table lock, leading many teams to design batch operations around that behavior. SQL Server 2025 is more nuanced. It can now hold thousands of locks without immediately escalating to a table lock when doing so would be unnecessary or harmful.</span></p>
<p><span style="font-weight: 400;">These optimized locking improvements, especially when combined with accelerated database recovery, have already shown dramatic reductions in blocking in real-world workloads. The engine is simply making better decisions about how much data truly needs to be locked.</span></p>
<h3><b>Faster and More Efficient Columnstore Indexes</b></h3>
<p><span style="font-weight: 400;">For organizations using columnstore indexes—particularly in data warehouse and analytics workloads—SQL Server 2025 brings performance gains across the board.</span></p>
<p><span style="font-weight: 400;">Compression is faster, index rebuilds complete more quickly, and the engine handles delta stores more efficiently. Delta stores, which temporarily hold newly inserted uncompressed data before it’s merged into compressed columnstore segments, are now managed more intelligently. This improves both data ingestion and query performance.</span></p>
<p><span style="font-weight: 400;">Reading from columnstore indexes has also been optimized, meaning analytics queries can run faster with no changes required at the application level.</span></p>
<h3><b>TempDB Enhancements That DBAs Will Appreciate</b></h3>
<p><span style="font-weight: 400;">TempDB has long been one of SQL Server’s most critical—and fragile—components. SQL Server 2025 introduces several enhancements that directly address common pain points.</span></p>
<p><span style="font-weight: 400;">One of the most significant changes is the ability to govern TempDB usage using Resource Governor. DBAs can now set quotas that prevent individual queries or workloads from consuming excessive TempDB space. When a query exceeds its limit, SQL Server cancels it before TempDB fills up, preventing server-wide outages.</span></p>
<p><span style="font-weight: 400;">This is especially valuable in environments where large reports or unfiltered queries can consume hundreds of gigabytes and bring systems to a halt—often in the middle of the night.</span></p>
<p><span style="font-weight: 400;">SQL Server 2025 also brings accelerated database recovery (ADR) to TempDB. Large rollbacks that previously took minutes can now complete almost instantly, reducing downtime and improving system responsiveness during heavy workloads.</span></p>
<p><span style="font-weight: 400;">To support monitoring and alerting, new DMV columns expose detailed TempDB usage metrics, including current usage, peak usage, and the number of TempDB limit violations. These additions make it far easier for DBAs and monitoring tools to detect issues before they escalate into outages.</span></p>
<h3><b>A Practical Step Forward</b></h3>
<p><span style="font-weight: 400;">Rather than reinventing SQL Server, the 2025 release refines the engine’s intelligence. Query plans adapt more effectively, locking decisions are smarter, analytics workloads run faster, and TempDB becomes far more manageable.</span></p>
<p><span style="font-weight: 400;">For teams considering an upgrade, SQL Server 2025 offers tangible performance and reliability improvements—especially for environments that struggle with concurrency, large analytical workloads, or TempDB pressure. As always, thorough testing is key, but for many workloads, the benefits will be felt immediately.</span></p>
<p class="p1"> </p>

<p>&nbsp;</p>
<p>The post <a href="https://sqlsolutionsgroup.com/sql-server-2025-performance-enhancements-what-developers-and-dbas-need-to-know/">SQL Server 2025 Performance Enhancements: What Developers and DBAs Need to Know</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/sql-server-2025-performance-enhancements-what-developers-and-dbas-need-to-know/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Enhancements to TempDB in SQL Server 2025</title>
		<link>https://sqlsolutionsgroup.com/enhancements-to-tempdb-in-sql-server-2025/</link>
					<comments>https://sqlsolutionsgroup.com/enhancements-to-tempdb-in-sql-server-2025/#respond</comments>
		
		<dc:creator><![CDATA[Rich Benner]]></dc:creator>
		<pubDate>Wed, 14 Jan 2026 10:07:47 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#sqlserver2025]]></category>
		<category><![CDATA[#tempdb]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=7376</guid>

					<description><![CDATA[<p>The latest edition of SQL Server comes with many enhancements, and updates to TempDB in SQL Server 2025 are one of our favourites.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/enhancements-to-tempdb-in-sql-server-2025/">Enhancements to TempDB in SQL Server 2025</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>The latest edition of SQL Server comes with plenty of enhancements, and some we are particularly looking forward to. Updates to TempDB in SQL Server 2025 are one of our (&#8230; or my) favourites. We’re not talking a <em>redesign</em> of TempDB but rather some noticeable improvements that the community has been shouting out for. Let’s dig into them.</p>

<h3 class="wp-block-heading"><strong>TempDB Space Governance</strong></h3>



<p>This is the big one. We’re going to do extensive testing on this, but it looks extremely promising. In SQL Server 2025, Resource Governor can now limit how much TempDB space a workload is allowed to use. That means:</p>



<ul class="wp-block-list">
<li>One bad report can’t eat <em>all</em> of TempDB</li>



<li>ETL jobs can’t bully OLTP workloads</li>



<li>You can finally put hard limits on temp space usage</li>
</ul>



<p><strong>Why this matters</strong></p>



<p>You may have run into the issue where TempDB gets filled by somebody running a huge reporting query. This fills the TempDB drive and brings down the production server. Sometimes you can’t help users from being users. This is usually compounded in virtualised environments if you’re using something like the AWS Instance Store when you can’t increase the size of this drive other than increasing your instance size (and cost).</p>



<p>Before 2025, Resource Governor could manage CPU and memory, but TempDB was the Wild West. Now it’s fenced in.</p>



<p>If a workload hits its TempDB limit:</p>



<ul class="wp-block-list">
<li>The request fails</li>



<li>TempDB stays healthy</li>



<li>The rest of the server keeps working</li>
</ul>



<p><strong>Example: Limit TempDB usage for a workload group</strong></p>



<p>Note: There are some <a href="https://learn.microsoft.com/en-us/sql/relational-databases/resource-governor/tempdb-space-resource-governance?view=sql-server-ver17#percent-limit-configuration">requirements</a> for your TempDB configuration:</p>


<div id="wpshdo_22" class="wp-synhighlighter-outer"><div id="wpshdt_22" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_22"></a><a id="wpshat_22" class="wp-synhighlighter-title" href="#codesyntax_22"  onClick="javascript:wpsh_toggleBlock(22)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_22" onClick="javascript:wpsh_code(22)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_22" onClick="javascript:wpsh_print(22)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_22" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="co1">-- Enable Resource Governor</span>
&nbsp;
<span class="kw1">ALTER</span> RESOURCE GOVERN<span class="sy0">OR</span> <span class="kw1">RECONFIGURE</span>
&nbsp;
GO
&nbsp;
<span class="co1">-- Create a workload group with a TempDB limit of 25%</span>
&nbsp;
<span class="kw1">CREATE</span> W<span class="sy0">OR</span>KLOAD <span class="kw1">GROUP</span> ReportingGroup
&nbsp;
<span class="kw1">WITH</span> <span class="br0">&#40;</span>GROUP_MAX_TEMPDB_DATA_PERCENT <span class="sy0">=</span> 25<span class="br0">&#41;</span>
&nbsp;
GO
&nbsp;
<span class="kw1">ALTER</span> RESOURCE GOVERN<span class="sy0">OR</span> <span class="kw1">RECONFIGURE</span>
&nbsp;
GO</pre></div></div>



<p>By doing this you prevent the new workload group we created for using more than 25% of the TempDB space.</p>



<h3 class="wp-block-heading"><strong>Accelerated Database Recovery (ADR) in TempDB</strong></h3>



<p>ADR has been around for a while in user databases, but the fact that we can now use it on TempDB comes with some promising opportunities, but what <em>is</em> ADR exactly?</p>



<p>ADR is basically SQL Server’s way of cleaning up messes <em>way</em> faster. Instead of doing long painful rollbacks that make you stare at “rolling back transaction…” like it’s judging your life choices, ADR keeps a lightweight version store so SQL Server can undo work almost instantly.</p>



<p>That means cancelled queries don’t hang around forever, crash recovery is dramatically quicker, and the transaction log doesn’t balloon while SQL Server cleans up after a bad decision. Think of ADR as giving SQL Server an “undo” button that actually works.</p>



<p><strong>What changes with ADR on TempDB?</strong></p>



<ul class="wp-block-list">
<li>Cancelled queries clean up <em>fast</em></li>



<li>TempDB log truncates more aggressively</li>



<li>Less waiting around for rollback to finish</li>
</ul>



<p>If you’ve ever cancelled a big query and watched TempDB sit there bloated for minutes… yeah, this helps.</p>



<p><strong>Enabling ADR for TempDB</strong></p>



<p>It’s a simple command to enable ADR for any database:</p>


<div id="wpshdo_23" class="wp-synhighlighter-outer"><div id="wpshdt_23" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_23"></a><a id="wpshat_23" class="wp-synhighlighter-title" href="#codesyntax_23"  onClick="javascript:wpsh_toggleBlock(23)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_23" onClick="javascript:wpsh_code(23)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_23" onClick="javascript:wpsh_print(23)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_23" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">ALTER</span> <span class="kw1">DATABASE</span> <span class="br0">[</span>tempdb<span class="br0">]</span>
&nbsp;
<span class="kw1">SET</span> ACCELERATED_DATABASE_RECOVERY <span class="sy0">=</span> <span class="kw1">ON</span>
&nbsp;
GO</pre></div></div>



<p>For tempdb, you’ll have to restart the SQL Service for this to take effect (because tempdb is recreated from scratch when you restart the SQL Service).</p>



<p>You can check whether ADR is enabled for tempdb by looking at sys.databases:</p>


<div id="wpshdo_24" class="wp-synhighlighter-outer"><div id="wpshdt_24" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_24"></a><a id="wpshat_24" class="wp-synhighlighter-title" href="#codesyntax_24"  onClick="javascript:wpsh_toggleBlock(24)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_24" onClick="javascript:wpsh_code(24)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_24" onClick="javascript:wpsh_print(24)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_24" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> name, is_accelerated_database_recovery_on <span class="kw1">FROM</span> sys.<span class="me1">databases</span> <span class="kw1">WHERE</span> name <span class="sy0">=</span> <span class="st0">'tempdb'</span></pre></div></div>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="295" height="69" class="wp-image-7377" src="https://sqlsolutionsgroup.com/wp-content/uploads/2026/01/word-image-7376-1.png" alt="" /></figure>



<p>&nbsp;</p>



<p><strong>Why you should turn this on</strong></p>



<p>TempDB is famously described as the public toilet of SQL Server, and this setting makes clean up a whole lot easier!</p>



<h3 class="wp-block-heading"><strong>Fewer TempDB Headaches</strong></h3>



<p>SQL Server 2025 also brings a bunch of quieter improvements that indirectly help TempDB:</p>



<ul class="wp-block-list">
<li>Better memory grant feedback → fewer spills</li>



<li>Smarter throttling for runaway queries</li>



<li>Reduced contention under high concurrency</li>
</ul>



<p>None of these are “headline features,” but together they mean:</p>



<ul class="wp-block-list">
<li>Less TempDB churn</li>



<li>Fewer surprises</li>



<li>Smoother performance under load</li>
</ul>



<p>&nbsp;</p>



<h3 class="wp-block-heading"><strong>Final Thoughts</strong></h3>



<p>These are enhancements to TempDB in SQL Server 2025, rather than re-writes of the fundamentals.  Honestly, that’s a good thing. It gives you, as the DBA, extra control over tempdb on your servers and gives an overall better performing system. Definitely test these things in your test environment first though!</p>
<p>The post <a href="https://sqlsolutionsgroup.com/enhancements-to-tempdb-in-sql-server-2025/">Enhancements to TempDB in SQL Server 2025</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/enhancements-to-tempdb-in-sql-server-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Why a SQL Server Health Check isn’t a Luxury</title>
		<link>https://sqlsolutionsgroup.com/sql-server-health-check-isnt-a-luxury/</link>
					<comments>https://sqlsolutionsgroup.com/sql-server-health-check-isnt-a-luxury/#respond</comments>
		
		<dc:creator><![CDATA[Jason Russell]]></dc:creator>
		<pubDate>Thu, 08 Jan 2026 22:08:30 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#SQLPerformance]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLServerHealthCheck]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=7374</guid>

					<description><![CDATA[<p>Does the integrity of your SQL Server databases keep you up at night? Is an outage of your system a matter of when and not if? Do you dread a call from the C-suite asking why everything is down?</p>
<p>The post <a href="https://sqlsolutionsgroup.com/sql-server-health-check-isnt-a-luxury/">Why a SQL Server Health Check isn’t a Luxury</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><span style="color: #f25e00;"><strong><a style="color: #f25e00;" href="https://sqlsolutionsgroup.com/sql-server-health-check/&quot; \t &quot;_blank">Request&nbsp;a SQL Server Health Check</a> and reduce the cost of downtime before it happens.</strong></span></p>



<p><em>Does the&nbsp;integrity of your SQL Server databases&nbsp;keep you up at night?&nbsp;Is an&nbsp;outage&nbsp;of your&nbsp;system&nbsp;a matter of&nbsp;when&nbsp;and not&nbsp;if?&nbsp;Do you dread a call from the C-suite asking why everything is down?</em> If your heart rate went up just reading those scenarios, you can see why an SSG SQL Server Health&nbsp; isn’t a luxury but a necessity.&nbsp;Don’t&nbsp;leave your business continuity up to chance.</p>



<h3 class="wp-block-heading"><strong>Everything Runs on Data</strong></h3>



<p>Data is the currency of&nbsp;business,&nbsp;and unplanned database outages&nbsp;don’t&nbsp;just disrupt IT.</p>



<p>Industry reports from&nbsp;<a href="https://www.erwoodgroup.com/blog/the-true-costs-of-downtime-in-2025-a-deep-dive-by-business-size-and-industry/" target="_blank" rel="noopener">Gartner, ITIC, and others</a>&nbsp;show that the&nbsp;financial impact&nbsp;of IT and database outages has reached historic highs, with costs for large enterprises often exceeding $1 million per hour.&nbsp;Gartner&#8217;s historical baseline of $5,600 per minute (~$336,000 per hour)&nbsp;remains&nbsp;a widely cited metric, but 2025-2026 data&nbsp;shows&nbsp;this has escalated to approximately $9,000 per minute for many firms. U.S. companies suffer an average of one unplanned&nbsp;downtime incident per month.</p>



<p>These days,&nbsp;database&nbsp;failure is likely to halt operations, impact customers, interrupt sales, and put revenue at risk. <span style="color: #f25e00;"><strong>It could also get someone fired</strong></span>.</p>



<h3 class="wp-block-heading"><strong>Our SQL Server Health Check</strong></h3>



<p>Be proactive and&nbsp;find problems in your&nbsp;SQL Server instances before they blow up.&nbsp;A&nbsp;Health&nbsp;Check&nbsp;from SQL Solutions Group<strong>&nbsp;</strong>helps you identify risks and how to fix issues, as we test everything from hardware to hypervisor/cloud configuration to OS to your SQL Server installation itself.&nbsp;Once&nbsp;we complete a Health Check on your&nbsp;instances, you receive:</p>



<ul class="wp-block-list">
<li>A comprehensive, executive-ready risk report</li>



<li>Prioritized remediation roadmap</li>



<li>Practical recommendations aligned to your business goals</li>
</ul>



<h3 class="wp-block-heading"><strong>Health Check Take-aways</strong></h3>



<p>In other words,&nbsp;you’ll&nbsp;have a clear plan for&nbsp;getting your instances as healthy as possible. You can do that work yourself, or you can&nbsp;leverage&nbsp;our&nbsp;expertise&nbsp;to get it done.&nbsp;Our goal&nbsp;with each SQL Server Health Check is to:</p>



<ul class="wp-block-list">
<li>Restore confidence in your databases</li>



<li>Reduce downtime</li>



<li>Improve resilience</li>



<li>Support uninterrupted business operations</li>



<li>Reduce your stress</li>



<li>Give you peace of mind</li>
</ul>



<p>If SQL Server supports your core systems, a proactive health check&nbsp;is so much more than a useful&nbsp;technical exercise.&nbsp;It’s&nbsp;a <strong>risk-management&nbsp;and ROI decision</strong>. You can’t afford the risk to your databases because the problems won’t go away if you ignore them. Address your ticking timebombs before your phone rings when you least want it to with a Health Check from SQL Solutions Group.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/sql-server-health-check-isnt-a-luxury/">Why a SQL Server Health Check isn’t a Luxury</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/sql-server-health-check-isnt-a-luxury/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Track Database File Sizes with PowerShell: A Quick Guide for DBAs</title>
		<link>https://sqlsolutionsgroup.com/track-database-file-sizes-with-powershell/</link>
					<comments>https://sqlsolutionsgroup.com/track-database-file-sizes-with-powershell/#comments</comments>
		
		<dc:creator><![CDATA[Kyle Burwell]]></dc:creator>
		<pubDate>Mon, 29 Dec 2025 10:48:30 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#PowerShell]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[DBA]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=7348</guid>

					<description><![CDATA[<p>Database files (mdf, nds, ldfs, etc.) can get out of hand quickly and easily, leading to issues down the road. This can be due to improper planning, large data loads, and bad code run in production, just to list a few. As unglamorous as disk space monitoring is, we need to do our part as [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/track-database-file-sizes-with-powershell/">Track Database File Sizes with PowerShell: A Quick Guide for DBAs</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Database files (mdf, nds, ldfs, etc.) can get out of hand quickly and easily, leading to issues down the road. This can be due to improper planning, large data loads, and bad code run in production, just to list a few. As unglamorous as disk space monitoring is, we need to do our part as DBAs. This post is a quick guide on how to track database file sizes with PowerShell.</p>
<h3>Getting Started</h3>
<p>If you haven’t already, make sure you have <a href="https://dbatools.io/">DBATools</a> installed. We are going to be using a command called <strong>Get-DbaDbFile</strong> to gather the information for us. This command only requires one parameter, <strong>-SqlInstance</strong>. Here is a snippet of what I get when I run it against my local dev instance:</p>
<p><figure id="attachment_7349" aria-describedby="caption-attachment-7349" style="width: 757px" class="wp-caption alignnone"><img loading="lazy" decoding="async" class="wp-image-7349" src="https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/a-screenshot-of-a-computer-ai-generated-content-m.png" alt="A screenshot of a computerAI-generated content may be incorrect." width="757" height="632" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/a-screenshot-of-a-computer-ai-generated-content-m.png 757w, https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/a-screenshot-of-a-computer-ai-generated-content-m-300x250.png 300w" sizes="(max-width: 757px) 100vw, 757px" /><figcaption id="caption-attachment-7349" class="wp-caption-text">Figure 1: Really Kyle? Data files on the C: drive?</figcaption></figure></p>
<p>&nbsp;</p>
<p>This is a bit more information than we really need right now, so let’s trim it down and get some parameters added. For this script, we really only need SqlInstance, Database, TypeDescription, LogicalName, PhysicalName, Size, UsedSpace, and AvailableSpace. We can also exclude system databases from the result set. For readability, I am going to use Format-Table. I will also start to add in some parameters:</p>
<p><div id="wpshdo_25" class="wp-synhighlighter-outer"><div id="wpshdt_25" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_25"></a><a id="wpshat_25" class="wp-synhighlighter-title" href="#codesyntax_25"  onClick="javascript:wpsh_toggleBlock(25)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_25" onClick="javascript:wpsh_code(25)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_25" onClick="javascript:wpsh_print(25)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_25" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;"><span class="re0">$SqlInstance</span> <span class="sy0">=</span> <span class="st0">&quot;SSG-LT-KBURWELL&quot;</span>
&nbsp;
Get<span class="sy0">-</span>DbaDbFile <span class="sy0">-</span>SqlInstance <span class="re0">$SqlInstance</span>
&nbsp;
Get<span class="sy0">-</span>DbaDbFile <span class="sy0">-</span>SqlInstance <span class="re0">$SqlInstance</span> <span class="sy0">-</span>ExcludeDatabase master<span class="sy0">,</span>model<span class="sy0">,</span>msdb<span class="sy0">,</span>tempdb <span class="sy0">|</span>
&nbsp;
    <span class="kw1">Select-Object</span> SqlInstance<span class="sy0">,</span> Database<span class="sy0">,</span> TypeDescription<span class="sy0">,</span> LogicalName<span class="sy0">,</span> PhysicalName<span class="sy0">,</span> Size<span class="sy0">,</span> UsedSpace<span class="sy0">,</span> AvailableSpace <span class="sy0">|</span> <span class="kw1">Format-Table</span></pre></div></div></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-7350" src="https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/word-image-7348-2.png" alt="track database file sizes with Powershell" width="1410" height="138" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/word-image-7348-2.png 1410w, https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/word-image-7348-2-300x29.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/word-image-7348-2-1024x100.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/word-image-7348-2-768x75.png 768w" sizes="(max-width: 1410px) 100vw, 1410px" /></p>
<h3>Using Custom Objects</h3>
<p>This will be much easier to work with, but it is important to be aware that the columns related to file size have GB, MB, and KB values, depending on what is most appropriate for that file size. This is great when just looking at the data like this, but can be a bit problematic for mathematical comparisons, which we will be doing later. To get around this, we can just use some custom objects:</p>
<p><div id="wpshdo_26" class="wp-synhighlighter-outer"><div id="wpshdt_26" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_26"></a><a id="wpshat_26" class="wp-synhighlighter-title" href="#codesyntax_26"  onClick="javascript:wpsh_toggleBlock(26)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_26" onClick="javascript:wpsh_code(26)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_26" onClick="javascript:wpsh_print(26)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_26" class="wp-synhighlighter-inner" style="display: block;"><pre class="powershell" style="font-family:monospace;"><span class="re0">$SqlInstance</span> <span class="sy0">=</span> <span class="st0">&quot;SSG-LT-KBURWELL&quot;</span>
&nbsp;
Get<span class="sy0">-</span>DbaDbFile <span class="sy0">-</span>SqlInstance <span class="re0">$SqlInstance</span> <span class="sy0">-</span>ExcludeDatabase master<span class="sy0">,</span>model<span class="sy0">,</span>msdb<span class="sy0">,</span>tempdb <span class="sy0">|</span>
&nbsp;
    <span class="kw1">Select-Object</span> SqlInstance<span class="sy0">,</span> TypeDescription<span class="sy0">,</span> LogicalName<span class="sy0">,</span> PhysicalName<span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st0">'DatabaseName'</span>; Expression<span class="sy0">=</span><span class="br0">&#123;</span><a href="about:blank"><span class="kw6">$_</span></a>.Database<span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st0">'SizeMB'</span>; Expression<span class="sy0">=</span><span class="br0">&#123;</span> <span class="br0">[</span>math<span class="br0">]</span>::Round<span class="br0">&#40;</span><a href="about:blank"><span class="kw6">$_</span></a>.Size <span class="sy0">/</span> 1MB<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st0">'UsedSpaceMB'</span>; Expression<span class="sy0">=</span><span class="br0">&#123;</span> <span class="br0">[</span>math<span class="br0">]</span>::Round<span class="br0">&#40;</span><a href="about:blank"><span class="kw6">$_</span></a>.UsedSpace <span class="sy0">/</span> 1MB<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st0">'AvailableSpaceMB'</span>; Expression<span class="sy0">=</span><span class="br0">&#123;</span> <span class="br0">[</span>math<span class="br0">]</span>::Round<span class="br0">&#40;</span><a href="about:blank"><span class="kw6">$_</span></a>.AvailableSpace <span class="sy0">/</span> 1MB<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st0">'FreeSpacePercent'</span>; Expression<span class="sy0">=</span><span class="br0">&#123;</span>
&nbsp;
    <span class="kw3">if</span> <span class="br0">&#40;</span><a href="about:blank"><span class="kw6">$_</span></a>.Size <span class="kw4">-gt</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="re0">$sizeMB</span> <span class="sy0">=</span> <span class="br0">[</span>math<span class="br0">]</span>::Round<span class="br0">&#40;</span><a href="about:blank"><span class="kw6">$_</span></a>.Size <span class="sy0">/</span> 1MB<span class="sy0">,</span> 2<span class="br0">&#41;</span>
&nbsp;
        <span class="re0">$availMB</span> <span class="sy0">=</span> <span class="br0">[</span>math<span class="br0">]</span>::Round<span class="br0">&#40;</span><a href="about:blank"><span class="kw6">$_</span></a>.AvailableSpace <span class="sy0">/</span> 1MB<span class="sy0">,</span> 2<span class="br0">&#41;</span>
&nbsp;
        <span class="br0">[</span>math<span class="br0">]</span>::Round<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$availMB</span> <span class="sy0">/</span> <span class="re0">$sizeMB</span><span class="br0">&#41;</span> <span class="sy0">*</span> 100<span class="sy0">,</span> 2<span class="br0">&#41;</span>
&nbsp;
        <span class="br0">&#125;</span> <span class="kw3">else</span> <span class="br0">&#123;</span> <span class="nu0">0</span> <span class="br0">&#125;</span>
&nbsp;
    <span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
    <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st0">'CaptureTimestamp'</span>; Expression<span class="sy0">=</span><span class="br0">&#123;</span> <span class="kw1">Get-Date</span> <span class="kw5">-Format</span> <span class="st0">&quot;yyyy-MM-dd HH:mm:ss&quot;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span>
&nbsp;
    <span class="sy0">|</span> <span class="kw1">Format-Table</span></pre></div></div></p>
<p>This converts all sizes to MB, which will make any mathematical operations much easier. I also included a custom object for DatabaseName, FileSpacePercent, and CaptureTimestamp. DatabaseName really just acts as a custom column name, which is necessary when loading the data into SQL.</p>
<h3>On To The Comparisons</h3>
<p>Now that we are getting only the data we need, we need to save it to a table so we can do point in time comparisons. As with everything else, DBATools makes this ridiculously easy. We just need to point it to an instance and a database, it will take care of the rest. Instead of piping our results to Format-Table, I am going to pipe them to a command that will build and load a SQL table:</p>
<p><div id="wpshdo_27" class="wp-synhighlighter-outer"><div id="wpshdt_27" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_27"></a><a id="wpshat_27" class="wp-synhighlighter-title" href="#codesyntax_27"  onClick="javascript:wpsh_toggleBlock(27)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_27" onClick="javascript:wpsh_code(27)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_27" onClick="javascript:wpsh_print(27)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_27" class="wp-synhighlighter-inner" style="display: block;"><pre class="php" style="font-family:monospace;"><span class="re0">$SqlInstance</span> <span class="sy0">=</span> <span class="st0">&quot;SSG-LT-KBURWELL&quot;</span>
&nbsp;
<span class="re0">$WriteInstance</span> <span class="sy0">=</span> <span class="st0">&quot;SSG-LT-KBURWELL&quot;</span>
&nbsp;
<span class="re0">$WriteDB</span> <span class="sy0">=</span> <span class="st0">&quot;DBA&quot;</span>
&nbsp;
<span class="re0">$WriteTable</span> <span class="sy0">=</span> <span class="st0">&quot;FileSizesAndUsage&quot;</span>
&nbsp;
Get<span class="sy0">-</span>DbaDbFile <span class="sy0">-</span>SqlInstance <span class="re0">$SqlInstance</span> <span class="sy0">-</span>ExcludeDatabase master<span class="sy0">,</span>model<span class="sy0">,</span>msdb<span class="sy0">,</span>tempdb <span class="sy0">|</span>
&nbsp;
    Select<span class="sy0">-</span>Object SqlInstance<span class="sy0">,</span> TypeDescription<span class="sy0">,</span> LogicalName<span class="sy0">,</span> PhysicalName<span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st_h">'DatabaseName'</span><span class="sy0">;</span> Expression<span class="sy0">=</span><span class="br0">&#123;</span><span class="re0">$_</span><span class="sy0">.</span>Database<span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st_h">'SizeMB'</span><span class="sy0">;</span> Expression<span class="sy0">=</span><span class="br0">&#123;</span> <span class="br0">[</span>math<span class="br0">]</span><span class="sy0">::</span><a href="http://www.php.net/round"><span class="kw3">Round</span></a><span class="br0">&#40;</span><span class="re0">$_</span><span class="sy0">.</span>Size <span class="sy0">/</span> 1MB<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st_h">'UsedSpaceMB'</span><span class="sy0">;</span> Expression<span class="sy0">=</span><span class="br0">&#123;</span> <span class="br0">[</span>math<span class="br0">]</span><span class="sy0">::</span><a href="http://www.php.net/round"><span class="kw3">Round</span></a><span class="br0">&#40;</span><span class="re0">$_</span><span class="sy0">.</span>UsedSpace <span class="sy0">/</span> 1MB<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st_h">'AvailableSpaceMB'</span><span class="sy0">;</span> Expression<span class="sy0">=</span><span class="br0">&#123;</span> <span class="br0">[</span>math<span class="br0">]</span><span class="sy0">::</span><a href="http://www.php.net/round"><span class="kw3">Round</span></a><span class="br0">&#40;</span><span class="re0">$_</span><span class="sy0">.</span>AvailableSpace <span class="sy0">/</span> 1MB<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
     <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st_h">'FreeSpacePercent'</span><span class="sy0">;</span> Expression<span class="sy0">=</span><span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$_</span><span class="sy0">.</span>Size <span class="sy0">-</span>gt 0<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="re0">$sizeMB</span> <span class="sy0">=</span> <span class="br0">[</span>math<span class="br0">]</span><span class="sy0">::</span><a href="http://www.php.net/round"><span class="kw3">Round</span></a><span class="br0">&#40;</span><span class="re0">$_</span><span class="sy0">.</span>Size <span class="sy0">/</span> 1MB<span class="sy0">,</span> 2<span class="br0">&#41;</span>
&nbsp;
        <span class="re0">$availMB</span> <span class="sy0">=</span> <span class="br0">[</span>math<span class="br0">]</span><span class="sy0">::</span><a href="http://www.php.net/round"><span class="kw3">Round</span></a><span class="br0">&#40;</span><span class="re0">$_</span><span class="sy0">.</span>AvailableSpace <span class="sy0">/</span> 1MB<span class="sy0">,</span> 2<span class="br0">&#41;</span>
&nbsp;
        <span class="br0">[</span>math<span class="br0">]</span><span class="sy0">::</span><a href="http://www.php.net/round"><span class="kw3">Round</span></a><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$availMB</span> <span class="sy0">/</span> <span class="re0">$sizeMB</span><span class="br0">&#41;</span> <span class="sy0">*</span> 100<span class="sy0">,</span> 2<span class="br0">&#41;</span>
&nbsp;
        <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span> <span class="nu0">0</span> <span class="br0">&#125;</span>
&nbsp;
    <span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
    <span class="sy0">@</span><span class="br0">&#123;</span>Name<span class="sy0">=</span><span class="st_h">'CaptureTimestamp'</span><span class="sy0">;</span> Expression<span class="sy0">=</span><span class="br0">&#123;</span> Get<span class="sy0">-</span><a href="http://www.php.net/date"><span class="kw3">Date</span></a> <span class="sy0">-</span>Format <span class="st0">&quot;yyyy-MM-dd HH:mm:ss&quot;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span>
&nbsp;
    <span class="sy0">|</span> Write<span class="sy0">-</span>DbaDbTableData <span class="sy0">-</span>SqlInstance <span class="re0">$WriteInstance</span> <span class="sy0">-</span>Database <span class="re0">$WriteDB</span> <span class="sy0">-</span>Table <span class="re0">$WriteTable</span> <span class="sy0">-</span>AutoCreateTable</pre></div></div></p>
<p>Now I have the data in SQL Server:</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-7351" src="https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/a-screenshot-of-a-computer-ai-generated-content-m-1.png" alt="track database file sizes with Powershell" width="1267" height="207" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/a-screenshot-of-a-computer-ai-generated-content-m-1.png 1267w, https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/a-screenshot-of-a-computer-ai-generated-content-m-1-300x49.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/a-screenshot-of-a-computer-ai-generated-content-m-1-1024x167.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2025/12/a-screenshot-of-a-computer-ai-generated-content-m-1-768x125.png 768w" sizes="(max-width: 1267px) 100vw, 1267px" /></p>
<p>With this information being collected regularly, via scheduled task or agent job, we can easily trend out how much our database files are growing. It will also make potential misconfigurations stand out, such as a 1TB mdf with 99% free space. Personally, I use it in client environments to find over-allocated files that can be shrunk to reclaim some space. I know, “shrink bad”, but sometimes you just need to do it. As you can see, it&#8217;s quite straightforward and rather easy to track database file sizes with Powershell!</p>
<p>The post <a href="https://sqlsolutionsgroup.com/track-database-file-sizes-with-powershell/">Track Database File Sizes with PowerShell: A Quick Guide for DBAs</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/track-database-file-sizes-with-powershell/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
