När du arbetar i en mycket stor SQL Server miljö är det mycket vanligt att ingen i organisationen vet vem som använder en viss databas. Detta scenario är mycket vanligt om det finns flera äldre system. Följ den här artikeln för att identifiera hur effektivt din SQL Server databaser används.
Metod 1:
I den här metoden kommer vi att läsa utdata från sp_who2 och fånga den i en tabell. Det första steget är att skapa tabellen med detta skript.
CREATE TABLE T1 ( session_id INT ,status_message VARCHAR(1000) NULL ,login_name SYSNAME NULL ,Name_of_Host SYSNAME NULL ,Blocked_By SYSNAME NULL ,Database_Name SYSNAME NULL ,Script_description VARCHAR(1000) NULL ,CPU_Time INT NULL ,Disk_Input_Output INT NULL ,Last_Batch VARCHAR(1000) NULL ,Name_of_Program VARCHAR(1000) NULL ,Session_ID_2 INT ,ID_of_Request INT NULL ,Log_Date DATETIME DEFAULT GETDATE() );
Schemalägg och kör detta skript som en SQL Server Jobb. Vi kan granska loggtabellen när som helst för att identifiera om vår måldatabas används.
INSERT INTO T1 ( session_id ,status_message ,login_name ,Name_of_Host ,Blocked_By ,Database_Name ,Script_description ,CPU_Time ,Disk_Input_Output ,Last_Batch ,Name_of_Program ,Session_ID_2 ,ID_of_Request ) EXECUTE sp_who2 active;
Metod 2:
Till skillnad från ovanstående metod, om du inte är intresserad av för mycket detaljer och bara vill veta om databasen används eller inte, så passar detta skript bäst. Om du använder SQL Server med en version äldre än 2014, då kommer detta inte att fungera. Utdata från detta skript visar 3 fält. De första fälten ger information om databasens namn. Detta är nyckelfältet för oss eftersom det hjälper oss att identifiera om vår måldatabas används. Det andra fältet hjälper oss att klassificera anslutningarna till databasen som användaranslutningar kontra SQL Server interna anslutningar. Den sista kolumnen visar antalet anslutningar till databasen.
SELECT DB_NAME(sys.dm_exec_sessions.database_id) AS [Database Name] ,CASE WHEN sys.dm_exec_sessions.is_user_process = 1 THEN 'YES' WHEN sys.dm_exec_sessions.is_user_process = 0 THEN 'NO' END AS [Is it User connection?] ,COUNT(sys.dm_exec_sessions.session_id) AS [Connections Count] FROM sys.dm_exec_sessions GROUP BY DB_NAME(sys.dm_exec_sessions.database_id) ,sys.dm_exec_sessions.is_user_process ORDER BY 1 ,2;
Metod 3:
Innan vi trycker in data i loggtabellen, i metod 1, kan vi inte göra ett filter på databasnamnet. Det är dock möjligt i metod 2 och metod 3.
SELECT t1.objtype AS [Object] ,t1.refcounts AS [ReferredCount] ,t1.usecounts AS [Usage] ,t1.size_in_bytes / 1024 AS [KB Size] ,db_name(t3.dbid) AS [DatabaseName] FROM sys.dm_exec_cached_plans t1 OUTER APPLY sys.dm_exec_text_query_plan(plan_handle, 0, - 1) t2 OUTER APPLY sys.dm_exec_sql_text(plan_handle) AS t3 WHERE db_name(t3.dbid) = 'ERP10_SandBox' ORDER BY t1.usecounts DESC;
Metod 4:

Ta bort databasen

Författarintroduktion:
Neil Varley är en dataåterställningsexpert i DataNumen, Inc., som är världsledande inom teknik för återställning av data, inklusive reparera Outlook PST-datafel och Excel-programvara för återställningsprogramvara. För mer information besök www.datanumen.com