繁体   English   中英

Oracle - 如何并行执行此脚本

[英]Oracle - How to execute this script in parallel

我有一个脚本可以杀死 Oracle 中的所有会话:

declare
begin
for rec in (
SELECT username,machine,sid,serial#,inst_id from gv$session where type <> 'BACKGROUND' 
and sid <> (select sys_context('userenv','sid') from dual) and status <> 'KILLED'
and username not in ('SYSRAC','SYS')
) 
loop
execute immediate 'alter system disconnect session '''|| rec.sid|| ',' || rec.serial# || ',@' ||rec.inst_id||''' immediate';
end loop;
end;
/

每月一次,我需要杀死所有 session,然后执行几个脚本来添加/删除/修改列、授予和撤销、创建新对象、删除对象等。

这个数据库通常有超过 2000 个连接,当我执行这个脚本时,需要 15 到 20 分钟才能终止所有会话。 如何并行执行此脚本并更快地终止所有会话?

有一些东西要吸收那里...

  1. 2000 个连接听起来有点矫枉过正,特别是如果你要杀死所有这些连接,这表明它们都属于同一个应用程序。 我会检查您的连接池统计信息以确保这不是太多。

  2. 可能值得检查基于版本的重新定义以允许在没有任何停机时间的情况下进行部署

  3. 如果您无论如何都要杀死所有东西,只需关闭中止/启动即可完成

  4. 如果您真的想终止这些会话,那么您可以使用 DBMS_PARALLEL_EXECUTE 让作业调度程序同时运行这些会话。

但是退一步来看看这里的全貌,因为通常我们不会杀死所有会话来部署代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM