car*_*ean 2 oracle sqlplus unix
我有一个小工具,它会在发出适当的请求时自动运行一系列 SQL 脚本并输出到 .XLS。但是,一些 SQL 脚本需要在实时数据库上运行,我不希望它们运行超过 5 分钟。
有没有办法 - 在我的 shell 脚本中 - 为脚本的运行时间计时并在 5 分钟后终止它?
提前致谢。
在 Oracle 数据库中,您可以使用数据库资源管理器 (DRM) 来管理内存、CPU、时间和其他资源。
通常你的工作流程如下:
您使用该DBMS_RESOURCE_MANAGER.CREATE_PLAN
过程创建计划。计划名称是唯一必需的参数:
DBMS_RESOURCE_MANAGER.CREATE_PLAN('myplan');
Run Code Online (Sandbox Code Playgroud)
然后根据需要使用DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP
以下命令创建资源使用者组:
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
consumer_group => 'limit_5_min'
, comment => 'users with 5 minute execution time limit');
Run Code Online (Sandbox Code Playgroud)
创建必要的资源消费者组后,您可以DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING
根据会话属性定义资源消费者组映射,以便将新的和现有的会话自动分配给适当的资源消费者组:
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
attribute => DBMS_RESOURCE_MANAGER.CLIENT_OS_USER
, value => 'spongebob'
, consumer_group => 'limit_5_min');
Run Code Online (Sandbox Code Playgroud)
此映射会将 OS 用户发起的所有会话分配给spongebob
之前创建的资源使用者组。您可以使用许多其他属性将会话映射到消费者组,例如ORACLE_USER
. 有关DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING_PRI
可用属性的完整列表,请参阅过程参数表。
现在是最重要的部分。您将创建管理用户资源使用的资源计划指令。您可以使用该DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE
过程来创建指令。让我们创建限制会话执行时间的指令:
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => 'myplan'
, group_or_subplan => 'limit_5_min'
, switch_time => 300
, switch_group => 'KILL_SESSION');
Run Code Online (Sandbox Code Playgroud)
该指令意味着从操作系统用户创建spongebob
并执行超过 300 秒(5 分钟)的每个会话都将被 DRM 自动终止。
您还需要授予用户权限以使用DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP
过程切换到适当的资源消费者组,否则映射将不起作用:
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
grantee_name => 'scott'
, consumer_group => 'limit_5_min'
, grant_option => false);
Run Code Online (Sandbox Code Playgroud)