SQL Server的sys.dm_exec_sessions可追溯多久的历史会话?
问题结论
你观察到的sys.dm_exec_sessions仅返回最近数小时会话记录的现象完全正常。
关于sys.dm_exec_sessions的留存规则
这个动态管理视图不属于历史日志类视图,没有固定的时间覆盖范围,它的存储逻辑完全基于实例内存的会话槽周转:
- 所有当前处于活跃状态的连接(包括空闲连接、连接池持有的长连接),对应的会话记录会一直保留在视图结果中
- 会话断开连接后,对应记录不会被立刻删除,会暂存在内存的会话槽中,直到该槽位被新创建的会话覆盖
- 如果实例并发量低、新会话创建频率慢,断开数天的会话记录都可能被查到
- 如果实例业务繁忙、会话周转速度快,断开仅数分钟的会话记录就可能被新会话覆盖清空
- 实例服务重启后,
sys.dm_exec_sessions的所有历史记录会直接全部清空,不会做持久化留存。
你当前查到仅剩余最近数小时的记录,本质是当前实例的会话周转速度,已经把更早断开的会话记录全部覆盖了。
排查长期未使用用户账号的注意事项
你最初执行的查询语句如下:
select * from sys.dm_exec_sessions order by login_time
用这个视图排查长期未使用账号的思路存在缺陷:它无法覆盖几周、几个月维度的登录历史,完全不能作为账号长期未登录的判断依据。
在SQL Server 2017环境下,要准确识别未使用的用户账号,可以参考以下方案:
- 新建专门的登录记录审计表,按固定周期(比如每1-2小时)抓取
sys.dm_exec_sessions中is_user_process = 1的用户会话信息,去重后写入审计表持久化保存,累积1-3个月的记录后,再和sys.server_principals中的用户账号列表做比对,筛选从未出现在审计记录中的账号 - 启用实例级的成功登录审计,将登录事件写入SQL Server错误日志或Windows安全日志,调整错误日志的滚动保留策略,确保日志留存周期覆盖你要排查的时间范围,再基于日志记录统计每个账号的最后登录时间。
内容的提问来源于stack exchange,提问作者PhilFancy
相关产品推荐
相关产品推荐

