如何查看SQL Server中Linked Server的访问历史及使用情况
SQL Server Linked Server使用明细查询方案
SQL Server自带的系统动态管理视图(DMV)完全可以满足你的查询需求,无需额外安装工具,具体可用视图和查询方法如下:
核心查询用到的系统视图
sys.servers:存储当前实例中所有已配置的Linked Server基础信息,你可以先通过这个表筛选出你要排查的3台关联销售系统的Linked Server的名称、ID等配置项sys.dm_exec_sessions:记录所有当前活跃会话的身份信息,包含登录账号、客户端主机名、使用的程序名称等用户身份相关字段sys.dm_exec_connections:记录所有和当前实例建立的物理连接详情,可以拿到客户端的IP地址信息sys.dm_exec_requests:记录当前实例中正在执行的所有请求,如果请求调用了Linked Server,可关联匹配到对应的Linked Server记录
现成查询脚本
你可以直接运行下面的SQL语句查询当前正在使用目标Linked Server的会话和用户信息:
SELECT ls.name AS 关联的LinkedServer名称, s.session_id AS 会话ID, s.login_name AS 使用者登录账号, s.host_name AS 使用者客户端主机名, s.program_name AS 使用者使用的程序名称, c.client_net_address AS 使用者客户端IP, r.start_time AS 请求开始时间, r.command AS 正在执行的操作类型 FROM sys.servers ls INNER JOIN sys.dm_exec_requests r ON r.command LIKE N'%' + ls.name + N'%' LEFT JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id LEFT JOIN sys.dm_exec_connections c ON s.session_id = c.session_id WHERE ls.is_linked = 1 -- 按需替换成你要查询的3台Linked Server的名称 AND ls.name IN ('销售系统LinkedServer1','销售系统LinkedServer2','销售系统LinkedServer3') AND s.is_user_process = 1 -- 过滤掉系统内部进程
注意:上述语句只能查询当前正在执行的活跃请求中用到Linked Server的记录,如果需要排查历史使用情况,需要提前开启SQL Server审计或者扩展事件功能做日志留存,默认实例不会持久化存储历史连接记录。如果要确认Linked Server是否还有人使用,建议每隔几小时运行一次上述查询,持续采集1到2周的数据,没有命中记录基本可以确认对应Linked Server无活跃使用。
内容的提问来源于stack exchange,提问作者Jakey
相关产品推荐
相关产品推荐

