Fehler beim Versuch, DB-Hierarchien anzuzeigen


17

Ich habe Probleme mit einer Datenbank.

  1. Ich kann grundlegende Abfragen ausführen, wenn auch viel langsamer als normal.

  2. Wenn ich versuche, die Hierarchiebäume für Tabellen, Ansichten oder Prozeduren im SSMS-Objekt-Explorer anzuzeigen, erhalte ich lock request time out period exceeded.

  3. Meine SSRS-Berichte, die für Objekte in dieser Datenbank ausgeführt werden, werden nicht mehr ausgeführt.

  4. Jobs, die Prozeduren zugeordnet sind, die in dieser Datenbank gespeichert sind, werden ebenfalls nicht ausgeführt.

Ich habe versucht sp_who2, alle Verbindungen in der Datenbank zu finden und zu beenden. Das Problem wurde jedoch nicht gelöst.

Was geht hier vor sich? Wie kann ich das beheben?


Siehe auch: stackoverflow.com/questions/12167570/… ; Ich bin mir nicht sicher, ob dies als Duplikat gilt oder nicht.
LittleBobbyTables

Aufgrund Ihres Kommentars zu meiner Antwort unten, denke ich, dass Sie viel mehr Informationen bereitstellen müssen. Wie groß ist der Server, haben Sie die Leistungsindikatoren beobachtet, ist er auf Festplatte ausgelagert oder auf andere Weise ressourcenarm? Stellen Sie sicher, dass Sie das oben Gesagte überprüfen und nicht einfach irgendetwas annehmen. Geschieht dies auch, wenn Sie eine Verbindung herstellen, während Sie sich auf dem Desktop befinden? Tritt das Problem nur auf, wenn Sie von einem einzigen Standort aus zugreifen? Wie ist das Netzwerkwetter für diesen Server (und Ihre Verbindung zu ihm)?
NotMe

3
Klingt so, als hätten Sie offene Transaktionen, die den Lesezugriff auf die Tabellen blockieren.
a_horse_with_no_name

Antworten:


11

Dies wurde durch ein fortwährendes Rollback einer Transaktion verursacht. Musste irgendwann meinen Server-Cluster neu starten


2
Das Neustarten des Dienstes hat es für mich gelöst.
HerrimanCoder

Ein Neustart in einer solchen Situation kann zur Wiederherstellung der Datenbank führen
MaazKhan47

dbcc opentran teilt Ihnen mit, ob offene Transaktionen vorliegen
Nate Anderson

Ich finde es seltsam, dass ich während der Ausführung einer Transaktion beispielsweise den Tabellenabschnitt nicht erweitern kann. Keine gelesenen Daten, keine DDL, nichts, nur die Liste der Tabellen.
Gerleim

5

Abgesehen von der Berücksichtigung von Harware müssen Sie das Skript möglicherweise ausführen, um zu überprüfen, in welchen Aktivitäten die SQL-Sitzung zurückgehalten wird. Eines der häufigsten Szenarien besteht darin, Implicit transactions Optionin SQL Server Management Studio kein zu verwenden .


Hallo Steinbutt, kannst du etwas näher auf das eingehen, was du vorschlägst?

Es sieht so aus, als ob dies zwar nicht vollständig erklärt ist, es sich jedoch möglicherweise um eine bessere Antwort handelt, um ein fortlaufendes Rollback von Transaktionen, die nicht zurückgesetzt werden, und die nur aufgrund impliziter Transaktionen aktiviert werden.
ConstantineK

Wenn ich auf die Frage zurückblicke, kann ich nicht sagen, dass es sich um ein ständiges Rollback einer Transaktion handeln muss. Wenn locking request time out period exceedich das beurteile, würde ich sagen, Laufen implicit transaction optionwürde einen besseren Hinweis auf die Ursachen geben.
Turbot

Tools / Optionen / Abfrageausführung / SQL Server / ANSI / SET IMPLICIT TRANSACTIONS
Tadej

3

Dieses Problem trat auf, als ich eine explizite Transaktion startete, in der ich eine Tabelle in tempdb aus einem Skript erstellte, das in einer anderen Datenbank (nicht tempdb) ausgeführt wurde. Als ich die Transaktion festschrieb, schien das Festschreiben die Sperre für die Tabelle, die ich in tempdb erstellt hatte, nicht aufzuheben.

Dank dieser Seite habe ich USEtempdb ausgeführt DBCC OPENTRANund die SPID der Verbindung zu tempdb erhalten, die die Sperre verursacht hat. Dann muss ich KILL <SPID number>es töten.

Nicht sehr anmutig, und ich verlor alle Informationen in der Tabelle, die ich in Tempdb erstellt hatte, aber das war in meinem Fall in Ordnung.


In unserem Fall wurde mit SET IMPLICIT TRANSACTIONS ON ohne COMMIT TRANSACTION ein DML-Befehl (View Redefinition) für die Datenbank ausgegeben , der versehentlich eine lang anhaltende Transaktion verursachte. Durch die Verwendung von DBCC OPENTRAN konnte dieses Problem schnell erkannt werden.
Julio Nobre

1

Es gibt so viele Dinge, dass ich nur ein paar Fragen anbieten kann, die Ihnen helfen, eine Antwort zu finden.

  1. Befindet sich die Datenbank auf einem Server, auf dem nur SQL Server ausgeführt wird? Wenn nicht, können andere Prozesse stören, indem sie wertvolle Prozessorzeit stehlen.

  2. Ist der DB-Server im Wesentlichen nicht genügend Arbeitsspeicher? SQL Server wird versuchen, jedes einzelne Byte zuzuweisen, das es kann. Wenn jedoch die Kapazität ausgelastet ist und Ihre Abfragen das Laden von mehr Daten erfordern, muss auf die Verwendung des virtuellen Speichers zurückgegriffen werden, was die Zeit, die selbst einfache Abfragen möglicherweise in Anspruch nehmen, erheblich verlängert.

  3. Ist die Netzwerkbandbreite des DB-Servers zu gering, um die Daten rechtzeitig zu übertragen?


Letztendlich scheint der Computer, auf dem Sie SQL Server hosten, zu klein für das zu sein, was Sie versuchen. Es ist durchaus möglich, dass Sie endlich die Hardware-Grenzen erreicht haben, an denen die Leistung drastisch sinkt. Wenn dies der Fall ist (die obigen Fragen helfen Ihnen dabei, dies zu ermitteln), sollten Sie die Datenbank auf einen Server verschieben, der für die Datenmenge (und die Abfragen), die Sie verarbeiten möchten, die richtige Größe aufweist.

Dies kann bedeuten, dass schnellere Prozessoren, schnellere Laufwerke oder einfach mehr RAM installiert werden.


Es ist kein Hardwareproblem. Der Servercluster hostet mehrere Datenbanken. Dies ist die einzige Datenbank mit Problemen

@LloydBanks: Das heißt nicht, dass dies kein Hardwareproblem ist. Wenn ich 2 Datenbanken habe, eine mit 20 GB Größe und einer hohen Transaktionsrate und eine mit 1 GB bei einer niedrigeren Transaktionsrate, würde ich erwarten, dass die 1 GB-Datenbank in den virtuellen Speicher ausgelagert wird. was die Abfragezeiten verlängern würde. Wenn die 20-GB-Datenbank stark genug getroffen wird, kann dies zu Verbindungsproblemen mit der kleineren Datenbank führen.
NotMe

1

"Wenn ich versuche, die Hierarchiestrukturen für Tabellen, Ansichten oder Prozeduren im SSMS-Objekt-Explorer anzuzeigen, wird die Zeitüberschreitung für Sperranforderungen überschritten."

Ich hatte genau das gleiche Problem. Ich ging zum Abfrage-Ausführungsfenster und; getippte und ausgeführte ROLLBACKAnweisung.

Es sieht so aus, als ob einige der Aussagen, die ich zuvor ausgeführt habe, eine offene Transaktion enthielten. Insbesondere, weil einige von ihnen DDL-Anweisungen enthalten. Nachdem ich ein Rollback durchgeführt hatte, begannen die Objekthierarchien zu funktionieren.


0

Wie schon viele darauf hingewiesen hatten, gibt es in der Regel eine lang andauernde Transaktion, die meistens dazu führte, dass mein Fehler SET IMPLICIT TRANSACTIONS ON verwendete, was überhaupt nicht verwendet werden sollte. Um zu sehen, warum Brent Ozars aufschlussreicher Artikel zu Rate gezogen wurde

Auf jeden Fall können Sie mit der folgenden Abfrage eine Liste der ausstehenden Transaktionen mit langer Laufzeit abrufen.

SELECT
    [s_tst].[session_id],
    [s_es].[login_name] AS [Login Name],
    DB_NAME (s_tdt.database_id) AS [Database],
    [s_tdt].[database_transaction_begin_time] AS [Begin Time],
    [s_tdt].[database_transaction_log_bytes_used] AS [Log Bytes],
    [s_tdt].[database_transaction_log_bytes_reserved] AS [Log Rsvd],
    [s_est].text AS [Last T-SQL Text],
    [s_eqp].[query_plan] AS [Last Plan]
FROM
    sys.dm_tran_database_transactions [s_tdt]
JOIN
    sys.dm_tran_session_transactions [s_tst]
ON
    [s_tst].[transaction_id] = [s_tdt].[transaction_id]
JOIN
    sys.[dm_exec_sessions] [s_es]
ON
    [s_es].[session_id] = [s_tst].[session_id]
JOIN
    sys.dm_exec_connections [s_ec]
ON
    [s_ec].[session_id] = [s_tst].[session_id]
LEFT OUTER JOIN
    sys.dm_exec_requests [s_er]
ON
    [s_er].[session_id] = [s_tst].[session_id]
CROSS APPLY
    sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est]
OUTER APPLY
    sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp]
where [s_tdt].[database_transaction_begin_time] is not null
ORDER BY
    [Begin Time] ASC;

https://www.brentozar.com/archive/2018/02/set-implicit_transactions-one-hell-bad-idea/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.