The SSIS Subsystem Failed to Load: What It Means and How to Fix It
When SQL Server Agent reports that the SSIS subsystem failed to load, the fix is usually two T-SQL commands and a service restart. The root cause is almost always a stale pointer in msdb.dbo.syssubsystems pointing to a DLL location that no longer exists on the current server.
This error turns up most often after a server migration where you've restored the msdb database from the old server. Your maintenance plans stop running, SQL Server Agent suspends affected jobs, and the following errors start appearing in the SQL Agent log and Windows Event Log:
The SSIS subsystem failed to load
Subsystem could not be loaded
The job has been suspended
The specified module could not be found
It looks alarming, but it's a well-understood problem with a documented resolution (Microsoft KB article 914171).
Why Does This Happen?
SQL Server Agent maintains a table in msdb called syssubsystems. This table stores the file paths to the DLL files that each subsystem needs to function, including SSIS, PowerShell, TSQL, and others.
When you restore msdb from an old server, you're bringing across those file paths as they existed on the old machine. If the new server has SQL Server installed on a different drive or directory, those paths are immediately wrong. SQL Server Agent tries to load the SSIS subsystem using the old path, fails to find the DLL, and suspends every job that depends on it.
This is particularly common when:
- The old server had SQL Server on
C:\Program Files\Microsoft SQL Server\and the new server usesD:\orE:\ - The SQL Server version or instance name differs between servers
- The new server has a different Windows architecture or drive layout
It's not a bug. It's a predictable consequence of carrying msdb metadata across to a machine with a different directory structure.
How to Confirm the SSIS Subsystem Is the Problem
Before making any changes, verify the diagnosis. Run this query against your msdb database:
SELECT * FROM msdb.dbo.syssubsystems
Look at the subsystem_dll column. If the paths listed there point to directories that don't exist on the current server, you've confirmed the problem. You'll typically see something like D:\MSSQL\Binn\SQLISXP130.dll when the actual installation is on C:\Program Files\Microsoft SQL Server\130\DTS\Binn\.
This single query is often enough to confirm the issue without needing to dig through event logs.
How to Fix the SSIS Subsystem Failed to Load Error
The fix involves clearing the stale entries from syssubsystems and letting SQL Server repopulate the table with the correct paths for the current server. This is a three-step process.
Step 1: Clear the stale subsystem entries
USE msdb
GO
DELETE FROM msdb.dbo.syssubsystems
GO
This removes all the old path references. Don't be alarmed by deleting from a system table here. The next step rebuilds it correctly.
Step 2: Repopulate the subsystem table
EXEC msdb.dbo.sp_verify_subsystems 1
GO
The stored procedure sp_verify_subsystems scans the current SQL Server installation and repopulates syssubsystems with the correct DLL paths for this server. Run the SELECT query again afterwards to confirm the paths now reflect the actual installation directory.
Step 3: Restart SQL Server Agent
The Agent service caches subsystem information at startup. Even after you've updated the table, the running Agent process still holds the old (invalid) paths in memory. You need to restart the SQL Server Agent service for it to read the updated table and unsuspend the affected jobs.
You can do this through SQL Server Management Studio (right-click SQL Server Agent, select Restart), through Windows Services, or via PowerShell:
Restart-Service -Name "SQLSERVERAGENT"
If you're running a named instance, the service name will be SQLAgent$INSTANCENAME.
After the restart, check the SQL Agent job history to confirm previously suspended jobs are now running as expected.
What About the Connection Strings in Your SSIS Packages?
Fixing the subsystem table resolves the "failed to load" error, but if you've migrated from a different server you'll likely hit a second problem: your SSIS packages and maintenance plans still have connection strings pointing to the old server name.
Each maintenance plan contains at least one database connection, and those connections reference the server by name. After a migration, those connections are pointing at a server that may no longer exist, or may no longer be the intended target.
You'll need to update each package or maintenance plan individually. The approach depends on how the packages are stored:
-
Maintenance plans stored in msdb: Open each plan in SSMS, navigate to the connection manager at the bottom of the designer, and update the server name. In some versions of SSMS the input fields appear greyed out. If that happens, delete the existing connection and create a new one, then reassign each task in the plan to use the new connection.
-
SSIS packages deployed to the SSIS Catalog (SSISDB): Use the Catalog's built-in environment variables and connection manager overrides to redirect connections without modifying the package itself. This is the correct approach for packages in the Catalog and avoids the need to redeploy.
-
Packages stored as files: Open them in SQL Server Data Tools (SSDT) or a text editor, update the connection string, and redeploy.
If you're managing a large number of packages, scripting the connection string updates through the SSIS object model or directly against the SSISDB catalog views is far more efficient than clicking through each one manually.
A Note on Maintenance Plans and SSIS
Maintenance plans have been implemented as SSIS packages since SQL Server 2005. That architecture hasn't changed in the versions since. It means maintenance plans inherit all the connection management behaviour of SSIS, including the need to update connection strings when the server context changes.
For straightforward maintenance tasks like backups, integrity checks, and index rebuilds, many experienced DBAs have moved away from the built-in maintenance plan designer entirely. Solutions like Ola Hallengren's SQL Server Maintenance Solution use plain T-SQL scripts executed by SQL Agent jobs, which are far easier to migrate, version-control, and troubleshoot. There's no SSIS dependency, no connection manager to update, and no GUI-driven configuration to unpick after a migration.
Key Takeaways
- The "SSIS subsystem failed to load" error after a server migration is caused by stale file paths in
msdb.dbo.syssubsystems. The paths reference the old server's directory structure. - The fix is two queries: delete the stale rows from
syssubsystems, then runsp_verify_subsystems 1to repopulate the table with correct paths for the current server. - Always restart SQL Server Agent after making this change. The service must reload the subsystem table from scratch.
- After fixing the subsystem error, check all SSIS packages and maintenance plans for connection strings still pointing to the old server name.
- This issue is documented in Microsoft KB article 914171 and is a known, predictable consequence of restoring
msdbacross servers with different installation paths.
Server migrations are one of the highest-risk events in a SQL Server environment. A missed configuration detail, a stale pointer in a system table, or an overlooked connection string can cause silent failures that aren't caught until something important doesn't run. DBA Services works with organisations across Australia to plan and execute SQL Server migrations properly, including post-migration validation to catch exactly these kinds of issues before they affect production workloads. If you'd like a health check of your SQL Server environment after a migration, get in touch with the team.
Need help with your SQL Servers?
Find out what's really going on inside your SQL Server environment.
Our health checks uncover critical misconfigurations in 97% of reviews.