仅限企业模式
外部过程是您可以从 Vertica 内部调用的数据库群集中主机上的脚本或可执行程序。外部过程无法将数据传回给 Vertica。
要实施外部过程,请执行下列操作:
仅限企业模式
外部过程对其属性(例如,外部过程的存储位置以及对其输出的处理方式)具有相关要求。您还应了解外部过程的资源使用情况。
过程文件不能由 root 用户拥有。过程文件必须具有 set-user-ID (SUID)、用户执行和组执行属性集。如果过程文件不可由 Linux 数据库管理员用户读取,则必须在安装该过程时指定所有者的密码。
Vertica 未提供用于处理过程输出的设施。因此,您必须自行安排以处理过程输出,这些安排应包括直接将错误、日志记录信息和程序信息写入到您管理的文件。
Vertica 资源管理器无法识别由外部过程使用的资源。此外,按设计,Vertica 是在系统上运行的唯一一个主要进程。如果外部过程占用大量资源,可能会影响 Vertica 的性能和稳定性。应考虑所创建的外部过程的类型以及何时运行这些外部过程。例如,您可以在非正常工作时间运行资源密集型过程。
#!/bin/bash
echo "hello planet argument: $1" >> /tmp/myprocedure.log
仅限企业模式
要安装外部过程,请通过菜单或命令行使用管理工具。
运行 管理工具。
$ /opt/vertica/bin/adminTools
在管理工具主菜单 (Main Menu) 上,单击配置菜单 (Configuration Menu),再单击确定 (OK)。
在配置菜单 (Configuration Menu) 上,单击安装外部过程 (Install External Procedure),再单击确定 (OK)。
选择要在其上安装外部过程的数据库。
选择要安装的文件或手动键入完整文件路径,然后单击确定 (OK)。
如果不是超级用户,则会提示您输入密码,然后单击确定 (OK)。
管理工具会自动在数据库中的每个节点上创建
database-name/procedures
目录,并在这些目录中为您安装外部过程。
单击对话框中的确定 (OK),这表示安装已成功完成。
如果使用命令行,请务必指定过程文件的完整路径以及拥有该过程文件的 Linux 用户的密码。例如:
$ admintools -t install_procedure -d vmartdb -f /scratch/helloworld.sh -p ownerpassword
Installing external procedure...
External procedure installed
安装外部过程之后,则需要使 Vertica 注意到该过程。要执行此操作,可以使用 CREATE PROCEDURE(外部) 语句,但应先回顾创建外部过程。
仅限企业模式
安装外部过程后,必须使用 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 会评估过程调用中的实参以确定要调用的过程。
仅限企业模式
使用 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 权限
仅限企业模式
只有超级用户可以删除外部过程。要从 Vertica 中删除外部过程的定义,请使用 DROP PROCEDURE(外部) 语句。只会移除对过程的引用。外部文件会保留在数据库中每个节点上的 <database>/procedures
目录中。
=> DROP PROCEDURE helloplanet(arg1 varchar);