I was replying on a MSDN forum thread recently and found that the a VSS backup was failing due to large number of database volumes residing on a particular volume.
I re-created the issue on my box by limiting the number of Max Worker Threads to 128 on my SQL Server 2008 instance. After making the change to the number of worker threads, I created 99 databases on the D: drive of my server using the following script:
set nocount on
declare @cntr int = 1,@sql varchar(8000)
while @cntr < 100
begin
set @sql = 'CREATE DATABASE [db'+cast(@cntr as varchar(5))+'] ON  PRIMARY
( NAME = N' 'db'+cast(@cntr as varchar(5))+''', FILENAME = N' 'D:\DBFiles\db'+cast(@cntr as varchar(5))+'.mdf' ')
LOG ON
( NAME = N' 'db'+cast(@cntr as varchar(5))+'_log' ', FILENAME = N' 'D:\DBFiles\db'+cast(@cntr as varchar(5))+'.ldf'')'
set @cntr = @cntr + 1
exec(@sql)
end
I then attempted to backup the DBFiles folder on the D: drive using Windows Server Backup and it failed.

After that I looked into the SQL Server Errorlog and found the following errors:
2010-12-06 03:39:15.280 Backup Error: 3041, Severity: 16, State: 1.2010-12-06 03:39:15.280 Backup BACKUP failed to complete the command BACKUP DATABASE db68. Check the backup application log for detailed messages.
2010-12-06 03:39:15.370 spid53 Error: 18210, Severity: 16, State: 1.2010-12-06 03:39:15.370 spid53 BackupVirtualDeviceFile::PrepareToFreeze: failure on backup device ‘{DB840D1B-DD17-4D73-83F1-7390F676DEE4}1’. Operating system error 995(The I/O operation has been aborted because of either a thread exit or an application request.).
I had already documented earlier that the infamous 995 error message could be a problem with the sqlvdi.dll but in this case, it is not!
The next thing I did was to pick the errors from the Application Event logs and I found the following errors repeated multiple times:
Error 12/6/2010 3:39:15 AM SQLVDI 1 None SQLVDI: Loc=SignalAbort. Desc=Client initiates abort. ErrorCode=(0). Process=3920. Thread=11604. Client. Instance=SQL2008. VD=Global\{DB840D1B-DD17-4D73-83F1-7390F676DEE4}1_SQLVDIMemoryName_0.Error 12/6/2010 3:39:15 AM SQLWRITER 24583 None Sqllib error: OLEDB Error encountered calling ICommandText::Execute. hr = 0x80040e14. SQLSTATE: 42000, Native Error: 3013
Error state: 1, Severity: 16
Source: Microsoft SQL Server Native Client 10.0
Error message: BACKUP DATABASE is terminating abnormally.
SQLSTATE: 42000, Native Error: 3224
Error state: 1, Severity: 16
Source: Microsoft SQL Server Native Client 10.0
Error message: Cannot create worker thread.
If you look closely at the above error, then you will find that the following error message stands out like a sore thumb: “Cannot create worker thread”. After this issue occurs, you will find that the SQLWriter shows the following when you execute the command: “vssadmin list writers” from a command prompt window:
Writer name: ‘SqlServerWriter’ Writer Id: {a65faa63-5ea8-4ebc-9dbd-a0c4db26912a}
Writer Instance Id: {9075f235-fdee-4445-851b-a69c54bd8b33}
State: [8] Failed
Last error: Non-retryable error
Ensure that you do not have any memory related errors in the SQL Server Errorlogs or any DBCC MEMORYSTATUS outputs printed in the Errorlog during the time of the backup failure. If there aren’t, then the above issue occurs due to the SQL instance hitting a worker thread limit.
The reason for this is explained by Rob Dorr (Principal SQL Server Escalation Engineer at Microsoft) in his blog post:
The controller and database worker come from the worker pool. So if your max worker thread is configured for 255 the answer would be a max of 255 / 2 = 127 databases. You probably won’t get to 127 with this configuration as you have system workers (lazy writer, checkpoint, log writer, and others) that already are using workers.
On my SQL instance, I have 120 database and I need about 240 worker threads to complete this operation. However, I have only 128 worker threads configured for my SQL instance. If you have Dedicated Administrator Connection enabled for the SQL instance, then you can this troubleshooting further and execute a select against the DMV sys.dm_os_schedulers (for SQL Server 2005 or above) and get an output of the following type:
status counts
———————- ——–
HIDDEN ONLINE 168
VISIBLE ONLINE 8
VISIBLE ONLINE (DAC) 1
Query used:
select status, count(*) as counts
from sys.dm_os_schedulers
group by status
As you will see that there are about 168 hidden online schedulers created for performing the Snapshot backups. But SQL instance in question doesn’t have sufficient work threads to facilitate this operation.
What can you do in such situations:
1. Increase the number of worker threads to account for the additional worker threads required for completing the VSS backups. This can be counter-productive as it can lead to non-Buffer Pool memory contention on 32-bit instances of SQL Server. The higher the number of max worker threads on your SQL Server instance, more the amount of non-BPool memory is consumed for the thread stack. This results in depletion of the available Buffer Pool memory.
2. Change the physical location of the SQL Server database files so that all the database files do not reside on the same volume.
3. Perform a VSS Backup with SQL Server VSS Writer service turned OFF. However, you cannot recover any SQL Server database files from such a Volume Shadow Backup.
4. Use SQL Native backups or other VDI backup tools (non-Snapshot) to perform SQL Server database backups.
Note: This also happens when you select any file on a drive which has a high number of SQL Server database files. This is because the SQL Server VSS Writer tries to enumerate the database files for the SQL Server instance that reside on the volume that has been selected for the Snapshot backup.
Like this:
Like Loading...