Back to Resources
Blog

You Moved SQL Server to Linux. Why Is Your Monitoring Still on Windows?

Christian Mundwiler·November 3, 2026

The All Targets page in Oracle Enterprise Manager 24ai filtered to the SQL Server Database target type. Eleven targets are listed, every one of them Up: mssql2017-ol8, mssql-rhel8, mssql-rhel9, mssql-ubuntu22, mssql2025-rhel10 and mssql2025-ubuntu24 on Linux, alongside an availability group, a failover cluster instance and standalone instances on Windows, all monitored by the same plug-in.

Microsoft shipped SQL Server for Linux with SQL Server 2017, and a lot of shops took it up on the offer, mostly so the database tier could be patched and automated the same way as everything else on RHEL and Ubuntu. The instances moved to RHEL and Ubuntu, and then somebody asked how they were going to be monitored, and the answer turned out to be a Windows server.

That is the part nobody planned for. Most SQL Server monitoring grew up on Windows and still reaches for Windows to do its job: WMI for host metrics, a Windows agent to run the collection, a domain account to authenticate it. Point that design at a Linux instance and you get either nothing, or a Windows box whose only remaining job is to watch the database you moved off Windows.

The SQL Server Plug-in for Oracle Enterprise Manager takes the other route. A Linux EM agent connects to SQL Server on Linux over port 1433, collects every metric with T-SQL, and nothing anywhere in the path runs Windows.

This post has four parts: why Windows kept turning up in SQL Server monitoring, how the plug-in collects everything from inside SQL Server instead, how availability groups behave under Pacemaker, and what still works differently on Linux.



Why Windows kept turning up

Oracle has its own SQL Server plug-in for EM, and its user guide describes the model plainly. Monitoring runs "by a local or remote Windows Agent". The setup steps include setting WMI namespace security. For remote Windows authentication, the agent host has to be a member of the same Windows domain as the SQL Server host.

None of that was unreasonable when SQL Server only ran on Windows. WMI was the obvious place to read host metrics, and a Windows agent was the obvious thing to read them with. But the design carries a Windows dependency into every deployment, including the ones where the database no longer has one.

So we started from a different question: what can SQL Server tell you about itself, over a plain database connection, without asking the operating system anything?

Collecting everything from inside SQL Server

The answer is almost everything. Every one of the plug-in's 78 metric groups is collected over JDBC using T-SQL against SQL Server's catalog and dynamic management views. The Microsoft JDBC driver ships inside the plug-in, so there is nothing to install on the database server and nothing extra to install on the agent.

The agent can be Linux x86-64 or Windows x86-64, and it can run on the SQL Server host or anywhere that reaches port 1433. A Linux agent watching a Windows SQL Server is also supported, and it is how much of the plug-in was tested.

Host metrics are the hard case, because that is where Windows-based designs lean hardest on WMI. The plug-in reads them from SQL Server instead:

Host metricWindows WMI classWhere the plug-in reads it
Physical memory, total and availableWin32_OperatingSystemsys.dm_os_sys_memory
CPU count and utilizationWin32_Processorsys.dm_os_sys_info and the scheduler monitor ring buffer
Free space per volumeWin32_Volumesys.dm_os_volume_stats
Operating system, distribution, releaseWin32_OperatingSystemsys.dm_os_host_info

That last view does a second job. sys.dm_os_host_info reports whether the host is Windows or Linux, along with the distribution and release, and the plug-in uses it to decide which Windows-only surfaces to skip. The registry family, the Windows services list and WSFC node detail all come back as empty results on a Linux instance, not as collection errors. An empty group there means "this feature does not exist on this platform", and nothing gets paged about it.

The Host Info metric for a SQL Server 2025 target in Enterprise Manager, read from sys.dm_os_host_info. Host Platform reads Linux, Host Distribution Red Hat Enterprise Linux, Host Release 10.2, Host SKU blank and OS Language Version 0.

What we certified it on

The Linux side of the certification lab covered every SQL Server version Microsoft ships for Linux:

SQL ServerLinux host
2017Oracle Linux 8, using Microsoft's RHEL 8 packages
2019RHEL 8
2022RHEL 9 and Ubuntu 22.04
2025RHEL 10 and Ubuntu 24.04

Windows instances ran alongside them, with both Linux and Windows agents, on EM 24ai and EM 13.5. The Linux instances in the lab are standalone; availability group and failover cluster testing ran on Windows. SQL Server 2016 is supported on Windows only, because Microsoft never released it for Linux.

One target type covers the lot. There is no Linux edition of the plug-in, and no separate build per SQL Server version. The same target appears in the same console with the same pages, whatever it runs on.

The monitoring login is the same everywhere too, and it is deliberately small:

-- Run once per instance, as a sysadmin. The plug-in itself never needs sysadmin.
CREATE LOGIN oem_monitor WITH PASSWORD = '<strong password>';
GRANT VIEW SERVER STATE    TO oem_monitor;
GRANT VIEW ANY DATABASE    TO oem_monitor;
GRANT VIEW ANY DEFINITION  TO oem_monitor;
GRANT CONNECT ANY DATABASE TO oem_monitor;
USE msdb;
CREATE USER oem_monitor FOR LOGIN oem_monitor;
ALTER ROLE db_datareader      ADD MEMBER oem_monitor;
ALTER ROLE SQLAgentReaderRole ADD MEMBER oem_monitor;

Every grant is read-only metadata visibility. The plug-in never calls xp_cmdshell and creates nothing on the instance. On a Linux agent it signs in with this SQL login, and the connection is encrypted by default. A verify mode checks the server certificate against a truststore you supply, with the expected host name configurable.

Availability groups and the Pacemaker boundary

High availability is where Linux and Windows differ most. On Windows an availability group sits on WSFC. On Linux it usually sits on Pacemaker, and the WSFC views that report cluster nodes have nothing to say.

The plug-in does not read availability groups from the cluster manager. Replica state, database synchronization, and the send and redo queues all come from SQL Server's HADR dynamic management views, which SQL Server provides on Linux as well as Windows. So the same AG metrics apply on a Linux availability group, and so does the AG Failover Readiness page, the one most DBAs with an availability group end up opening first.

The AG Failover Readiness page, one row per database per secondary replica, showing readiness, availability group, database, secondary replica, synchronization state, recovery point and recovery time in seconds, redo queue and send queue, above the replication history for the chosen time range.

It answers the question you get asked at 2 a.m.: if we failed over right now, how much data would we lose, and how long until the secondary serves? One row per database per secondary, with the recovery point and recovery time in seconds, both queues, their drain rates, and the worst each got over the chosen range. Out of the box, the recovery point raises a warning past 300 seconds and goes critical past 900, through the same incident rules as everything else in EM.

What changes under Pacemaker is cluster node detail, because that information belongs to WSFC. SQL Server reports the availability group's cluster type as EXTERNAL, and the plug-in uses that to detect the boundary. It sets an External Cluster Boundary flag to say the instance's availability is managed by Pacemaker, and returns an empty cluster-node table instead of an error. If you monitor Linux SQL Server under Pacemaker, an empty node table is the expected result, not a fault.

What works differently on Linux

A few things do work differently on Linux, and we would rather you read about them here than find them in production.

AreaOn LinuxWhat to do
CPU utilization, SQL Server 2017, 2019 and 2022The system idle figure SQL Server exposes is not usable, so the split between SQL Server, other processes and idle cannot be computed. Those columns are blank, not zero. The CPU threshold does not fire.Read the CPU Counters Available flag. The console charts SQL Server's own process CPU instead. SQL Server 2025 on Linux reports normally.
Volume free spaceEvery volume collapses into one row holding the smallest free space.The low-space alert still fires but cannot name the volume. Database and file space are unaffected.
Registry, Windows services, WSFC nodesEmpty by design. Only the SQL Server Agent appears in the services list.Nothing. These are Windows features.
AuthenticationSQL logins only.Windows Integrated authentication needs a Windows agent. Kerberos is not supported yet on either platform.
Agent localeWithout a UTF-8 locale, non-ASCII database and object names show as question marks.Start the agent with LANG=C.UTF-8, or add -Dfile.encoding=UTF-8 to agentJavaDefines in emd.properties.

The CPU row is the one worth understanding. On those three versions the figure SQL Server reports for system idle is not real, and a monitor that charted it anyway would show a host that looks busy or idle for reasons unrelated to its load. A blank column is less satisfying than a chart full of numbers, but it does not mislead anyone, and the flag lets a script or an AI client tell the difference. One edge case to know: a host that genuinely sits at 100% CPU reads the same way, because the two cannot be told apart at the source.

The Processor metric shows the difference. On SQL Server 2022 on RHEL 9, CPU Counters Available reads 0 and the system columns are blank:

The Processor metric for a SQL Server 2022 target on RHEL 9 in Enterprise Manager. CPU Counters Available reads 0. CPU Utilization, Other Process CPU and System Idle are blank, and SQL Process CPU reads 0.

On SQL Server 2025 on RHEL 10, the flag reads 1 and every column reports:

The same Processor metric for a SQL Server 2025 target on RHEL 10. CPU Counters Available reads 1, CPU Utilization 2, Other Process CPU 2, SQL Process CPU 0 and System Idle 98.

For the locale, check a running agent before you chase missing characters:

# On the agent host: what locale did the agent start with?
tr '\0' '\n' < /proc/<agent pid>/environ | grep LANG

Everything else you would look at on a Windows instance, you look at in the same place on Linux.


Do I need a Windows server anywhere to use this?+

No. The EM agent can run on Linux, it reaches SQL Server over port 1433, and it collects everything through T-SQL. The only reason to involve Windows is if you want Windows Integrated authentication, which needs a Windows agent.

Does the agent have to run on the SQL Server host?+

No. The agent can be local or remote. Remote monitoring from a Linux agent is a common arrangement and how much of the plug-in was certified.

Which Linux distributions are supported?+

The plug-in reads SQL Server through T-SQL, so it follows Microsoft's support for SQL Server on Linux rather than adding its own list. The certification lab ran Oracle Linux 8, RHEL 8, 9 and 10, and Ubuntu 22.04 and 24.04.

Why is CPU utilization blank on my Linux instance?+

On SQL Server 2017, 2019 and 2022 on Linux, the system idle figure SQL Server reports is not usable, so the plug-in leaves the utilization columns blank instead of reporting a misleading number. SQL Server's own process CPU is still charted. SQL Server 2025 on Linux reports normally.

Does it work with availability groups managed by Pacemaker?+

Yes. The plug-in reads availability groups, including AG Failover Readiness and its recovery point thresholds, from SQL Server's HADR views, which are the same on Linux. Only WSFC cluster node detail is absent, and it is reported as empty rather than as an error.

Can I use Kerberos or Active Directory authentication from a Linux agent?+

Not today. A Linux agent uses a SQL login. Windows Integrated authentication works from a Windows agent, and Kerberos is not supported on either platform yet.

We already run Oracle's SQL Server plug-in. Do we have to switch everything at once?+

No. Both plug-ins can monitor the same instance at the same time. Add your Linux instances to this one, run the two side by side, and retire the old targets when you are ready. Thresholds do not carry over, so plan to set those again.

Does it support Azure SQL Database, Managed Instance or Amazon RDS?+

No. It monitors self-managed SQL Server 2016 through 2025 on Windows, and 2017 through 2025 on Linux.


Where this fits

The SQL Server Plug-in for Oracle Enterprise Manager reached general availability on October 23, 2026, as two builds with the same features: 24.1.1.0.0 for Enterprise Manager 24ai and 13.5.1.0.0 for Enterprise Manager 13.5. Linux support is part of the same plug-in, collecting the same way on either platform, so a mixed estate is one target type rather than two tools.

Linux is one part of it. The same release adds deadlock capture with no trace flags or Extended Events sessions to set up, TempDB contention classification, Query Store plan-change detection, 14 compliance rules and T-SQL jobs for backup, restore and index work, and on EM 24ai RU12 and later, EM's own MCP server can read every metric group with nothing to enable on our side.

If you are moving SQL Server off Windows, start with the prerequisites page for the grant list and agent requirements, and write to helpdesk@integrationplumbers.io for a license key. The download comes with it.

Related Resources

Now Generally Available: MySQL, SQL Server, and Db2 Plug-ins for Oracle Enterprise Manager
Blog

Now Generally Available: MySQL, SQL Server, and Db2 Plug-ins for Oracle Enterprise Manager

The MySQL, Microsoft SQL Server, and IBM Db2 plug-ins for Oracle Enterprise Manager are generally available, each with one build for Oracle EM 24ai and one for 13.5. Here are one or two features from each release: Query Analyzer and InnoDB ClusterSet disaster-recovery promotion readiness for MySQL, Query History with Query Store plan regression and Security Update Status for SQL Server, and HADR takeover readiness and blocking chains for Db2. Also covered: how to move from the Open Beta, where to find us at Oracle AI World (Booth #7024, October 25–28), and the November 10 webinar on the SQL Server plug-in.

Oct 23, 2026

Now in Open Beta: MySQL, SQL Server, and Db2 Plug-ins for Oracle Enterprise Manager
Blog

Now in Open Beta: MySQL, SQL Server, and Db2 Plug-ins for Oracle Enterprise Manager

As of September 1, 2026, all three Integration Plumbers database plug-ins for Oracle Enterprise Manager are in Open Beta: MySQL, Microsoft SQL Server, and IBM Db2. Each one makes its engine a first-class target in the console you already run, collects with a read-only account over an encrypted connection, and ships thresholds and compliance rules that work on day one. Here's what each plug-in covers, what Open Beta means in practice, and the four steps to get a license key, install it against your own estate, and tell us what you find before general availability.

Sep 1, 2026

Was That Query Always This Slow? The Query-History Gap in MySQL, SQL Server, and DB2
Blog

Was That Query Always This Slow? The Query-History Gap in MySQL, SQL Server, and DB2

Your database can tell you which queries are slow right now. It usually can't tell you which ones got slower, because the per-query numbers it keeps are a running total with no time axis: reset on restart, or evicted as a cache fills. Here's the query-history gap in MySQL, Microsoft SQL Server, and DB2, why SQL Server is the exception that proves the point, and why the trend belongs in the Oracle Enterprise Manager repository, including the unglamorous work of making the subtraction honest.

Aug 24, 2026

Not Sure Where to Start?

Take our free OTEL Maturity Assessment to identify gaps and get a personalized action plan.

Take the Free Assessment