这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

外部过程

仅限企业模式

外部过程是您可以从 Vertica 内部调用的数据库群集中主机上的脚本或可执行程序。外部过程无法将数据传回给 Vertica。

要实施外部过程,请执行下列操作:

  1. 创建外部过程可执行文件。请参阅外部过程要求

  2. 为该文件启用 set-user-ID (SUID)、用户执行和组执行属性。该文件必须可由 dbadmin 读取,或者必须使用 管理工具 install_procedure 命令提供文件所有者的密码。

  3. 安装外部过程可执行文件

  4. 在 Vertica 中创建外部过程

在 Vertica 中创建过程后,可以执行删除该过程,但无法更改该过程。

1 - 外部过程要求

仅限企业模式

外部过程对其属性(例如,外部过程的存储位置以及对其输出的处理方式)具有相关要求。您还应了解外部过程的资源使用情况。

过程文件属性

过程文件不能由 root 用户拥有。过程文件必须具有 set-user-ID (SUID)、用户执行和组执行属性集。如果过程文件不可由 Linux 数据库管理员用户读取,则必须在安装该过程时指定所有者的密码。

处理过程输出

Vertica 未提供用于处理过程输出的设施。因此,您必须自行安排以处理过程输出,这些安排应包括直接将错误、日志记录信息和程序信息写入到您管理的文件。

处理资源使用情况

Vertica 资源管理器无法识别由外部过程使用的资源。此外,按设计,Vertica 是在系统上运行的唯一一个主要进程。如果外部过程占用大量资源,可能会影响 Vertica 的性能和稳定性。应考虑所创建的外部过程的类型以及何时运行这些外部过程。例如,您可以在非正常工作时间运行资源密集型过程。

示例过程文件

#!/bin/bash
echo "hello planet argument: $1" >> /tmp/myprocedure.log

2 - 安装外部过程可执行文件

仅限企业模式

要安装外部过程,请通过菜单或命令行使用管理工具。

菜单

  1. 运行 管理工具

    $ /opt/vertica/bin/adminTools
    
  2. 在管理工具主菜单 (Main Menu) 上,单击配置菜单 (Configuration Menu),再单击确定 (OK)

  3. 配置菜单 (Configuration Menu) 上,单击安装外部过程 (Install External Procedure),再单击确定 (OK)

  4. 选择要在其上安装外部过程的数据库。

  5. 选择要安装的文件或手动键入完整文件路径,然后单击确定 (OK)

  6. 如果不是超级用户,则会提示您输入密码,然后单击确定 (OK)

    管理工具会自动在数据库中的每个节点上创建 database-name/procedures 目录,并在这些目录中为您安装外部过程。

  7. 单击对话框中的确定 (OK),这表示安装已成功完成。

命令行

如果使用命令行,请务必指定过程文件的完整路径以及拥有该过程文件的 Linux 用户的密码。例如:

$ admintools -t install_procedure -d vmartdb -f /scratch/helloworld.sh -p ownerpassword
Installing external procedure...
External procedure installed

安装外部过程之后,则需要使 Vertica 注意到该过程。要执行此操作,可以使用 CREATE PROCEDURE(外部) 语句,但应先回顾创建外部过程

3 - 创建外部过程

仅限企业模式

安装外部过程后,必须使用 CREATE PROCEDURE(外部) 告知 Vertica 这一情况。

只有超级用户可以创建外部过程,默认情况下,只有他们具有执行权限。但是,超级用户可以向用户和角色授予对存储过程的 EXECUTE 权限。

创建过程后,其元数据将存储在系统表 USER_PROCEDURES 中。用户只能查看他们已获得执行权限的过程。

示例

以下示例将为 helloplanet.sh 外部过程文件创建名为 helloplanet 的过程。此文件接受一个 VARCHAR 实参。示例代码在 外部过程要求 中提供。

=> CREATE PROCEDURE helloplanet(arg1 VARCHAR) AS 'helloplanet.sh' LANGUAGE 'external'
   USER 'dbadmin';

下一个示例将为脚本 copy_vertica_database.sh 创建名为 proctest 的过程。此脚本可将数据库从一个群集复制到另一个群集;该脚本包含在服务器 RPM(位于目录 /opt/vertica/scripts 中)中。

=> CREATE PROCEDURE proctest(shosts VARCHAR, thosts VARCHAR, dbdir VARCHAR)
   AS 'copy_vertica_database.sh' LANGUAGE 'external' USER 'dbadmin';

使外部过程过载

您可以创建具有相同名称的多个外部过程,但前提是这些外部过程具有不同的签名,即接受不同的实参集。例如,可以重载 helloplanet 外部过程,以便同时接受整数值:

=> CREATE PROCEDURE helloplanet(arg1 INT) AS 'helloplanet.sh' LANGUAGE 'external'
   USER 'dbadmin';

执行此语句后,数据库编录将存储两个名为 helloplanet 的外部过程,其中一个外部过程接受 VARCHAR 实参,另一个接受整数。当您调用外部过程时,Vertica 会评估过程调用中的实参以确定要调用的过程。

另请参阅

4 - 执行外部程序

仅限企业模式

使用 CREATE PROCEDURE(外部) 语句定义过程后,可以将其用作 SELECT 语句中的元命令。Vertica 不支持在更复杂的语句或表达式中使用过程。

以下示例将运行名为 helloplanet 的过程:

=> SELECT helloplanet('earthlings');
 helloplanet
-------------
           0
(1 row)

以下示例将运行名为 proctest 的过程。此过程引用 copy_vertica_database.sh 脚本,而该脚本可将数据库从一个群集复制到另一个群集。该脚本由服务器 RPM 安装在 /opt/vertica/scripts 目录中。

=> SELECT proctest(
    '-s qa01',
    '-t rbench1',
    '-D /scratch_b/qa/PROC_TEST' );

过程在启动节点上执行。Vertica 通过将程序分叉并运行程序来运行该过程。每个过程参数作为字符串传递到可执行文件。父分叉进程会等待直至子进程结束。

如果子进程以状态 0 退出,Vertica 会通过返回一行来报告操作发生,如 helloplanet 示例中所示。如果子进程以任何其他状态退出,Vertica 将报告如下错误:

ERROR 7112: Procedure reported: Procedure execution error: exit status = code

要停止执行,请通过从客户端发送取消命令(例如,按 Ctrl+C)来取消该进程。如果过程程序退出并显示错误,将返回带有退出状态的错误消息。

权限

要执行外部过程,用户需要以下权限:

  • 对于过程的 EXECUTE 权限

  • 对于包含该过程的架构的 USAGE 权限

5 - 删除外部过程

仅限企业模式

只有超级用户可以删除外部过程。要从 Vertica 中删除外部过程的定义,请使用 DROP PROCEDURE(外部) 语句。只会移除对过程的引用。外部文件会保留在数据库中每个节点上的 <database>/procedures 目录中。

示例

=> DROP PROCEDURE helloplanet(arg1 varchar);

另请参阅