在以下两种情况下,您需要更新已部署的库:
-
您已将 Vertica 升级到包含 SDK API 更改的新版本。要使库与新的服务器版本正常使用,您需要使用新版本的 SDK 重新编译这些库。有关详细信息,请参阅UDx 库与新服务器版本的兼容性。
-
您已对 UDx 进行了更改,并且想要部署这些更改。更新 UDx 库之前,您需要确定是否更改了库中包含的任何函数的签名。如果是的话,则在更新库之前,您需要从 Vertica 编录中删除这些函数。
在以下两种情况下,您需要更新已部署的库:
您已将 Vertica 升级到包含 SDK API 更改的新版本。要使库与新的服务器版本正常使用,您需要使用新版本的 SDK 重新编译这些库。有关详细信息,请参阅UDx 库与新服务器版本的兼容性。
您已对 UDx 进行了更改,并且想要部署这些更改。更新 UDx 库之前,您需要确定是否更改了库中包含的任何函数的签名。如果是的话,则在更新库之前,您需要从 Vertica 编录中删除这些函数。
Vertica SDK 定义了一个应用程序编程接口 (Application Programming Interface, API),UDx 可使用该 API 与数据库交互。当开发人员编译其 UDx 代码时,该代码会链接到 SDK 代码以形成一个库。此库仅与支持用于编译该代码的 SDK API 版本的 Vertica 服务器兼容。使用相同 API 版本的库和服务器在二进制级别是兼容的(此兼容性称为“二进制兼容”)。
如果您尝试加载与 Vertica 服务器不具有二进制兼容性的库,服务器会返回错误消息。同样,如果将 Vertica 服务器升级到支持新的 SDK API 的版本,任何依赖新的不兼容库的现有 UDx 会在您向其发出调用时返回错误消息:
ERROR 2858: Could not find function definition
HINT:
This usually happens due to missing or corrupt libraries, libraries built
with the wrong SDK version, or due to a concurrent session dropping the library
or function. Try recreating the library and function
要解决此问题,您必须安装已使用正确的 SDK 版本重新编译的 UDx 库。
新版本的 Vertica 服务器并不总会更改 SDK API 版本。只要 Micro Focus 更改了构成 SDK 的组件,SDK API 版本就会更改。如果 SDK API 在新版本的服务器中未更改,旧库会继续与新服务器兼容。
当 Micro Focus 扩展 SDK 的功能时,SDK API 几乎总是在 Vertica 版本(主要版本、次要版本、服务包)中发生更改。Vertica 绝不会在修补程序补丁中更改 API。
这些策略意味着您必须在主要版本之间升级时更新 UDx 库。例如,如果从版本 10.0 升级到 10.1,则必须更新 UDx 库。
升级 Vertica 服务器之前,应考虑是否存在任何与新版本不兼容的 UDx 库。请参阅新的服务器版本的发行说明,以确定 SDK API 在当前已安装的 Vertica 服务器版本和新版本之间是否已更改。如前文所述,只有从前一个主要版本升级或从某个主要版本的初始发行版升级到某个服务包发行版时,才会导致当前已加载的 UDx 库变为与服务器不兼容。
必须重新编译与新版本 Vertica 服务器不兼容的任何 UDx 库。如果 UDx 库之前是从第三方获取的,您必须检查该库是否已发布新版本。如果是这样,请在升级服务器后部署新版本(请参阅部署 UDx 库的新版本)。
如果 UDx 是您自己开发的(或者如果您有源代码),则您必须执行下列操作:
使用新版本的 Vertica SDK 重新编译 UDx 库。有关详细信息,请参阅编译 C++ 库或编译并打包 Java 库。
部署新版本的库。请参阅部署 UDx 库的新版本。
对包含已部署到 Vertica 数据库的函数的 UDx 库进行更改时,您需要小心操作。部署新版本的 UDx 库时,Vertica 无法确保在该库中定义的函数的签名与已在 Vertica 编录中定义的函数的签名匹配。如果您更改了库中的 UDx 的签名,然后在 Vertica 数据库中更新了该库,则对已更改的 UDx 发出的调用会生成错误。
对 UDx 进行以下任何更改会更改其签名:
更改函数(不包括多态函数)所接受的参数个数,或更改所接受的任何参数的数据类型。
更改任何返回值或输出列的个数或数据类型。
更改 Vertica 用来为函数代码创建实例的工厂类的名称。
更改函数的空值处理行为或可变性行为。
从库中完成移除函数的工厂类。
以下更改不会更改函数的签名,也不要求在更新库之前删除函数。
更改由多态函数处理的参数的个数或类型。Vertica 不会处理用户传递到多态函数的实参。
更改函数所接受的参数的名称、数据类型或个数。函数所接受的参数不由函数签名决定。相反,Vertica 会传递用户包含到函数调用中的所有函数,而函数会在运行时传递这些参数。有关参数的详细信息,请参阅 UDx 参数。
更改由函数执行的任何内部处理。
将新的 UDx 添加到库中
删除签名已更改的任何函数之后,您可以加载新的库文件,然后重新创建已更改的函数。如果未对 UDx 的签名进行任何更改,则您只需在 Vertica 数据库中更新库文件即可,而无需删除或更改函数定义。只要 Vertica 编录中的 UDx 定义与库中的函数的签名匹配,函数调用就可以在更新库之后以透明方式工作。请参阅部署 UDx 库的新版本。
在下列情况下,您需要部署 UDx 库的新版本:
您对库进行了更改,并且现在想要将这些更改应用到 Vertica 数据库。
您已将 Vertica 升级到新版本,并且该新版本的 SDK 与上一个版本不兼容。
部署库的新版本的过程与初始部署相似。
如果要部署在 C++ 或 Java 中开发的 UDx 库,您必须使用当前版本的 Vertica SDK 编译该库。
将 UDx 的库文件(对于在 C++ 中开发的库,此文件是 .so
文件;对于在 Python 中开发的库,此文件是 .py
文件;对于在 Java 中开发的库,此文件是 .jar
文件)或 R 源文件复制到 Vertica 数据库中的主机。
使用 vsql 连接到主机。
如果更改了共享库中任何 UDx 的签名,您必须使用 DROP 语句(例如 DROP FUNCTION 或 DROP SOURCE)删除它们。如果不确定函数的任何签名是否已更改,请参阅确定 UDx 签名是否已更改。
通过 ALTER LIBRARY 语句使用在步骤 1 中复制的文件更新 UDx 库定义。例如,如果要使用 dbadmin 用户主目录中名为 ScalarFunctions-2.0.so
的文件更新名为 ScalarFunctions
的库,请使用以下命令:
=> ALTER LIBRARY ScalarFunctions AS '/home/dbadmin/ScalarFunctions-2.0.so';
更新了 UDx 库定义以使用新版本的共享库之后,使用 UDx 库中的类定义的 UDx 将开始使用新的共享库文件,而不进一步对该文件进行任何更改。
如果在步骤 4 中必须删除任何函数,请使用由库中的工厂类定义的新签名重新创建这些函数。请参阅CREATE FUNCTION 语句。