淫咪咪 資料庫被誰給卡住了
发布日期:2024-12-03 12:05 点击次数:126
在一個多东说念主同時使用資料庫的環境中淫咪咪,IT东说念主員常會有這樣的經驗,使用者電話打來懊恼:
「我的程式查詢按下去跑不出來」 「我的報表跑到逾時終止」 「我平凡執行這個程式一下子就跑结束,今天程式執行得特別慢,等好久」
為什麼今天資料庫卡卡的?我的資料庫被誰卡住了?
這要回到資料庫同時處理多個要领的機制。SQL Server 資料庫引擎,是架構在Client/Server環境下的服務,當使用者對資料庫伺服器建议請求要查詢某個資料表的某些資料,資料庫引擎會先檢查当今是否有其他要领正在”使用”這些資料,若是其他要领還在使用中,必須恭候其他要领使用完才气使用。有點類似,某天小明到便利超商念念使用洗手間,得先看洗手間是否有东说念主使用,若是有其他东说念主正在使用中,必須等洗手間沒有东说念主使用才气進去。但是小明怎麼知说念洗手間有沒有东说念主使用? 便利超商的洗手間,門把上有一個牌子,當有东说念主進入洗手間鎖上,外面會看到牌子會變成紅色的”使用中”,其他东说念主就知说念洗手間現在有东说念主正在使用,鎖打開後,牌子會變成藍色的”空閒中”,下一位来宾才气使用。SQL Server亦然使用讨论的旨趣,產生鎖定(Lock)來见告其他使用者,当今資料正在使用中。
文轩 探花這裡诈欺一個簡易的例子來作念說明:
在Microsoft SQL Server Management Studio中淫咪咪,新增查詢執行以下的SQL語法(SQLQuery1)
-- 移除資料庫db01 USE master; DROP DATABASE IF EXISTS db01; GO -- 建树資料庫db01 CREATE DATABASE db01; GO USE db01; -- 建树測試資料表 dbo.Test CREATE TABLE dbo.Test ( id int PRIMARY KEY );
新增查詢,執行以下語法(SQLQuery2)
USE db01; BEGIN TRAN INSERT INTO dbo.Test(id) VALUES(1);
再新增一個查詢,執行以下語法(SQLQuery3)
USE db01; SELECT * FROM dbo.Test;
這時候,(SQL-2)的語法會處於一個恭候中的狀態,在Object Explored,Server上右鍵 => Activity Monitor


列表中Session ID = 56 的狀態為 SUSPENDED(暫止中),恭候Session 55的Lock被釋放。 Session ID=55, Header Blocker欄位的值為1 ,暗意這一個Session為阻擋執行的元凶。

在這個Session上右鍵=>Kill Process就不错讓其他Process的障礙被移除,但也要戒备到,此時被Kill的Process的動作就會被取消了,交游就失敗了。
也不错诈欺SQL語法找出当今正在執行的要领
EXEC sp_who2;

不错看到 Session 56 被 Session 55給擋住了(Blocked By)
以下的DMV也不错找到被擋住的語法
SELECT r.session_id, r.status AS [请示狀態], r.command AS [请示類型], r.wait_time/1000.0 AS [恭候時間(秒)], s.client_interface_name AS [連線資料庫的驅動程式], s.host_name AS [電腦名稱], s.program_name AS [執行程式名稱], t.text AS [執行的SQL語法], r.blocking_session_id AS [被鎖定卡住的session_id] FROM sys.dm_exec_requests r INNER JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t WHERE s.is_user_process = 1;
SQL Server有提供各種監控的DMV(Dynamic Management View),仅仅要兜出齐全的資訊往往需要好幾個View总计看,對初學者而言不是很容易的事情淫咪咪,也因此,在SSMS介面中有不少器具不错使用,诈欺這些器具,也不错很容易地找出究竟現在的SQL Server在”忙甚麼”,下次有使用者問「我的程式查詢按下去跑不出來」不错試著诈欺這些步调來找出,究竟我的資料庫是被誰給卡住了。