Shell:如何对在 SQLPlus 中运行的脚本计时并在 x 分钟后将其杀死?

car*_*ean 2 oracle sqlplus unix

我有一个小工具,它会在发出适当的请求时自动运行一系列 SQL 脚本并输出到 .XLS。但是,一些 SQL 脚本需要在实时数据库上运行,我不希望它们运行超过 5 分钟。

有没有办法 - 在我的 shell 脚本中 - 为脚本的运行时间计时并在 5 分钟后终止它?

提前致谢。

Yas*_*irA 6

在 Oracle 数据库中,您可以使用数据库资源管理器 (DRM) 来管理内存、CPU、时间和其他资源。

通常你的工作流程如下:

  1. 创建资源计划
  2. 创建资源消费者组
  3. 创建资源使用者组映射
  4. 创建资源计划指令

您使用该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)