PRB: SQL 7.0 VDI Backup May Fail When SQL Server 2000 Is Installed on the Same Computer (280759)
The information in this article applies to:
- Microsoft SQL Server 7.0
- Microsoft SQL Server 2000 (all editions)
This article was previously published under Q280759 SYMPTOMS
If both SQL Server 7.0 (default instance) and SQL Server 2000 (named instance) are installed on the same computer, an application that uses the SQL Server Virtual Device Interface (VDI) may fail to back up a SQL Server 7.0 database with the following error message in the application log.
On Microsoft Windows NT 4.0:
18210: BackupVirtualDeviceSet::Initialize: CoCreateInstance
failure on backup device '<device name>'.
Operating system error -2147221164(Class not registered).
On Microsoft Windows 2000:
18210: BackupVirtualDeviceSet::Initialize: CoCreateInstance
failure on backup device '<device name>'.
Operating system error -2147024769(The specifiedprocedure could not be found.).
CAUSE
This issue is caused by a version mismatch between Sqlvdi.dll and Sqlresld.dll; the details are as follows:
- When an instance of SQL Server 2000 is installed, it registers the SQL VDI COM Server (MSSQL-VDI-Server) to point to the SQL Server 2000 version of Sqlvdi.dll (usually found in \Program Files\Microsoft SQL Server\MSSQL\COM\80). Consequently, VDI COM object initialization uses this DLL for both the 7.0 and 2000 instances of SQL Server. SQL VDI COM object initialization is required in order for a SQL VDI application to work.
- The SQL Server 2000 version of Sqlvdi.dll depends on the SQL Server 2000 version of Sqlresld.dll. (The 7.0 version of Sqlvdi.dll does not depend on the 7.0 version of Sqlresld.dll.) In order for the 2000 version of Sqlvdi.dll to be loaded successfully, the 2000 version of Sqlresld.dll must be loaded first.
- However, different versions of Sqlresld.dll can be loaded into each respective SQL Server process space (in other words, the 7.0 version of Sqlresld.dll into the SQL Server 7.0 server process, and the 2000 version of Sqlresld.dll into the SQL Server 2000 server process) as a result of other operations such as Enterprise Manager or other DLLs that load Sqlresld.dll.
Normally, the 2000 version of Sqlvdi.dll loads the 2000 version of Sqlresld.dll, containing the routines that it requires. However, if the 7.0 Sqlresld.dll has already been loaded as a result of using Enterprise Manager or some other operation or DLL, the 2000 Sqlvdi.dll will not be able to find the required routines. In this case, COM initialization fails with the CoCreateInstance failure.
To repeat, this only happens when the 7.0 Sqlresld.dll is loaded into the SQL 7.0 server process space before the 2000 version of Sqlvdi.dll gets its chance to load the 2000 version of Sqlresld.dll.
RESOLUTION
Rename the 7.0 versions of Sqlresld.dll and Sqlvdi.dll in the \Mssql7\Binn directory. Then copy the SQL 2000 versions of Sqlresld.dll and Sqlvdi.dll into the \Mssql7\Binn directory. By default, the 7.0 versions of Sqlresld.dll and Sqlvdi.dll are installed in \Mssql7\Binn directory, and the 2000 versions of Sqlresld.dll and Sqlvdi.dll are installed in the \Program Files\Microsoft SQL Server\80\COM directory. Due to additional file dependencies, it is also recommended that you place the SQL 2000 versions of Sqlunirl.dll and Sqlsvc.dll into the SQL 7.0 Mssql7\Binn directory.
Modification Type: | Major | Last Reviewed: | 10/17/2003 |
---|
Keywords: | kbprb KB280759 |
---|
|