从 Powershell 连接到 DAC 时,错误日志中出现“最大数量‘1’专用管理员连接已存在”消息

Rel*_*SQL 5 sql-server powershell sql-server-2016 sql-server-2017 dac

我正在通过 PowerShell 的专用管理员连接 (DAC) 连接到 SQL Server(2016 和 2017 最新版本)。

SQL Server 错误日志中记录以下错误消息:

日期 2019 年 4 月 2 日下午 1:59:13 记录 SQL Server(当前 - 2019 年 4 月 2 日下午 1:59:00)

源登录

消息
无法连接,因为已存在最大数量“1”的专用管理员连接。在建立新连接之前,必须通过注销或结束进程来删除现有的专用管理员连接。[客户端:127.0.0.1]

查询成功运行。已经尝试了许多连接字符串管理迭代;这是迄今为止最强大的。

Stack Exchange 上有一个解决方案,该解决方案涉及在关闭连接之前终止 spid,但这也会向 SQL Server 错误日志中抛出一条令人讨厌的消息,因此没有什么乐趣。

检查sys.dm_exec_sessions没有发现任何有趣的事情;使用此技术,没有连接保持打开状态。下面的 PowerShell 有一个虚拟查询,我无法谈论为什么我们要以这种方式连接,因为它是专有的,但它是 100% 必要的,它是一个非常快速的连接,我需要每 10 次执行一次分钟。

这个错误只是噪音。DAC 查询按预期运行和工作。

即使在静止的系统上重新启动,每次都会记录该错误。没有其他 DAC 连接正在使用 - 如果有,Powershell 会在命令提示符处抛出明显的错误消息。

有趣的是,当使用 时sqlcmd,SQL Server 错误日志中不会记录任何错误消息。

#begin powershell script
$SqlServerName = "server\instance"

$DbQuery = "
INSERT INTO  master.dbo.sometable(value1,value2) values ('test14','testtest14');"

function Get-SqlConnection
{
    param (
        [String] $SqlServerName
    )
    $sqlConnection = $null

    try
    {
        $sqlConnection = New-Object System.Data.SqlClient.SqlConnection
        $sqlConnection.ConnectionString = "data source=admin:$SqlServerName;Integrated Security=True; pooling=false"
        $sqlConnection.Open()
    }
    catch
    {
        if ($sqlConnection)
        {
            [void] $sqlConnection.Dispose()
        }
        throw
    }
    $sqlConnection
}

try
{
    $sqlCommand = New-Object System.Data.SqlClient.SqlCommand
    $sqlConnection = Get-SqlConnection -SqlServerName $SqlServerName
    $sqlCommand.Connection = $SqlConnection
    $sqlCommand.CommandText = $dbQuery
    [void] $sqlCommand.ExecuteNonQuery()
}
finally
{
    if ($sqlCommand)
    {
        [void] $sqlCommand.Dispose()
    }

    if ($sqlConnection)
    {
        [void] $sqlConnection.Dispose()
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在服务器上运行此查询时,没有显示连接:

SELECT
    CASE
        WHEN ses.session_id= @@SPID THEN 'It''s me! '
        ELSE '' 
    END 
    + coalesce(ses.login_name,'???') as WhosGotTheDAC,
    ses.session_id,
    ses.login_time,
    ses.status,
    ses.original_login_name
from sys.endpoints as en
join sys.dm_exec_sessions ses on
    en.endpoint_id=ses.endpoint_id
where en.name='Dedicated Admin Connection';
Run Code Online (Sandbox Code Playgroud)

Rel*_*SQL 2

经过微软的几层支持后,发现这个问题的解决方案是改为 pooling=false-Pooling=False显然关键字和值区分大小写。