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

前言

在 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;
/ 

在这里插入图片描述

如果提示 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。

おすすめ

転載: blog.csdn.net/wwwwwwgame/article/details/120715127