暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

【ORACLE】在ORACLE数据库中启用机器学习功能(OML)以支持PYTHON脚本的运行

原创 DarkAthena 2021-10-12
1674

前言

在 oracle 数据库 21C(20C)版本中,ORACLE数据库加入了机器学习功能,叫OML,全称(Oracle machine learning),并且加入了对python语言的支持,组件名叫 oml4py。这个组件是部署在数据库服务器端,然后有客户端,可使用python连接数据库进行机器学习操作,并且支持在oracle数据库存储中创建管理python脚本并运行它。这样,我们可以通过这个功能,给ORACLE数据库添加python函数。以下内容根据oracle官网多篇文档翻译整合加本人实测遇坑优化而来,目前各种搜索引擎都搜不到完整的安装使用用例。

一、安装数据库并启动

官方安装包
https://www.oracle.com/database/technologies/oracle-database-software-downloads.html

安装这个就不细说了,可以自行下载安装,也可以直接使用docker(我之后会考虑做个已安装相关特性的docker镜像出来)

二、安装python

https://docs.oracle.com/en/database/oracle/machine-learning/oml4py/1/mlpug/build-and-install-python-linux-premises-databases.html

以下是在数据库所在操作系统上操作,
这python版本要求太高了,yum上还没有这个版本,所以只能自己编译

  1. 去python官网下载 3.9.5 版本的tgz文件 wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz
  2. 解压
  3. 进入 Python-3.9.5 目录
  4. 安装依赖包
yum install libffi-devel yum install openssl-devel yum install tk-devel yum install xz-devel yum install zlib-devel
复制
  1. 编译安装python,“PREFIX”替换为你要安装的目标路径
./configure --enable-shared --prefix=PREFIX make clean; make make altinstall
复制

这里如果编译报错 gcc: internal compiler error: Killed (program cc1),是操作系统内存不足引起的,尝试增加内存或者使用swap交换分区

  1. 设置环境变量
export PYTHONHOME=PREFIX export PATH=$PYTHONHOME/bin:$PATH export LD_LIBRARY_PATH=$PYTHONHOME/lib:$LD_LIBRARY_PATH
复制

官方这步操作让人疑惑,这个不是临时环境变量么?安装python最后一步设置个环境变量有毛用?建议自行设置系统环境变量
然后官方还提醒,如果python运行找不到命令,就再设置个软链接

cd PREFIX/bin ln -s python3.9 python3
复制

既然设置了这个,不把pip3也设置上去?

ln -s pip3.9 pip3
复制

三、安装python依赖包

https://docs.oracle.com/en/database/oracle/machine-learning/oml4py/1/mlpug/install-required-supporting-packages-linux-premises-databases.html

pip3 install numpy pip3 install pandas pip3 install scipy pip3 install matplotlib pip3 install cx_Oracle pip3 install scikit-learn
复制

这几个包是官方说的,我总觉得可能少了

四、安装OML4Py服务端到数据库

https://docs.oracle.com/en/database/oracle/machine-learning/oml4py/1/mlpug/install-oml4py-server-linux-premises-oracle-database-21c.html

输入sas回车进入sqlplus

SQL> spool install.txt SQL> alter session set container=PDB1; SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL; SQL> @$ORACLE_HOME/oml4py/server/pyqcfg.sql define permtbl_value = SYSAUX --> Specify a permanent tablespace for the PYQSYS schema define temptbl_value = TEMP --> Specify a temporary tablespace define orahome_value = /u01/app/oracle/product/21.3.0.0/dbhome_1 --> Specify the ORACLE_HOME directory define pythonhome = /opt/Python-3.9.5 --> Specify the PYTHON_HOME directory
复制

这段是官方提供的,把最下面两个参数修改成符合自己的。
我有点疑惑,又是先跑脚本,再声明变量?反正我跑脚本是没有报错,也试了在脚本后面空格接参数。

五、在数据库中测试

https://docs.oracle.com/en/database/oracle/machine-learning/oml4py/1/mlpug/pyqeval-function.html

--创建一个简单的python函数 BEGIN sys.pyqScriptCreate('pyqFun1', 'func = lambda: "Hello World from a lambda!"', FALSE, TRUE); -- V_GLOBAL, V_OVERWRITE END; / --查询用户创建的python函数列表,这里注意使用oci7的客户端会报错,要使用oci8 SELECT name, script, description, cdate from USER_PYQ_SCRIPTS; --执行python函数 SELECT name, value FROM table(pyqEval(NULL, 'XML', 'pyqFun1')); --返回 NAME VALUE ---- -------------------------------------------------- <root><str>Hello World from a lambda!</str></root> --删除python函数 BEGIN sys.pyqScriptDrop('pyqFun1'); END; /
复制

image.png

如果提示 ORA-06598: INHERIT PRIVILEGES 权限不足,试着先执行一次

GRANT INHERIT PRIVILEGES ON USER SYS TO PUBLIC;
复制

支持传入参数,支持以值、行、表的形式返回结果,
更多例子详见
https://docs.oracle.com/en/database/oracle/machine-learning/oml4py/1/mlpug/sql-embedded-python-execution1.html

六、最后

最后的最后,不要在生产环境使用21c!按大佬的说法,目前19c才是长期版本,下一个长期版本会是23c。

最后修改时间:2021-11-14 02:04:28
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论