Comment puis-je savoir si une base de données SQL Server est encore utilisé?

dba.stackexchange https://dba.stackexchange.com/questions/2050

  •  16-10-2019
  •  | 
  •  

Question

Nous cherchons à désaffecter une instance SQL Server qui lui reste encore sur une base de données de le coupler.

Comment puis-je savoir si elles sont encore utilisées par les utilisateurs ou une application web?

J'ai trouvé un fil de forum qui avait une requête T-SQL que vous pouvez exécuter pour récupérer la dernière date de la requête. Il semble fonctionner, mais je veux savoir si cette information est assez valide pour déposer des bases de données. Est-il?

Si vous avez des méthodes alternatives qui serait également souhaitable.

Était-ce utile?

La solution

Vous devrait être concerné avec des éléments qui ont été purgés à partir 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 laisser tomber les bases de données de la main les mettre soit en mode local pour empêcher l'accès sans les laisser tomber 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 pourriez également chercher à utiliser une trace profileur côté serveur filtrage sur cette base de données.

Autres conseils

Ce sont les méthodes que je l'ai utilisé dans le passé:

  1. Prendre base de données en ligne / Détacher
  2. DENY utilisateur / accès de connexion
  3. trace Profiler

Le problème est la suivante: combien de temps attendez-vous avant que vous êtes certain que personne ne va accéder aux données? Pour les données financières, vous avez des articles circulent tous les jours, hebdomadaire, mensuelle, trimestrielle, semestrielle et annuelle. Mais une année assez longtemps? Je l'ai vu aussi des demandes d'avoir des données conservées pendant au moins 7 ans, et on m'a dit que dans un cas, que les données dans un système nécessaire pour être là pour toujours, même si personne ne l'utilisait.

Le meilleur conseil est le suivant: tout ce que vous faites pour désactiver l'accès, assurez-vous que vous pouvez le rallumer immédiatement. J'ai trouvé que le détachons fonctionne le mieux pour cela. Je voudrais simplement scripter l'Rattacher et de demander mon équipe « si quelqu'un demande jamais où il est, exécutez ce script ». Cela nous a donné la meilleure chance de remettre les choses le plus rapidement possible.

Je suis d'accord avec Nic avec ses conseils. Si vous devez être sûr, alors vous devez aller avec Profiler (trace de côté service) parce que certaines des requêtes SQL ne seront pas mises en cache ou pour quelque raison que ce pourrait être purgés le cache de procédure.

Je normalement vérifier les informations du fichier virtuel aussi pour voir s'il y a une lecture ou d'écriture qui se passe au niveau du fichier OS. Même si la base de données n'est pas actif, vous verrez encore un petit lit / écrit si vous prenez des sauvegardes de journaux, les sauvegardes complètes, etc ... mais qui aussi vous donner une idée de l'activité de lecture / écriture sur cette base de données.

Avant de supprimer toute base de données, je voudrais vous assurer que vous avez au-moins 2 ou 3 sauvegardes lisibles (les tests) dans des endroits séparés. Vous ne savez jamais quand vous en avez besoin.

La requête suivante montre les blocs de données qui ont eu aucune utilisation depuis le dernier redémarrage, sans compter sur les plans de requête tient dans le cache, car il montre l'utilisateur IO contre les index (et des tas). C'est un peu le long des lignes de l'utilisation des statistiques de fichiers virtuels, mais le DMV utilisé ici exclut l'activité IO de sauvegardes. Pas besoin de garder une trace de fonctionnement de profileur, aucun déclencheur ou de la vérification nécessaires. Bien sûr, si vous redémarrez votre serveur SQL fréquemment (ou vous joindre / bases de données d'arrêt souvent) cela pourrait ne pas être la voie à suivre: -)

Cela dit, d'accord encore que même si cette requête semble confirmer qu'un DB peut être abandonné, définitivement faire le OFFLINE / Détacher ou refuser l'accès utilisateur pendant un certain temps, plus une diligence raisonnable demander autour avant de réellement tomber!

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))

J'ai travaillé à un endroit qui avait un grand nombre de bases de données orphelins et semi-orphelins. Il était difficile de dire si elles étaient vraiment devenus orphelins autant de tâches étaient saisonnières ou annuelles - de sorte que le site ne fonctionne que pendant 3-4 mois par an (à titre d'exemple, les formulaires W2 doivent être déposées par voie électronique 1/31, de sorte que le traitement du site ceux-ci ne couraient de mi-Janvier à la fin Avril).

Ce qui a été fait était une combinaison de:
 * Demander à chaque développeur si elles utilisaient une base de données ou l'autre (ces e-mails sortiraient chaque mois ou chaque fois que les sauvegardes prenaient trop de temps).
 * La mise hors ligne de base de données et voir qui se plaint.
 * Renommer le serveur pour voir qui se plaint.

Depuis le patron aux cheveux Pointy n'était disposé à permettre à la documentation « pleine et entière », un wiki a été expressément interdit, et la réduction des effectifs conduit à une baisse spectaculaire de la documentation qui respectait la norme.

Si cela ne tenait qu'à moi, il y aurait une page wiki par serveur avec des noms de contact pour chaque base de données (et peut-être une brève description de ce que la base de données pour). Toute base de données en situation irrégulière sur le wiki serait un jeu équitable pour la suppression.

Nous avons eu un gros client financier qui était encore en utilisant SQL Server 2000 jusqu'en 2009, nous avons donc dû garder une instance SQL Server 2000 en cours d'exécution jusqu'à ce que le client a finalement déplacé vers SQL Server 2005.

Deux autres alternatives sont:

  1. Créer des déclencheurs sur la base de données qui vous avertira (ou magasin aux tables) de toute activité.
  2. Activer l'audit sur les blocs de données.

    • dépend de la version DB.

Les spectacles suivants de solution temporaire totale, pages propres et sales dans Mo pour les bases de données particulières dans votre instance (sur Internet et trouvé un peu) modifié:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top