You encounter error message "The system cannot find the file specified" when attempting to perform backups using sqlvdi

Symptoms you encounter:

 

SQL Server 2000 SP4 x86 is installed on a Windows 2003 X64 server. You use x64 backup applications to perform backups of databases. These backup applications use sqlvdi to interact with the SQL Server. You installed the sqlvdi.dll from KB 913100 and the x64 backup applications work fine. Later you install KB 935465 or any of the SQL 2000 QFE’s or GDR’s released after this fix. After this you will notice the following messages in the Windows Event log when you attempt to perform backup using the x64 backup applications:

 

Event Type: Error

Event Source: SQLVDI

Event Category: None

Event ID: 1

Date: 2/24/2009

Time: 10:18:02 AM

User: N/A

Description: SQLVDI: Loc=SVDS::Open. Desc=Open(Control). ErrorCode=(2)The system cannot find the file specified. . Process=1808. Thread=1468. Server. Instance=MSSQLSERVER. VD=GlobalSUPERBAK_SQLVDIMemoryName_0.

Event Type: Error

Event Source: MSSQLSERVER

Event Category: (2)

Event ID: 17055

Date: 2/24/2009

Time: 10:18:02 AM

Description: 18210 : BackupVirtualDeviceSet::Initialize: Open failure on backup device 'SUPERBAK'. Operating system error 0x80070002(The system cannot find the file specified.).

Event Type: Error

Event Source: MSSQLSERVER

Event Category: (6)

Event ID: 17055

Date: 2/24/2009

Time: 10:18:02 AM

Description: 3041 : BACKUP failed to complete the command BACKUP DATABASE PUBS TO VIRTUAL_DEVICE='SUPERBAK'

 

What causes this?

 

If you examine the versions of the sqlvdi.dll from the Microsoft SQL Server80COM directories you will notice they are of different versions. The dll in the x86 folder will be of a higher version than the one in the x64 folder. An example from a server which has this problem:

C:Program Files (x86)Microsoft SQL Server80COM version [2000.85.2101.0 NT INTEL X86]

C:Program FilesMicrosoft SQL Server80COM version [2000.85.1054.0 NT AMD64]

 

As a result the name used for the Virtual Device [GlobalSUPERBAK_SQLVDIMemoryName_0] is not the same in both the dll’s. So when you try to take a backup using x64 application that uses the x64 sqlvdi.dll it uses a different name than the one used by the x86 sqlvdi.dll loaded into the sqlservr.exe process. This results in the ErrorCode=(2)The system cannot find the file specified when a call is internally made to kernel32!OpenFileMappingW().

 

How can you fix this?

 

There are two ways you can address this problem.

 

Method 1:

Download the “Microsoft SQL Server 2005 Backward Compatibility Components” from Feature Pack for Microsoft SQL Server 2005.

You can download the SQLServer2005_BC_x64.msi and apply just the SQL VDI component. After applying you will notice that the x86 and x64 file versions match. An example below:

C:Program Files (x86)Microsoft SQL Server80COM [ version 2000.85.2312.0 NT INTEL X86]

C:Program FilesMicrosoft SQL Server80COM [ version 2000.85.2312.0 NT AMD64]

If the files were in use, the setup will request a restart. You should be able to perform backups now.

 

Method 2:

Make a copy of the sqlvdi.dll from the locations: C:Program Files (x86)Microsoft SQL Server80COM and C:Program FilesMicrosoft SQL Server80COM

Download the hotfix package from KB 913100  

Use the command line to extract the contents of this package: sql2000-kb913100-v8.00.1101-x64-enu.exe /X

After the extraction is over, you will find 2 sub-folders: x64 and x86

Copy the sqlvdi.dll file from the x86 folder to C:Program Files (x86)Microsoft SQL Server80COM

Copy the sqlvdi.dll file from the x64 folder to C:Program FilesMicrosoft SQL Server80COM

Register both the dll’s using regsvr32

Now you will be able to perform backups using the backup application. If the sqlvdi.dll is in use you will have to stop the SQL Server service and the backup application that has loaded the sqlvdi.dll. This will prevent the file copy step.

 

Note: You might encounter this problem when attempting to backup databases on SQL Server 2005 and SQL Server 2008 if the backup application uses SQLVDI interfaces and the mismatch exists between the x64 and x86 dll’s.

 

We will add information to this post when we get further updates on this problem. We are in the process of creating a Knowledge Base article to discuss this problem.

 

Thanks

Suresh B. Kandoth

SQL Server Senior Escalation Engineer