web-dev-qa-db-fra.com

Comment savoir si une base de données SQL Server est toujours utilisée?

Nous cherchons à mettre hors service une instance SQL Server qui contient encore quelques bases de données.

Comment savoir s'ils sont toujours utilisés par des utilisateurs ou une application Web?

J'ai trouvé un fil de discussion qui contenait une requête T-SQL que vous pouviez exécuter pour récupérer la dernière date de requête. Cela semble fonctionner mais je veux savoir si ces informations sont suffisamment valides pour supprimer des bases de données. C'est ça?

Si vous avez des méthodes alternatives, cela pourrait aussi vous aider.

34
jsauni

Vous devez vous préoccuper des éléments qui ont été purgés du cache et que vous avez manqués, ou des bases de données qui ont une utilisation peu fréquente.

Plutôt que de supprimer les bases de données, mettez-les hors ligne pour empêcher l'accès sans les supprimer ou en mode RESTRICTED_USER pour limiter l'accès. Ce faisant, vous pouvez les laisser dans cet état pendant un mois ou deux pour vérifier et voir s'il y a une utilisation occasionnelle.

Vous pouvez également chercher à utiliser un filtrage de trace du profileur côté serveur sur cette base de données.

30
NicCain

Ce sont les méthodes que j'ai utilisées dans le passé:

  1. Mettre la base de données hors ligne/Détacher
  2. DENY accès utilisateur/connexion
  3. Trace du profileur

Le problème est le suivant: combien de temps attendez-vous avant d'être certain que personne ne va accéder aux données? Pour les données financières, certains éléments sont exécutés quotidiennement, hebdomadairement, mensuellement, trimestriellement, semestriellement et annuellement. Mais un an suffit-il? J'ai également vu des demandes de garder des données disponibles pendant au moins 7 ans, et dans un cas, on m'a dit que les données d'un système devaient être là pour toujours, même si personne ne les utilisait.

Le meilleur conseil est le suivant: quoi que vous fassiez pour désactiver l'accès, assurez-vous de pouvoir le réactiver immédiatement. J'ai trouvé que le détachement fonctionnait le mieux pour cela. Je voudrais simplement mettre le script en place et demander à mon équipe "si quelqu'un demande où il se trouve, exécutez ce script". Cela nous a donné la meilleure chance de remettre les choses le plus rapidement possible.

14
SQLRockstar

Je suis d'accord avec Nic avec ses conseils. Si vous devez être sûr, vous devrez alors utiliser le profileur (trace côté service) car certaines requêtes SQL ne seront pas mises en cache ou pour une raison quelconque, le cache de procédure pourrait être purgé.

Je vérifierais normalement les informations sur les statistiques des fichiers virtuels également pour voir s'il y a des lectures ou des écritures au niveau du fichier OS. Même si la base de données n'est PAS active, vous verrez toujours une petite lecture/écriture si vous effectuez des sauvegardes de journaux, des sauvegardes complètes, etc. ... mais cela vous donnera également une idée de l'activité de lecture/écriture sur cette base de données.

Avant de supprimer une base de données, je m'assurerais que vous disposez d'au moins 2 ou 3 sauvegardes lisibles (testez-les) dans des emplacements distincts. Vous ne savez jamais quand vous en avez besoin.

13
Sankar Reddy

La requête suivante montre les bases de données qui n'ont pas été utilisées depuis le dernier redémarrage, sans compter sur les plans de requête conservés dans le cache, car elle montre l'utilisateur IO par rapport aux index (et tas). C'est en quelque sorte le long de l'utilisation des statistiques de fichiers virtuels, mais le DMV utilisé ici exclut l'activité IO des sauvegardes. Pas besoin de garder une trace de profileur en cours d'exécution, aucun déclencheur ou audit requis. Bien sûr, si vous redémarrez fréquemment votre serveur SQL (ou vous attachez/arrêtez souvent des bases de données), ce n'est peut-être pas la voie à suivre :-)

Cela dit, convenez toujours que même si cette requête semble confirmer qu'une base de données peut être supprimée, certainement faites le OFFLINE/détachez ou refusez l'accès utilisateur pendant un certain temps, plus toute diligence raisonnable de demander avant en fait en baisse!

select [name] from sys.databases 
where database_id > 4
AND [name] NOT IN 
(select DB_NAME(database_id) 
from sys.dm_db_index_usage_stats
where coalesce(last_user_seek, last_user_scan, last_user_lookup,'1/1/1970') > 
(select login_time from sys.sysprocesses where spid = 1))
8
FloorDivision

J'ai travaillé dans un endroit qui avait un grand nombre de bases de données orphelines et semi-orphelines. Il était difficile de dire s'ils étaient vraiment orphelins car de nombreuses tâches étaient saisonnières ou annuelles - de sorte que le site Web ne fonctionne que pendant 3-4 mois par an (par exemple, les formulaires W2 doivent être déposés électroniquement 1/31, donc le traitement du site Web celles-ci ne se sont déroulées que de mi-janvier à fin avril).

Ce qui a été fait était une combinaison de:
* demandez à chaque développeur s'il utilise une base de données ou une autre (ces e-mails sont envoyés mensuellement ou chaque fois que les sauvegardes prennent trop de temps).
* mettez la base de données hors ligne et voyez qui se plaint.
* renommer le serveur pour voir qui se plaint.

Étant donné que le patron aux cheveux pointus était seulement disposé à autoriser une documentation "complète et complète", un wiki a été expressément interdit, et les réductions de personnel entraînent une baisse spectaculaire de la documentation conforme à la norme.

Si cela ne tenait qu'à moi, il y aurait une page wiki par serveur avec les noms des contacts pour chaque base de données (et peut-être une brève description de son utilisation). Toute base de données non documentée sur le wiki serait un jeu équitable à supprimer.

Nous avions un gros client financier qui utilisait encore SQL Server 2000 jusqu'en 2009, nous avons donc dû garder une instance de SQL Server 2000 en cours d'exécution jusqu'à ce que ce client passe enfin à SQL Server 2005.

3
Tangurena

La solution suivante affiche les pages totales, propres et sales temporaires en Mo pour des bases de données particulières sous votre instance (trouvées sur Internet et modifiées un peu):

SELECT
    (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
    COUNT(*) *8/1024 AS [TotalPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) *8/1024 AS [CleanPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) *8/1024 AS [DirtyPages in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY DB_NAME(database_id)

ou

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
where  attribute = 'dbid' 
order by last_execution_time desc

ou

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
--where dbid=8
where 
      text like '%idAdministrator%' and
      attribute = 'dbid' 
      and value>= 5 -- dbid >=5 for user databases but include resource database which
                     --you can exclude by its numer I don't remember at the moment
order by last_execution_time desc
2
SQL Server Frant

Deux autres alternatives sont:

  1. Créez des déclencheurs sur la base de données qui vous informeront (ou stockeront dans des tables) de toute activité.
  2. Activez l'audit sur les bases de données.

    • Dépend de votre version DB.
2
StanleyJohns