Есть ли способ регистрировать трафик в и из браузера SQL Server? - PullRequest
0 голосов
/ 16 февраля 2019

Что-то странное происходит с сервером базы данных, который мне пришлось перестраивать и восстанавливать из резервной копии.

Я указываю старое приложение VB6, используя ADODB.Connection и современное приложение C # EF6, используя то, что должнобыть одинаковой строкой подключения для обоих типов

servername\INSTANCE

При запуске на одном компьютере с SQL Server оба приложения VB6 и EF6 могут подключаться с использованием этой строки подключения.

При запуске на другом компьютере в сети приложение VB6 подключается, а приложение EF6 - нет.

(со стандартным сообщением «сервер не найден», ошибка: 26 - Ошибка определения сервера / экземпляра, указанного в System.Data.SqlClient.SqlInternalConnectionTds..ctor)

Если я посмотрю напорт конкретного экземпляра и соединяются с

servername,instance_port_number

, затем оба приложения соединяются, на какой бы машине я их не запускалТаким образом, кажется, что-то может происходить с браузером SQL Server, чтобы вызвать проблему.

Есть ли способ, которым я могу получить некоторую диагностическую информацию из браузера SQL Server, какие данные она отправляется куда, безнасколько контролировать весь сетевой трафик?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Альтернативой сетевой трассировке для устранения неполадок является отправка запроса на перечисление экземпляра в службу обозревателя 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"
0 голосов
/ 16 февраля 2019

В Entity Framework 6 вы можете взять объект dbcontext и сделать что-то вроде.Yourcontext.Database.log = s => mylogger.Debug (s);

Правая часть - это лямбда-функция, которая принимает строку s и записывает ее в журнал.

Все sql и параметры регистрируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...