Wie finde ich, dass die SQL Server-Datenbank verwendet wird oder nicht?

8

Welche Abfrage muss ich schreiben, um zu wissen, ob die Datenbank verwendet wird oder nicht? Ich habe versucht, folgende Abfrage

SELECT
    name 
FROM 
    sys.databases 
WHERE 
    state != 0;

aber es funktioniert nicht.

Ich möchte überprüfen, ob dort keine offene Verbindung zu dieser Datenbank besteht und keine Abfrage für diese Datenbank ausgeführt werden soll

MANISH KUMAR CHOUDHARY
quelle
Dies klingt nach einer merkwürdigen Anforderung: Auf einem mäßig ausgelasteten Server kann eine Verbindung eine Millisekunde hergestellt werden, nachdem Sie die Abfrage / sp / was auch immer abgeschlossen haben. Was ist das Ziel? Warum suchen Sie nach diesen Informationen? Was versuchst du zu erreichen?
Paolo
@Paolo Eigentlich erstelle ich ein DB-Upgrade-Skript, für das ich überprüfen muss, ob DB verwendet wird oder nicht.

Antworten:

3

Obwohl es viele Antworten gibt, möchte ich eine Antwort posten, die nicht technisch ist, aber Ihnen sicherlich sagen würde, ob die Datenbank verwendet wird oder nicht. IMHO gibt es keinen PERFEKTEN und ABSOLUTEN Weg. Was Sie tun können, ist

  1. Sie müssen alle oben genannten Methoden verwenden, insbesondere eine von Remus vorgeschlagene, um zu sehen und eine Vorstellung davon zu bekommen, wann zuletzt darauf zugegriffen wurde.

  2. Angenommen, Sie möchten in einem großen Unternehmen herausfinden, ob Datenbank A verwendet wird oder nicht und wer sie verwendet. Schreiben Sie zunächst eine E-Mail an alle erforderlichen Stakeholder, Manager und Anwendungsinhaber, damit Sie Datenbank A offline schalten, da Sie der Meinung sind, dass dies nicht mehr verwendet wird. Stellen Sie sicher, dass Sie alle einbeziehen, und warten Sie dann einen Tag, damit die Leute zu Ihrer E-Mail zurückkehren. Wenn niemand zurückkehrt take full backup of the databaseund die Datenbank offline macht (lassen Sie sie nicht fallen). Warten Sie noch eine Woche oder einen Monat. Sie können dies tun, da Sie DB bereits offline geschaltet haben und der Server nicht belastet wird. Ja, es werden möglicherweise monatliche Jobs ausgeführt, für die diese Datenbank einmal benötigt wird. Daher habe ich hinzugefügt, um einen Monat zu warten. Selbst nach einem Monat, wenn niemand zurückkehrt, machen Sie alles, was Sie wollen.

Wenn sich die Leute über etwas beschweren, von dem Sie wissen, wer es ist oder welches Team es wahrscheinlich verwendet, können Sie weiter darüber diskutieren.

Selbst nachdem Sie nach einem Monat offline geschaltet haben, kommt jemand und beschwert sich, dass ein bestimmter Job fehlgeschlagen ist, weil Sie DB offline geschaltet haben. Sie können sehr gut sagen, dass Sie dies schon früher per E-Mail gesendet haben und es keinen Sinn macht, sich jetzt zu beschweren. In allen Fällen würden Sie erfahren, wer wann auf etwas zugreift.

PS: Dies ist ein persönlich erprobter Ansatz, nachdem auf verschiedene online bereitgestellte Lösungen verwiesen wurde, und er hat bei mir wunderbar funktioniert.

Shanky
quelle
12

Um eine Datenbank verwenden zu können, muss jede Sitzung zuerst eine Sperre erhalten, normalerweise eine gemeinsame Sperre. Suchen Sie einfach nach solchen Schlössern:

select * 
from sys.dm_tran_locks 
where resource_type = 'DATABASE' 
and resource_database_id = <dbid>;
Remus Rusanu
quelle
0

Verwenden:

exec sp_who

auf dem SQL-Server.

Auf diese Weise erhalten Sie alle Informationen zu den Benutzern, Sitzungen und anderen Informationen, die derzeit Ihren SQL-Server verwenden. Der Status lautet "Ausführbar", "Ruhezustand" usw.

Sie können dies auch unter folgender Adresse überprüfen: https://msdn.microsoft.com/en-us/library/ms174313.aspx

ODER wenn Sie nur eine Abfrage benötigen, verwenden Sie:

select spid, status, loginame, hostname from master..sysprocesses

Vielen Dank,


quelle
OP sagte, dass er eine Abfrage benötige, keine gespeicherte Prozedur, die die Informationen zurückgeben würde.
RSax
@ RSax ok ich habe die Antwort aktualisiert. Danke
Es funktioniert nicht.
@ Manish Irgendein Fehler?
0

Sie suchen nach zwei Informationen:

  1. Die Befehle, die in einer Datenbank ausgeführt werden. und
  2. Wer führt diese Befehle aus?

Ich glaube, diese Abfrage gibt die Informationen zurück, die Sie benötigen, oder liefert Ihnen zumindest die Grundlage, die Ihren Anforderungen entspricht.

Ich habe diesen Code anhand von Beispielen angepasst, die ich in Books Online gefunden habe:

DECLARE @dbName varchar(100) = 'AdventureWorks2012'  --or the name of the db

SELECT
    z.DatabaseName,
    z.is_user_process,
    z.session_id as SPID,
    z.login_name,
    z.nt_domain,
    z.nt_user_name,
    z.original_login_name,
    y.cmd,
    y.status
FROM
    (SELECT
        db_name(s.database_id) as DatabaseName,
        s.is_user_process, 
        c.session_id, 
        s.login_name,
        s.nt_domain, 
        s.nt_user_name,
        s.original_login_name,
        s.host_name,
        s.program_name, 
        s.client_interface_name,
        c.connect_time, 
        s.login_time 
    FROM
        sys.dm_exec_connections AS c
    JOIN
        sys.dm_exec_sessions AS s
        ON c.session_id = s.session_id
    WHERE
        db_name(s.database_id) = @dbName --'AdventureWorks2012'
    ) AS z
JOIN
    (SELECT
        cmd,
        [status],
        spid,
        db_name(dbid) AS DatabaseName
    FROM
        sysprocesses
    WHERE 
        db_name(dbid) = @dbName --'Adventureworks2012'
    ) AS y
    ON
    z.DatabaseName = y.DatabaseName AND
    z.session_id = y.spid
RSax
quelle
Dies funktioniert nicht und zeigt den Fehler "Ungültiger Spaltenname 'db_id'" an.
MANISH KUMAR CHOUDHARY
Mein Code verweist nicht auf eine Spalte namens db_id
RSax
-1

Überprüfen Sie unten Abfrage:

SELECT NAME AS dbname
 ,COUNT(STATUS) AS number_of_connections
 ,GETDATE() AS timestamp
FROM sys.databases sd
LEFT JOIN sysprocesses sp ON sd.database_id = sp.dbid
WHERE database_id NOT BETWEEN 1 AND 4
GROUP BY NAME
user3759523
quelle
-2

So überprüfen Sie, wie viele Verbindungen für die angegebene Datenbank geöffnet sind:

SELECT 
  DB_NAME(dbid) as DBName, 
  COUNT(dbid) as NumberOfConnections,
  loginame as LoginName
FROM
  sys.sysprocesses
WHERE 
  dbid > 0
GROUP BY 
  dbid, loginame

quelle
1
Ich möchte nicht online oder offline prüfen. Ich muss prüfen, ob keine Verbindung geöffnet werden sollte und derzeit keine Abfrage ausgeführt wird.
2
Dies ist aus zwei Gründen falsch: 1) Sitzungen, in denen DB als Kontext festgelegt wird (was die Absicht der Abfrage ist), entsprechen nicht der DB-Verwendung, da eine Sitzung mit Kontext in DB1 DB2 über 3 Teilenamen und 2) referenzieren (daher verwenden) kann. es verwendet veraltete Ansichten, zumindest verwendensys.dm_exec_sessions
Remus Rusanu