web-dev-qa-db-fra.com

Comment surveiller l'historique de l'utilisation de la base de données si l'audit de connexion n'est pas activé?

J'ai un certain nombre de bases de données sur plusieurs serveurs qui ne semblent plus être utilisés. J'aimerais laisser tomber ces bases de données, mais je suis incertain s'ils sont réellement utilisés.

Je ne trouve pas leurs propriétaires, il n'y a pas de processus qui leur sont liés, et rien n'a été écrit aux tables depuis quelques mois maintenant.

L'audit de connexion n'a pas été activé avant aujourd'hui.

Les versions de serveurs vont de 2005 à 2014, mais la plupart d'entre elles sont sur 2008 R2.

Existe-t-il un moyen de vérifier l'historique des connexions pour ces bases de données, de remonter 6 mois, d'une double vérification avec ces utilisateurs, avant de prendre les bases de données hors ligne?

J'ai une suggestion d'examiner l'historique d'utilisation de l'index; Quelqu'un est-il capable de partager un script pour cela?

6
Razvan Zoitanu

I blogué à propos de i T exactement il y a un mois. Étant donné que les réponses de liaison seules sont découragées et coller ici tout le blog sera ridicule, voici un résumé de ce que vous trouverez là-bas.

Fondamentalement, vous devez enregistrer l'utilisation d'index dans une table utilisateur, afin de vous assurer que le serveur redémarrage et la maintenance d'index ne supprimez pas les entrées des bases de données qui vous intéressent.

Une deuxième méthode implique une utilisation d'index d'audit au moyen de streaming une session d'événements étendue qui capture les événements acquis de verrouillage. Cette méthode est particulièrement utile pour capturer des informations supplémentaires sur qui accède aux tableaux sans avoir à capturer des informations détaillées (audits et cibles de fichier XE serait trop verbeuse pour cette tâche).

J'espère que tu trouves cela utile.

6
spaghettidba

Vous avez une suggestion sur la recherche de l'historique d'utilisation de l'index, tout le monde heureux de partager un script s'il vous plaît

Le script ci-dessous vous obtiendrait l'historique d'utilisation de l'index:

D'en bas, nous pouvons avoir une idée du nombre de recherches, de numérisations, de recherches et de mises à jour globales (insérer, mettre à jour et suppression) s'est produite.

   DECLARE @dbid INT
--To get Datbase ID
SET @dbid = Db_id( )

SELECT
 Db_name( d.database_id )    database_name
 ,Object_name( d.object_id ) object_name
 ,s.name                     index_name
 ,c.index_columns
 ,d.*
FROM
 sys.dm_db_index_usage_stats d
 INNER JOIN sys.indexes s
  ON d.object_id=s.object_id
     AND d.index_id=s.index_id
 LEFT OUTER JOIN ( SELECT DISTINCT
                    object_id
                    ,index_id
                    ,Stuff( ( SELECT
                               ','+Col_name( object_id, column_id ) AS 'data()'
                              FROM
                               sys.index_columns t2
                              WHERE  t1.object_id=t2.object_id
                                 AND t1.index_id=t2.index_id
                              FOR XML PATH ('') ), 1, 1, '' ) AS 'index_columns'
                   FROM
                    sys.index_columns t1 ) c
  ON c.index_id=s.index_id
     AND c.object_id=s.object_id
WHERE  database_id=@dbid
   AND Objectproperty( d.object_id, 'IsIndexable' )=1
ORDER  BY
 index_columns
 ,object_name
 ,( user_seeks+user_scans+user_lookups+system_seeks+system_scans+system_lookups ) DESC

-- To find index scans
SELECT
 Db_name( d.database_id )    database_name
 ,Object_name( d.object_id ) object_name
 ,s.name                     index_name
 ,c.index_columns
 ,d.*
FROM
 sys.dm_db_index_usage_stats d
 INNER JOIN sys.indexes s
  ON d.object_id=s.object_id
     AND d.index_id=s.index_id
 LEFT OUTER JOIN ( SELECT DISTINCT
                    object_id
                    ,index_id
                    ,Stuff( ( SELECT
                               ','+Col_name( object_id, column_id ) AS 'data()'
                              FROM
                               sys.index_columns t2
                              WHERE  t1.object_id=t2.object_id
                                 AND t1.index_id=t2.index_id
                              FOR XML PATH ('') ), 1, 1, '' ) AS 'index_columns'
                   FROM
                    sys.index_columns t1 ) c
  ON c.index_id=s.index_id
     AND c.object_id=s.object_id
WHERE  database_id=@dbid
       AND Objectproperty( d.object_id, 'IsIndexable' )=1
   AND ( d.user_scans+d.system_scans )>0
ORDER  BY
 d.user_scans+d.system_scans

--To find unused indexes
-- This query will give you details of unused indexes with details like object_name index_name,index_type , index columns .
-- We are considering only indexes so we are omitting index_type heap, clustered since it represents tables
SELECT
 Object_name( i.object_id ) object_name
 ,i.name                    index_name
 ,i.index_id                index_id
 ,i.type_desc               type_desc
 ,c.index_columns
FROM
 sys.indexes i
 LEFT OUTER JOIN sys.dm_db_index_usage_stats d
  ON d.object_id=i.object_id
     AND i.index_id=d.index_id
     AND d.database_id=@dbid
 LEFT OUTER JOIN ( SELECT DISTINCT
                    object_id
                    ,index_id
                    ,Stuff( ( SELECT
                               ','+Col_name( object_id, column_id ) AS 'data()'
                              FROM
                               sys.index_columns t2
                              WHERE  t1.object_id=t2.object_id
                                 AND t1.index_id=t2.index_id
                              FOR XML PATH ('') ), 1, 1, '' ) AS 'index_columns'
                   FROM
                    sys.index_columns t1 ) c
  ON c.index_id=i.index_id
     AND c.object_id=i.object_id
WHERE  Objectproperty( i.object_id, 'IsIndexable' )=1
       AND d.index_id IS NULL
   AND i.type_desc NOT IN ( 'heap', 'clustered' )
-- To find only indexes which are only updated but not used in index seek, lookup or scan.
SELECT
 Object_name( i.object_id ) object_name
 ,i.name                    index_name
 ,i.index_id                index_id
 ,i.type_desc               type_desc
 ,c.index_columns
 ,d.user_updates
 ,d.user_seeks
 ,d.user_scans
 ,d.user_lookups
 ,d.system_updates
 ,d.system_seeks
 ,d.system_scans
 ,d.system_lookups
FROM
 sys.indexes i
 INNER JOIN sys.dm_db_index_usage_stats d
  ON d.object_id=i.object_id
     AND i.index_id=d.index_id
     AND d.database_id=@dbid
 LEFT OUTER JOIN ( SELECT DISTINCT
                    object_id
                    ,index_id
                    ,Stuff( ( SELECT
                               ','+Col_name( object_id, column_id ) AS 'data()'
                              FROM
                               sys.index_columns t2
                              WHERE  t1.object_id=t2.object_id
                                 AND t1.index_id=t2.index_id
                              FOR XML PATH ('') ), 1, 1, '' ) AS 'index_columns'
                   FROM
                    sys.index_columns t1 ) c
  ON c.index_id=i.index_id
     AND c.object_id=i.object_id
WHERE  Objectproperty( i.object_id, 'IsIndexable' )=1
       AND i.type_desc NOT IN ( 'heap', 'clustered' )
       AND ( d.user_updates>0
              OR d.system_updates>0 )
       AND d.user_seeks=0
       AND d.user_scans=0
       AND d.user_lookups=0
       AND d.system_seeks=0
       AND d.system_scans=0
   AND d.system_lookups=0 

Remarque * Les valeurs de ces compteurs sont réinitialisées chaque fois que vous redémarrez SQL Server. De plus, les valeurs pour les données renvoyées par sys.dm_db_index_operational_stats n'existe que tant que l'objet de cache de métadonnées qui représente le tas ou l'index est disponible.

De plus, ce que je préfère personnellement pour les situations ci-dessus, c'est utiliser sp_blitzindex pour analyser les informations d'utilisation de l'index. Veuillez passer par le lien mentionné comme cela simplifie le problème dans une large mesure.

Y a-t-il un moyen de vérifier l'historique des connexions pour ces bases de données, de remonter 6 mois, de vérifier avec ces utilisateurs, avant de prendre les bases de données hors ligne

Pour vérifier vos bases de données non utilisées. S'il vous plaît vérifier cet excellent article d'Aaron qui m'a beaucoup aidé avec 4 façons légères de dire si une base de données est utilisée

2
KASQLDBA