在MariaDB中读取Oracle的数据

AI火起来了,以我自己可以了,实质中发现,很多东西,要么就是你没有描述清楚,要么就是LLM洗回来的数据都是那样,它压根不知道本质是什么。

老的常规办法,前面没有大问题:
·安装unixODBC及相关开发包

sudo yum install -y unixODBC unixODBC-devel

·安装Oracle Instant Client及ODBC驱动,自己根据服务器版本和官方说明下载,我这里服务器是11g的,InstantClient可以用到19c

这里自己上官网找对应的,一般安装base包、odbc包和tools工具包。
oracle-instantclient19.-basic-.rpm
oracle-instantclient19.-odbc-.rpm
oracle-instantclient19.-sqlplus-.rpm(可选,用于测试连接)

·设置环境变量,在/etc/profile.d/oracle.sh中添加:

export ORACLE_HOME=/usr/lib/oracle/19.9/client64  
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
export TNS_ADMIN=$ORACLE_HOME/network/admin
#这里配置的确保中文不乱码
export NLS_LANG="AMERICAN_AMERICA.UTF8"

·配置Oracle的ODBC驱动

cat /etc/odbcinst.ini 
[Oracle19]
Description = Oracle ODBC driver
Driver      = /usr/lib/oracle/19.9/client64/lib/libsqora.so.19.1 

·配置ODBC数据源

cat /etc/odbc.ini 
[ORACLE_SOURCE]
Driver       = Oracle19  #这里和上面驱动同名
ServerName   = LISSER    #这是定义服务名对应的是TNS里的配置
TNS_ADMIN    = /usr/lib/oracle/19.9/client64/network/admin 

·配置ORACLE的TNS,一般照抄可用的tns配置就行

cat $TNS_ADMIN/tnsnames.ora
LISSER =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

·到此,你应该可以使用SqlPlus 或者 isql 连接上你的服务器

isql -v 数据源的名字ORACLE_SOURCE  你的用户名 你的密码
sqlplus 你的用户@你的tns名LISSER

然后是到折腾Maria了: 下班了待续。

·在MariaDB中创建远程连接表

DROP TABLE IF EXISTS INFO;
CREATE TABLE INFO ENGINE=CONNECT TABLE_TYPE=ODBC
BLOCK_SIZE=50 
CONNECTION='DSN=ORACLE_SOURCE;UID=你的用户名;PWD=你的密码';

为了提高性能,建议把连接表复制到本地中,再使用;同时使用定时任务同步。


MariaDB的问题:

  1. 是否有权限读取到/etc/odbc.ini和/etc/odbcinst.ini文件
  2. 是否单独给MariaDB配置环境变量

1.给配置文件设置可读权限;

2.systemctl edit mariadb
添加下面运行变量,并重启Mariadb服务,这样MariaDB就可以使用DSN来连接Oracle。

[Service]
Environment="TNS_ADMIN=/usr/lib/oracle/19.9/client64/network/admin"
Environment="ORACLE_HOME=/usr/lib/oracle/19.9/client64"

3.如果中文乱码,确认一下MaridDB进程是否有NLS变量且配置编码方式合适系统使用。

ps aux | grep mariadb
grep -a NLS_LANG /proc/(MariaDB进程ID)/environ