在 SQL Server 2005 中,您能否轻松确定某人上次查询数据库的时间。
扩展詹姆斯·艾伦的答案:
SELECT d.name,
last_user_seek = MAX(last_user_seek),
last_user_scan = MAX(last_user_scan),
last_user_lookup = MAX(last_user_lookup),
last_user_update = MAX(last_user_update)
FROM sys.dm_db_index_usage_stats AS i
JOIN sys.databases AS d ON i.database_id=d.database_id
GROUP BY d.name
如果您不希望每个数据库上下文都有结果并希望在结果集的开头包含数据库名称,请使用此修改版本。
SELECT
last_user_seek = MAX(last_user_seek),
last_user_scan = MAX(last_user_scan),
last_user_lookup = MAX(last_user_lookup),
last_user_update = MAX(last_user_update)
FROM
sys.dm_db_index_usage_stats
WHERE
[database_id] = DB_ID()
此方法的一个警告是,每当您重新启动 SQL Server 时,DMV 中的信息都将被清除并清空。
在 MySQLtips 找到了这个 - 对我有用。
select d.name, x1 =
(select X1= max(bb.xx)
from (
select xx = max(last_user_seek)
where max(last_user_seek) is not null
union all
select xx = max(last_user_scan)
where max(last_user_scan) is not null
union all
select xx = max(last_user_lookup)
where max(last_user_lookup) is not null
union all
select xx = max(last_user_update)
where max(last_user_update) is not null) bb)
FROM master.dbo.sysdatabases d
left outer join
sys.dm_db_index_usage_stats s
on d.dbid= s.database_id
group by d.name
刚刚看到这篇文章,就像今天被问到这个问题一样......好吧,被问到在相当多的实例中哪些数据库没有被使用。 因此,我将 Andrey Shvidky 的上述查询更改为写入临时表,然后选择结果,将找到的任何内容与上次使用的最大日期进行比较,与 sys.databases 中的任何剩余数据库......理论是, (和假设),这些都具有 NULL 最后使用日期,因此不会显示在主查询的结果中,因此是进一步调查以删除的候选者。
SELECT UNPVT.[DataBase],
MaxLastUse = MAX(UNPVT.MaxLastUse)
INTO #tempdatabases
FROM
(
SELECT [DataBase],
last_user_seek,
last_user_scan,
last_user_lookup,
last_user_update
FROM
(
SELECT [DataBase] = DB.[name],
last_user_seek = MAX(IU.last_user_seek),
last_user_scan = MAX(IU.last_user_scan),
last_user_lookup = MAX(IU.last_user_lookup),
last_user_update = MAX(IU.last_user_update)
FROM sys.databases AS DB
INNER JOIN sys.dm_db_index_usage_stats AS IU ON IU.database_id = DB.database_id
GROUP BY DB.[name]
) AS DBIU
) AS P UNPIVOT(MaxLastUse FOR ColumnName IN(last_user_seek,
last_user_scan,
last_user_lookup,
last_user_update)) AS UNPVT
GROUP BY UNPVT.[DataBase]
HAVING MAX(UNPVT.MaxLastUse) IS NOT NULL
ORDER BY MAX(UNPVT.MaxLastUse) ASC;
SELECT name,
create_date AS 'Created on',
'Not used since last instance start',
(
SELECT create_date
FROM sys.databases
WHERE database_id = 2
) AS 'Instance start date'
FROM sys.databases
WHERE database_id NOT IN(1, 2, 3, 4)
AND name NOT IN
(
SELECT [DataBase]
FROM #tempdatabases
);
DROP TABLE #tempdatabases;
您需要提前设置审核或 sql server 跟踪。
与上面的方法类似,但只是将结果作为特定数据库 ID 的单个值(在本例中为
6
)
select max(LastAccess)
from (
SELECT last_user_seek as LastAccess FROM sys.dm_db_index_usage_stats WHERE last_user_seek is not null and [database_id]=6
union
SELECT last_user_lookup as LastAccess FROM sys.dm_db_index_usage_stats WHERE last_user_seek is not null and [database_id]=6
union
SELECT last_user_seek as LastAccess FROM sys.dm_db_index_usage_stats WHERE last_user_seek is not null and [database_id]=6
union
SELECT last_user_update as LastAccess FROM sys.dm_db_index_usage_stats WHERE last_user_seek is not null and [database_id]=6
) UserAccess
SQL Server 可以记录登录尝试的事件信息,您可以查看它 通过查看错误日志。通过打开 SQL Server 的审核级别。
按照以下步骤启用对所有/成功连接的审核 SQL Server 中的企业管理器:
扩展服务器组。 右键单击服务器,然后单击属性。 在“安全”选项卡上的“审核级别”下,单击“全部/成功”等(必填) 选项)。
您必须停止并重新启动服务器才能使此设置生效
与上面的 unpivot 相同
select
UNPVT.[DataBase]
,MaxLastUse = max(UNPVT.MaxLastUse)
from
(
select
[DataBase], last_user_seek, last_user_scan, last_user_lookup, last_user_update
from
(
select
[DataBase] = DB.[name]
,last_user_seek = max(IU.last_user_seek)
,last_user_scan = max(IU.last_user_scan)
,last_user_lookup = max(IU.last_user_lookup)
,last_user_update = max(IU.last_user_update)
from
sys.databases as DB
inner join sys.dm_db_index_usage_stats as IU on
IU.database_id = DB.database_id
group by
DB.[name]
) as DBIU
) as P unpivot (MaxLastUse for ColumnName in (last_user_seek, last_user_scan, last_user_lookup, last_user_update)) as UNPVT
group by
UNPVT.[DataBase]
order by
UNPVT.[DataBase]
这并不容易,但如果您打开 SQL Server 的日志记录功能,您可以使用软件检查日志,以发现最后一次查询的时间和内容。