我想删除当前打开到特定 PostgreSQL 数据库的所有连接(会话),但不重新启动服务器或断开与其他数据库的连接。
我怎样才能做到这一点?
我们使用 ASPState 数据库在 SQL Server 2005 群集上保留 .NET 会话状态。我们在高峰期看到一些奇怪的行为
DeleteExpiredSessions 过程通过代理作业每分钟运行一次。有时这项工作需要花费几分钟来运行和删除过期的会话
从应用程序到 ASPState 数据库的请求非常缓慢。我相信这是因为 DeleteExpiredSessions 过程在表上持有排他锁
代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[DeleteExpiredSessions]
AS
SET NOCOUNT ON
SET DEADLOCK_PRIORITY LOW
DECLARE @now datetime
SET @now = GETUTCDATE()
DECLARE @tblExpiredSessions TABLE
(
SessionID nvarchar(88) NOT NULL PRIMARY KEY
)
INSERT INTO @tblExpiredSessions (SessionID)
SELECT SessionID
FROM [ASPState].dbo.ASPStateTempSessions WITH (READUNCOMMITTED)
WHERE Expires < @now
--EXPIRED SESSION LOGGING
/*
DECLARE @ExpiredSessionCount Int;
SELECT @ExpiredSessionCount = COUNT(SessionID)
FROM @tblExpiredSessions; …Run Code Online (Sandbox Code Playgroud) 我发现以下查询显示设置了多少会话上下文变量:
SELECT cache_address
,name
,pages_kb
,pages_in_use_kb
,entries_count
,entries_in_use_count
FROM sys.dm_os_memory_cache_counters
WHERE TYPE = 'CACHESTORE_SESSION_CONTEXT';
Run Code Online (Sandbox Code Playgroud)
但现在我想知道设置了哪些键值对SESSION_CONTEXT()——如果有的话。
在对微软网站进行广泛研究后,我没有发现任何相关内容。
提前致谢。
我用谷歌搜索了一下,我的印象是
来自客户端的 Sql*net 消息
表明 Oracle DBMS 正在等待客户端向 DBMS 发送新命令,因此在此事件中花费的任何时间都应该是客户端时间,而不是消耗 DB 服务器 CPU。换句话说,通常情况下,如果一个会话在这个事件中,它应该是“INACTIVE”而不是“ACTIVE”。
令我们困惑的是,从本周开始(在我们开始使用连接池之后 [我们使用 dbcp]),我们偶尔会在
来自客户端的 Sql*net 消息
事件并长时间同时显示“ACTIVE”。在这段时间内,DB 上的 CPU 使用率很高。
谁能解释一下这意味着什么?如果 DB 会话正在等待客户端发送消息,那么它可以是“ACTIVE”并消耗 CPU 周期的原因是什么?
在 MySQL 中,使用SHOW GLOBAL VARIABLES提供了查看全局变量的能力。
SHOW SESSION VARIABLES是该会话的变量设置。
有没有办法SESSION从超级用户连接中查看其他活动的、连接的用户的变量?例如,是否有查询或视图可以显示哪些活动会话的变量设置与全局变量不同?
我有一个填充物化视图的耗时查询。它已经运行了 18 个小时 - 这是意料之外的。
SELECT STATUS
FROM V$SESSION
WHERE SID=194;
Run Code Online (Sandbox Code Playgroud)
上面的查询将会话显示为“ACTIVE”。我想知道这是否足以证明查询仍在运行,以及是否有任何其他方法可以仔细检查会话是否已死。
更新
会话并没有死;但一直在等待:
SQL*Net more data from dblink
Run Code Online (Sandbox Code Playgroud)
我按照 Phil 的建议使用了 sql trace 得出了这个结论。
在用于部署的大型 DDL 脚本中,将 SET NOEXEC ON 作为错误处理的一部分使用是很常见的,以防止下游代码的执行。如果与 SET NOCOUNT ON 结合使用,则除非进行适当的部署后检查,否则可能会无意中抑制代码执行。我检查了 sys.dm_exec_sessions 并且没有任何 SET 语句的属性。从 DBA 的角度来看,是否有其他方法可以检查当前会话或任何用户会话的任一语句的状态?
这是一个快速示例...
CREATE TABLE dbo.MJZTest
(Col1 int)
ON [PRIMARY2]
GO
IF @@ERROR<>0
SET NOEXEC ON
INSERT INTO dbo.MJZTest (Col1)
VALUES (1)
GO
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,如果[PRIMARY2]文件组不存在,阻止了表的创建,@@ERROR检查将调用SET NOEXEC ON阻止后续INSERT语句实际执行的语句。我见过使用 RedGate SQL Compare 等工具生成这种类型的代码。
问题是,如果执行代码的人SET NOEXEC OFF在调试期间忽略运行以重置会话,他们可能会收到一条Command(s) completed successfully.消息,而不管实际结果如何。
如果本地临时表仅对当前会话可用,并且 sp_ExecuteSql 创建一个新会话来执行传递给它的动态 SQL 字符串,那么该动态 SQL 查询如何访问在执行 sp_ExecuteSql 的会话中创建的临时表。
换句话说,为什么这样做:
SELECT 1 AS TestColumn
INTO #TestTempTable
DECLARE @DS NVARCHAR(MAX) = 'SELECT * FROM #TestTempTable'
EXEC sp_EXECUTESQL @DS
Run Code Online (Sandbox Code Playgroud)
结果:
我之所以不能做相反的事情(在动态 SQL 中创建临时表,然后在执行会话中的动态 SQL 查询之外访问它),我的理解是因为 sp_ExecuteSql 在新会话下执行。
sql-server dynamic-sql session temporary-tables sql-server-2016
我正在维护一个具有长时间打开会话的 SQL 服务器。
此会话没有打开的事务或正在主动运行的查询(请求)。
会话可能保持开放状态的原因是什么?是因为交易已打开但未关闭吗?
举行这样一次公开会议会产生什么后果?
假设您在 SQL Developer 中并想检查当前用户会话(即您的连接)是否有未提交的更改。
如果您退出 SQL Developer,它会进行这样的检查并显示一个对话框如何继续。我想在不退出的情况下检查它 - 例如通过执行特殊的 SQL 语句或 SQL Developer 操作。
理想情况下,如果可以配置 SQL Developer,以便在当前会话是“脏的”(即有未提交的更改)时直观地指示它,那就太好了——例如,通过在工作表周围显示红色边距。
session ×10
sql-server ×5
oracle ×3
connections ×1
dynamic-sql ×1
jdbc ×1
locking ×1
mysql ×1
postgresql ×1
t-sql ×1