注册

使用sp_close_session杀会话,发现该会话并没有立即被终止,反而在后台变成等待后续存在再次执行的行为

杨卓 2021/11/26 1932 1

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM7
【操作系统】:LINUX
【CPU】:2
【问题描述】*:模拟dm7 lock锁行为产生阻塞,使用sp_close_session将阻塞的session kill,发现被kill的session后台其实并未结束!

--session 1
[dmdba@linux_7_mode bin]$ ./disql yz1/oracle1234
SQL> create table a(id varchar primary key);
SQL> insert into a values('cc');
影响行数 1

--session 2
[dmdba@linux_7_mode bin]$ ./disql yz2/oracle1234
drop table yz1.a;
[-6407]:锁超时.

--https://www.modb.pro/db/105891

SQL> select * from V$PARAMETER where NAME='DDL_WAIT_TIME';
行号     ID          NAME          TYPE    VALUE SYS_VALUE FILE_VALUE DESCRIPTION                             
---------- ----------- ------------- ------- ----- --------- ---------- ----------------------------------------
1          377         DDL_WAIT_TIME SESSION 10    10        10         Maximum waiting time in seconds for DDLs

--https://blog.csdn.net/cnje5551/article/details/100230508

--查询当前会话这个参数的值
SQL> select SF_GET_SESSION_PARA_VALUE('DDL_WAIT_TIME');
行号     SF_GET_SESSION_PARA_VALUE('DDL_WAIT_TIME')
---------- ------------------------------------------
1          10
--查询参数内存中的值
SQL> select * from V$PARAMETER where NAME='DDL_WAIT_TIME';
行号     ID          NAME          TYPE    VALUE SYS_VALUE FILE_VALUE DESCRIPTION                             
---------- ----------- ------------- ------- ----- --------- ---------- ----------------------------------------
1          377         DDL_WAIT_TIME SESSION 10    10        10         Maximum waiting time in seconds for DDLs

TYPE
手动参数(READ ONLY):DB在运行过程中,手动参数不能被修改,静态和动态参数可以修改。
静态参数(IN FILE):只能修改 ini 文件,修改后重启DB才能生效,为系统级参数,生效后会影响所有的会话。
动态参数(SYS 和 SESSION):ini 文件和内存同时可修改,修改后即时生效。其中,SYS为系统级参数,修改后会影响所有的会话;SESSION 为会话级参数,服务器运行过程中被修改时,之前创建的会话不受影响,只有新创建的会话使用新的参数值。


--查询参数文件中的值
SQL> select * from v$dm_ini where para_name='DDL_WAIT_TIME';
行号     PARA_NAME     PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION                              PARA_TYPE
---------- ------------- ---------- --------- --------- ------- ---------- ---------- ---------------------------------------- ---------
1          DDL_WAIT_TIME 10         0         60        N       10         10         Maximum waiting time in seconds for DDLs SESSION

--BOTH修改内存参数
--SP_SET_PARA_VALUE (scope int, paraname varchar(256), value int64)
--scope 1 -memory + parameter file ,2 -parameter file
SQL> SP_SET_PARA_VALUE (1, 'DDL_WAIT_TIME', 11);

--检查发现所有的参数都修改了
行号     SF_GET_SESSION_PARA_VALUE('DDL_WAIT_TIME')
---------- ------------------------------------------
1          11

行号     ID          NAME          TYPE    VALUE SYS_VALUE FILE_VALUE DESCRIPTION                             
---------- ----------- ------------- ------- ----- --------- ---------- ----------------------------------------
1          377         DDL_WAIT_TIME SESSION 11    11        11         Maximum waiting time in seconds for DDLs

行号     PARA_NAME     PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION                              PARA_TYPE
---------- ------------- ---------- --------- --------- ------- ---------- ---------- ---------------------------------------- ---------
1          DDL_WAIT_TIME 11         0         60        N       11         11         Maximum waiting time in seconds for DDLs SESSION


SQL> SP_SET_PARA_VALUE (1, 'DDL_WAIT_TIME', 60);


--session 2
[dmdba@linux_7_mode bin]$ ./disql yz2/oracle1234
SQL>drop table yz1.a;
hang

SQL>  select sess_id,SESS_SEQ,SQL_TEXT,STATE,USER_NAME,TRX_ID,CREATE_TIME,CLNT_HOST,APPNAME from v$sessions where trx_id in (select trx_id from V$LOCK) and SQL_TEXT not like '%select%v$sessions%LOCK%';
行号     SESS_ID              SESS_SEQ    SQL_TEXT                    STATE  USER_NAME TRX_ID               CREATE_TIME                 CLNT_HOST    APPNAME
---------- -------------------- ----------- --------------------------- ------ --------- -------------------- --------------------------- ------------ -------
1          139701126239952      5           insert into a values('cc'); IDLE   YZ1       1848                 2021-11-26 09:07:00.000000  linux_7_mode disql   1314        0
2          139701086817792      24          drop table yz1.a;           ACTIVE YZ2       1849                 2021-11-26 10:20:01.000000  linux_7_mode disql   1314        1


--session 3
[oracle@linux_7_mode bin]$ ./disql yz1/oracle1234
SQL>insert into a values('bb');
hang


select a.*,b.TABLE_ID,b.BLOCKED from 
(
 select sess_id,SESS_SEQ,SQL_TEXT,STATE,USER_NAME,TRX_ID,CREATE_TIME,CLNT_HOST,APPNAME from v$sessions where trx_id in (select trx_id from V$LOCK) and SQL_TEXT not like '%select%v$sessions%LOCK%') a,
 (select * from v$lock where TABLE_ID in(select  table_id from v$lock where BLOCKED='1')) b  
  where a.TRX_ID=b.TRX_ID;

行号     SESS_ID              SESS_SEQ    SQL_TEXT                    STATE  USER_NAME TRX_ID               CREATE_TIME                 CLNT_HOST    APPNAME TABLE_ID    BLOCKED    
---------- -------------------- ----------- --------------------------- ------ --------- -------------------- --------------------------- ------------ ------- ----------- -----------
1          139701126239952      5           insert into a values('cc'); IDLE   YZ1       1848                 2021-11-26 09:07:00.000000  linux_7_mode disql   1314        0
2          139701086817792      24          drop table yz1.a;           ACTIVE YZ2       1849                 2021-11-26 10:20:01.000000  linux_7_mode disql   1314        1
3          139701127375488      21          insert into a values('bb'); ACTIVE YZ1       1842                 2021-11-26 10:15:40.000000  linux_7_mode disql   1314        1

--停止 drop 的操作
call sp_close_session(139701086817792);

SQL> select sess_id,SESS_SEQ,SQL_TEXT,STATE,USER_NAME,TRX_ID,CREATE_TIME,CLNT_HOST,APPNAME from v$sessions where SESS_ID='139701086817792';
未选定行
--会话虽然不存在,但是disql session 展示如下
SQL> drop table yz1.a;

服务器[LOCALHOST:5236]:处于普通打开状态
已连接
--提示处于打开状态!!!


--session 3 执行成功不在有阻塞
SQL> insert into a values('bb');
影响行数 1
已用时间: 00:00:15.957. 执行号:185.


---等待20s session 2
drop table yz1.a;
[-6407]:锁超时.
已用时间: 00:01:02.270. 执行号:0.
也就是说session 2可能会重新重新发起连接,这个操作再次执行!!!


--批量kill session 
SQL> 
SET SERVEROUT ON   
declare
 session_id bigint;
 begin
 select sess_id into session_id from v$sessions where sess_id<>sessid and sql_text like '%drop%';
 print session_id; 
 sp_close_session(session_id);
 end
 /
回答 0
暂无回答
扫一扫
联系客服