sqlserver 提示只能終止用戶進(jìn)程,查看阻塞進(jìn)程,單用戶模式,死鎖鎖死
廣告:
sqlserver 提示只能終止用戶進(jìn)程,查看阻塞進(jìn)程,單用戶模式,死鎖鎖死
sqlserver 查看阻塞進(jìn)程,查看數(shù)據(jù)庫(kù)哪個(gè)表被鎖:
http://jdki.com.cn/news/detail/20831.html
方法一:
USE master;
GO
DECLARE @SQL VARCHAR(MAX);
SET @SQL=''
SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID)
FROM master.sys.sysprocesses
WHERE dbid=DB_ID('ecology9');
EXEC(@SQL);
GO
ALTER DATABASE ecology9 SET MULTI_USER;
-- 查詢當(dāng)前運(yùn)行的用戶進(jìn)程
SELECT * FROM sys.dm_exec_requests WHERE status = 'running';
KILL 57;
SELECT * FROM sys.databases
sqlserver 提示只能終止用戶進(jìn)程:
消息 6107,級(jí)別 14,狀態(tài) 1,第 3 行
只能終止用戶進(jìn)程。
只能終止用戶進(jìn)程" 通常是在SQL Server遇到嚴(yán)重錯(cuò)誤
恢復(fù)模式:如果數(shù)據(jù)庫(kù)在損壞的情況下可以被訪問,可以嘗試將數(shù)據(jù)庫(kù)恢復(fù)模式設(shè)置為SIMPLE或BULK_LOGGED以減少恢復(fù)時(shí)的復(fù)雜性。
如果有必要,恢復(fù)或重建事務(wù)日志文件。
檢查服務(wù)器的硬件資源,確保有足夠的內(nèi)存和磁盤空間,以及CPU資源不被其他應(yīng)用占用。
如果可能,嘗試從最近的數(shù)據(jù)庫(kù)備份中恢復(fù)數(shù)據(jù)庫(kù)。
-- 1. 運(yùn)行以下腳本來查找占用數(shù)據(jù)庫(kù)的進(jìn)程ID:
USE master;
SELECT session_id, blocking_session_id, program_name
FROM sys.dm_exec_requests
WHERE DB_NAME(database_id) = 'YourDatabaseName';
-- 2. 根據(jù)上一步找到的進(jìn)程ID,運(yùn)行以下腳本來殺死該進(jìn)程:
KILL <session_id>;
檢查死鎖:
SELECT * FROM sys.dm_os_waiting_tasks
WHERE session_id IN (SELECT blocking_session_id FROM sys.dm_exec_requests);
如果無法以單用戶身份登錄到數(shù)據(jù)庫(kù),可以嘗試使用以下命令以緊急模式登錄:
sqlcmd -S YourServerName -E -d master
緊急模式登錄后,可以嘗試執(zhí)行以下語句將數(shù)據(jù)庫(kù)設(shè)置為多用戶模式:
ALTER DATABASE YourDatabaseName SET MULTI_USER;
USE master;
ALTER DATABASE YourDatabaseName SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
如果發(fā)生死鎖的事務(wù)是可以重試的,那么可以通過重試來解決死鎖。
在 SQL Server 中,將數(shù)據(jù)庫(kù)設(shè)置為單用戶訪問模式可能會(huì)導(dǎo)致其他用戶會(huì)話無法連接到數(shù)據(jù)庫(kù)。如果在此模式下發(fā)生了死鎖或其他問題,可能需要采取一些步驟來解決。以下是一些可能的解決方案:
1. **嘗試關(guān)閉活動(dòng)連接**:
- 使用
```sql
SQL Server Management Studio (SSMS)
``` 或其他 SQL Server 客戶端,嘗試關(guān)閉與數(shù)據(jù)庫(kù)的活動(dòng)連接。確保沒有任何用戶連接到該數(shù)據(jù)庫(kù)。
2. **使用 T-SQL 進(jìn)行修改**:
- 打開
```sql
SQL Server Management Studio (SSMS)
```或使用其他支持 SQL 的工具。
- 連接到 SQL Server,并使用以下 T-SQL 語句將數(shù)據(jù)庫(kù)設(shè)置為多用戶模式:
```sql
USE master;
GO
ALTER DATABASE YourDatabaseName SET MULTI_USER;
```
請(qǐng)將 `
```sql
YourDatabaseName
```` 替換為你的數(shù)據(jù)庫(kù)名稱。
3. **使用 `sp_who` 查看活動(dòng)進(jìn)程**:
- 在數(shù)據(jù)庫(kù)設(shè)置為單用戶模式時(shí),執(zhí)行以下查詢可以查看當(dāng)前連接到數(shù)據(jù)庫(kù)的活動(dòng)進(jìn)程:
```sql
USE master;
GO
EXEC sp_who;
```
- 查找并終止可能阻止設(shè)置為多用戶模式的進(jìn)程。
4. **終止可能導(dǎo)致死鎖的進(jìn)程**:
- 使用以下語句查找并終止可能導(dǎo)致死鎖的進(jìn)程:
```sql
USE master;
GO
KILL <SPID>;
```
請(qǐng)將 `<SPID>` 替換為正在執(zhí)行的進(jìn)程的 SPID。
5. **重啟 SQL Server 服務(wù)**:
- 如果以上步驟無法解決問題,可以嘗試重啟 SQL Server 服務(wù)。請(qǐng)注意,這將導(dǎo)致所有連接中斷。
請(qǐng)?jiān)趫?zhí)行上述步驟之前確保已經(jīng)備份了數(shù)據(jù)庫(kù),以防不測(cè)。同時(shí),確保在生產(chǎn)環(huán)境中執(zhí)行這些操作時(shí)謹(jǐn)慎操作,以避免數(shù)據(jù)丟失或中斷服務(wù)。如果問題仍然存在,可能需要進(jìn)一步分析和調(diào)查。
您提到的消息6107、消息1205和消息5069。
在查詢窗口中運(yùn)行下面的命令,以終止所有用戶進(jìn)程:
USE master;
ALTER DATABASE [YourDatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
這將強(qiáng)制終止正在運(yùn)行的事務(wù),并將數(shù)據(jù)庫(kù)設(shè)置為單用戶模式。
如果上述步驟中的命令執(zhí)行不成功,你可以嘗試使用下面的命令,以終止死鎖進(jìn)程:
USE master;
KILL <SPID>;
其中,<SPID>是導(dǎo)致死鎖的進(jìn)程的ID。你可以通過運(yùn)行下面的查詢來獲取進(jìn)程的ID:
USE master;
SELECT session_id AS [SPID], login_time, host_name, program_name
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID('YourDatabaseName');
重啟SQL Server服務(wù),并在服務(wù)重新啟動(dòng)后再次嘗試執(zhí)行設(shè)置單用戶模式的命令。
終止所有用戶進(jìn)程:
USE master;
GO
DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(5), session_id) + ';'
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID('YourDatabaseName')
EXEC(@kill);
檢查并修復(fù)死鎖
SELECT
tl.resource_type,
tl.request_mode,
tl.request_session_id,
wt.blocking_session_id,
es.program_name,
es.host_name,
es.login_name
FROM
sys.dm_tran_locks AS tl
INNER JOIN sys.dm_os_waiting_tasks AS wt
ON tl.lock_owner_address = wt.resource_address
INNER JOIN sys.dm_exec_sessions AS es
ON tl.request_session_id = es.session_id;
你需要找出正在使用數(shù)據(jù)庫(kù)的進(jìn)程。你可以使用以下查詢來查找:
SELECT * FROM sys.dm_exec_requests WHERE session_id <> @@SPID;
這將返回所有正在運(yùn)行的會(huì)話,其中session_id不等于當(dāng)前會(huì)話的ID(@@SPID)。
KILL [process_id];
首先,找到導(dǎo)致死鎖的事務(wù)ID(在這個(gè)例子中是146)。你可以使用以下查詢來查找死鎖信息:
SELECT * FROM sys.dm_tran_locks;
然后,嘗試回滾或終止導(dǎo)致死鎖的事務(wù)。例如,如果你知道事務(wù)ID是146,你可以使用以下命令來回滾事務(wù):
ROLLBACK TRANSACTION 146;
如果問題仍然存在,你可以嘗試重新運(yùn)行導(dǎo)致死鎖的事務(wù)。這可能需要你手動(dòng)修改代碼以避免死鎖。
更新統(tǒng)計(jì)信息:有時(shí),死鎖可能是由于數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息不準(zhǔn)確或過時(shí)導(dǎo)致的。嘗試運(yùn)行以下SQL命令來更新數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息:
UPDATE STATISTICS;
第三個(gè)方法:
在master數(shù)據(jù)庫(kù)中查詢后首次運(yùn)行
exec sp_who
執(zhí)行
SELECT request_session_id FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID('數(shù)據(jù)庫(kù)')
然后用以下查詢終止使用你的數(shù)據(jù)庫(kù)的所有進(jìn)程:
KILL spid(數(shù)字)
然后運(yùn)行以下查詢:
USE Master
ALTER DATABASE 數(shù)據(jù)庫(kù) SET MULTI_USER
--查看相關(guān)進(jìn)程和線程
USE master;
go
select * from sys.sysprocesses where db_name(dbid)=''
通過下面的語句可以查看當(dāng)前庫(kù)中有哪些表是發(fā)生死鎖的:
SELECT request_session_id
spid,OBJECT_NAME(resource_associated_entity_id)tableName
FROM
sys.dm_tran_locks
WHERE resource_type='OBJECT '
廣告: