侧边栏壁纸
  • 累计撰写 129 篇文章
  • 累计创建 13 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

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

DarkAthena
2021-10-11 / 0 评论 / 0 点赞 / 1905 阅读 / 10281 字

前言

在 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

六、最后

谁成功了告诉我一下,我努力照这个说明把前几步都成功完成了,就是最后一步执行python函数时报错,先报


ORA-20000: PyQuery error
ImportError: 

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy c-extensions failed.
- Try uninstalling and reinstalling numpy.
- If you have already done that, then:
  1. Check that you expected to use Python3.9 from "",
     and that you have no directories in your PATH or PYTHONPATH that can
     interfere with the Python and numpy version "1.18.1" you're trying to use.
  2. If (1) looks fine, you can open a new issue at
     https://github.com/numpy/numpy/issues.  Please include details on:
     - how you installed Python
     - how you installed numpy
     - your operating system
     - whether or not you have multiple versions of Python installed
     - if you built from source, your compiler versions and ideally a build log

- If you're working with a numpy git repository, try `git clean -xdf`
  (removes all files not under version control) and rebuild numpy.

Note: this error has many possible causes, so please don't comment on
an existi...

libgfortran.so.3: cannot open shared object file: No such file or directory

然后马上再执行一次,报

ORA-20000: PyQuery error NameError: name 'plt' is not defined

继续执行就都是这个错,
但如果新开一个会话,再执行,又报第一次出现的错,再执行,又报第二次出现的错

总感觉这玩意应该是和服务器上的python联系上了,但好像又没找对地方。

还有自行编译的python,感觉也很怪异,前面pip3 install都装得好好的,后面再想装其他包,就找不到lib了,我感觉还可能是我使用的docker镜像有问题,偷懒直接用了第三方的docker镜像,改天尝试自己再装一个吧,手里没linux机器。。。

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

20211114更新

重新自己用ORACLE LINUX 8安装了21c,做成了docker,并微调了官方的安装脚本(脚本里直接强制指定参数的值),终于执行成功了
image.png

但是安装脚本中最后一个调用的文件pyqatmlcfg.sql,导入机器学习模型imp不成功,一开始我是把docker的数据库文件挂载到了windows本地,查询dba_directories时就报错

ORA-12801: error signaled in parallel query server P000
ORA-48189: OS command to create directory failed

然后我又尝试不挂载,结果在执行这段时报错

dbms_data_mining.import_model(
  filename => 'automl_metamodels.dmp',
  directory => 'DATA_PUMP_DIR',
  model_filter => 'ALL',
  operation =>'IMPORT',
  remote_link => null,
  jobname => import_job_name,
  schema_remap => 'PYQUSER:PYQSYS',
  tablespace_remap => 'PYQUSER:&perm_tbl');

ERROR at line 1:
ORA-40223: data mining model import failed, job name=OML4PY_IMPORT_4,
error=ORA-39001: invalid argument value
ORA-06512: at line 40
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.DBMS_DM_EXP_INTERNAL", line 618
ORA-06512: at "SYS.DBMS_DATA_MINING", line 5635
ORA-06512: at line 17

为了弄这个环境,我反反复复从编译python起,来了好多次,yum网速贼慢,而且pip install那几个模块,每次都是以building wheel的方式安装的,装一个就要等好几分钟,下次争取直接提前做到docker里去,这玩意太磨人了(2021-11-30原因已找到,是18c禁用了软连接目录,我这个环境的DATA_PUMP_DIR目录对应的是个软连接目录,把目录修改成真实对应的目录就行了【ORACLE】有关18c的一个很多文章都没提到的安全方面的变更-禁止软链接

20211115 更新

支持oml4py的dockerfile的地址
https://github.com/Dark-Athena/dockerfile/tree/main/ol8_21_oml4py

官方给的"@$ORACLE_HOME/oml4py/server/pyqcfg.sql" 这条执行命令有误,应该为

@$ORACLE_HOME/oml4py/server/pyqcfg.sql SYSAUX TEMP $PYTHON_HOME

其中$PYTHON_HOME为python安装的路径,如果不传参数,则Oracle会以$ORACLE_HOME/python作为python主目录

20211119 更新

其实官方有更简单的oml4py的安装方式,就是用DBCA配置,

dbca -slient -configureDatabase -sourceDB pdb1 -configureOML4PY -sysDBAPassword SysPassword1 -sysDBAUserName SYS

或

dbca -slient -configurePluggableDatabase  -pdbName pdb1 -sourceDB cdb1 -configureOML4PY -sysDBAPassword SysPassword1 -sysDBAUserName SYS

因为oracle已经把python3.9.5的绿色版放在了ORACLE_HOME目录下,而且相关的模块也已经安装。
但实测,
第一种装完后无法执行python函数,和我第一次报错一样
第二种安装时提示[FATAL] [DBT-15311] Container database is not configured with OML4Py.

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
博主关闭了所有页面的评论