为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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
/
这个测试测试了很多次,kill session之后,并不像oracle 会将session的记录全部终止; 咱们这个dm7测试发现,session 1 insert不提交;session 2 drop 阻塞源头; session 3 业务正常insert被session 2阻塞。 kill session 2之后,session 3可以正常读写; 但是 session2 的v$session SESS_ID找不到了!!! 但是session 2竟然报出了LOCK TMOUT这说明在后台这个session并未结束。 并且这种场景我还模拟了session1 commit; 发现kill session2 在被杀之后,还能执行drop table的操作????