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