有没有办法记录往返SQL Server浏览器的流量?

时间:2019-02-16 01:24:20

标签: sql-server entity-framework-6 database-connection

我不得不从备份中重建和还原的数据库服务器发生了奇怪的事情。

我要使用ADODB.Connection指向一个旧的VB6应用程序,并使用现代的C#EF6应用程序指向这两个应用程序,两者都应使用相同的连接字符串,形式

servername\INSTANCE

在运行SQL Server的同一台计算机上运行时,VB6应用程序和EF6应用程序都可以使用此连接字符串进行连接。

在网络上的其他计算机上运行时,VB6应用程序会连接,但EF6应用程序不会。

(带有标准的“找不到服务器”消息,错误:26-在System.Data.SqlClient.SqlInternalConnectionTds..ctor中指定的服务器/实例定位错误)

如果我查看特定的实例端口并与之连接

servername,instance_port_number

然后,无论我在哪个计算机上运行它们,两个应用程序都将连接。因此,似乎SQL Server Browser可能正在发生某些事情来导致此问题。

是否有一种方法可以从SQL Server浏览器中获取某种诊断信息,将其发送到什么数据,而不必监视所有网络流量?

2 个答案:

答案 0 :(得分:1)

用于进行故障排除的网络跟踪的另一种方法是将实例枚举查询发送到SQL Server浏览器服务并检查结果。这将验证SQL Server浏览器可以通过UDP端口1434访问,并且返回的数据报包含客户端连接到命名实例所需的实例名称和端口信息。

在问题机器上运行下面的PowerShell脚本。

# verify UDP port 1433 connectivity and query SQL Server Browser for all instances
Function Get-SqlServerBrowerDatagramForAllInstances($hostNameOrIpAddress)
{
    Write-Host "Querying SQL Browser for all instances on host $hostNameOrIpAddress ..."

    try
    {
        $udpClient = New-Object Net.Sockets.UdpClient($hostNameOrIpAddress, 1434)
        $bufferLength = 1
        $browserQueryMessage = New-Object byte[] 1
        $browserQueryMessage[0] = 2
        $bytesSent = $udpClient.Send($browserQueryMessage, $browserQueryMessage.Length)
        $udpClient.Client.ReceiveTimeout = 10000
        $remoteEndPoint = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Broadcast, 0)
        $browserResponse = $udpClient.Receive([ref]$remoteEndPoint)
        $payloadLength = $browserResponse.Length - 3
        $browserResponseString = [System.Text.ASCIIEncoding]::ASCII.GetString($browserResponse, 3, $payloadLength)
        $elements = $browserResponseString.Split(";")

        Write-Host "SQL Server Browser query results:`r`n"

        for($i = 0; $i -lt $elements.Length; $i = $i + 2)
        {
            if ($elements[$i] -ne "")
            {
                Write-Host "`t$($elements[$i])=$($elements[$i+1])"
            }
            else
            {
                Write-Host ""
                # next instance
                $i = $i - 1
            }
        }
    }
    catch [Exception]
    {
        Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red
    }
}

# verify UDP port 1433 connectivity and query SQL Server Browser for single instance
Function Get-SqlServerBrowerDatagramByInstanceName($hostNameOrIpAddress, $instanceName)
{
    Write-Host "Querying SQL Browser for host $hostNameOrIpAddress, instance $instanceName ..."

    try
    {
        $instanceNameBytes = [System.Text.Encoding]::ASCII.GetBytes($instanceName)
        $udpClient = New-Object Net.Sockets.UdpClient($hostNameOrIpAddress, 1434)
        $bufferLength = $InstanceNameBytes.Length + 2
        $browserQueryMessage = New-Object byte[] $bufferLength
        $browserQueryMessage[0] = 4
        $instanceNameBytes.CopyTo($browserQueryMessage, 1)
        $browserQueryMessage[$bufferLength-1] = 0
        $bytesSent = $udpClient.Send($browserQueryMessage, $browserQueryMessage.Length)
        $udpClient.Client.ReceiveTimeout = 10000
        $remoteEndPoint = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Broadcast, 0)
        $browserResponse = $udpClient.Receive([ref]$remoteEndPoint)
        $payloadLength = $browserResponse.Length - 3
        $browserResponseString = [System.Text.ASCIIEncoding]::ASCII.GetString($browserResponse, 3, $payloadLength)
        $elements = $browserResponseString.Split(";")
        $namedInstancePort = ""
        Write-Host  "SQL Server Browser query results:`r`n"
        for($i = 0; $i -lt $elements.Length; $i = $i + 2)
        {
            if ($elements[$i] -ne "")
            {
                Write-Host  "`t$($elements[$i])=$($elements[$i+1])"
                if($elements[$i] -eq "tcp")
                {
                    $namedInstancePort = $elements[$i+1]
                }
            }
        }

    }
    catch [Exception]
    {
        Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red
    }

}


Get-SqlServerBrowerDatagramForAllInstances -hostNameOrIpAddress "servername"

Get-SqlServerBrowerDatagramByInstanceName -hostNameOrIpAddress "servername" -instanceName "INSTANCE"

答案 1 :(得分:0)

在实体框架6中,您可以使用dbcontext对象并执行类似的操作。 Yourcontext.Database.log = s => mylogger.Debug(s);

右侧是一个lambda函数,它接受字符串s并将其记录下来。

所有sql和参数均被记录。