Добрый день. В этой статье мы с вами научимся писать запросы, которые выводят активные соединения с текущим сервером. А так же научимся фильтровать всю выборку по конкретным серверам.
SQL — Активные соединения
В каких ситуациях это может понадобиться? Например для того, чтобы отследить не проводятся ли ddos атаки на ваш сервис, нет ли каких-то зависших сессий. Все это можно объединить под фразу «для диагностики и аналитики». Для того, чтобы увидеть все активные подключения к серверу, необходимо с помощью MSSQL Server Management Studio выполнить следующий запрос:
1 |
select * from sys.dm_exec_connections |
Что делает функция sys.dm_exec_connections? Возвращает сведения о соединениях, установленных с данным экземпляром SQL Server, и подробные сведения о каждом соединении. Соответственно на выходе мы получим много столбцов с информацией:
- session_id — идентификатор соединения
- most_recent_session_id — идентификатор самого последнего запроса в данном соединение
- connect_time — время подключения и создания новой сесии
- net_transport — тип транспортного протокола соединения
- protocol_type — тип протокола передачи данных для соединения
- protocol_version — версия протокола доступа к данным для соединения
- endpoint_id — идентификатор типа соединения
- encrypt_option — булево значение разрешающее или запрещающее шифрование для соединения
- auth_scheme — указывает тип схемы проверки подлинности используемую соединением
- node_affinity — идентифицирует узел памяти для соединения
- num_reads — число операций чтения байтов прошедших через это соединение
- num_writes — число байтов операций записи прошедших через это соединение
- last_read — метка времени о последнем полученном пакете данных
- last_write — метка времени о последнем отправленном пакете данных
- net_packet_size — размер пакета, используемый для передачи данных
- client_net_address — сетевой адрес удаленного клиента
- client_tcp_port — номер порта на клиенте, который используется при осуществлении соединения
- local_net_address — IP-адрес сервера, с которым установлено данное соединение
- local_tcp_port — TCP-порт сервера, если соединение использует протокол TCP
- connection_id — уникальный 128-битный идентификатор соединения
- parent_connection_id — идентифицирует первичное соединение, используемое в сеансе режима MARS. Это возможность, которая в SQL Server используется для выполнения нескольких пакетов по одному соединению
- most_recent_sql_handle — дескриптор последнего запроса SQL, выполненного с помощью данного соединения. Постоянно проводится синхронизация между столбцом most_recent_sql_handle и столбцом most_recent_session_id
Функция системная, поэтому скачивать ее не нужно и пытаться найти в гугле тоже. Надеюсь все понятно. Если остались вопросы пишите комментарии.
Фильтрация
Перейдем к фильтрации. Как уже думаю стало понятно из описания столбцов, можно отсеивать нужные апишники или идентификаторы сессий. Можно фильтровать все подключения по определенному порту, можно фильтровать по порту клиента. Да и в целом по каждому из столбцов можно проводить фильтрацию.
Фильтруем по адресу клиента:
1 2 |
select * from sys.dm_exec_connections where client_net_address = 'id_address' |
Получаем самые последние подключения по адресу клиента:
1 2 3 |
select * from sys.dm_exec_connections where client_net_address = 'ip_address' order by connect_time asc |
Выбираем подключения по порту клиента:
1 2 |
select * from sys.dm_exec_connections where client_tcp_port = 'port' |
Смотрим соединения по порту, который начинается на 56:
1 2 |
select * from sys.dm_exec_connections where client_tcp_port like '56%' |
И так можно получить любые активные соединения с сервером SQL, с которого выполняется запрос. У меня на этом все, остались вопросы? Пишите комменты! Надеюсь данная статья sql соединения была для вас полезна. Подписывайтесь на нашу группу в ВК, канал ютубе и залетайте на канал в телегу!