达梦DBLINK之DM访问Oracle配置步骤

达梦通过DBLINK访问Oracle数据库有两种方式一种是通过Oracle oci接口,一种是通过ODBC数据源的方式。

一、下载Oracle客户端驱动(Instant Client)

下载地址:Oracle Instant Client Downloads

下载下面两个包

二、检查操作系统环境

  • 主要在DM数据库主机上进行环境检查

1、检查glibc版本

复制代码
rpm -qi glibc

2、检查是否有安装libaio包

csharp 复制代码
[root@localhost ~]# rpm -qa|grep libaio 
libaio-0.3.109-13.el7.x86_64

三、使用 oci接口 方式来进行配置

  • 主要在DM数据库主机上进行安装

1、解压安装Oracle Instant Client包

bash 复制代码
mkdir -p /opt/oracle

解压压缩包

python 复制代码
unzip instantclient-basic-linux-arm64.zip
unzip instantclient-odbc-linux-arm64.zip
ls -l instantclient_19_19

2、配置环境变量

-添加到/etc/ld.so.conf.d目录下

bash 复制代码
echo /opt/oracle/instantclient_19_19 > /etc/ld.so.conf.d/oracle-instantclient.conf

配置LD_LIBRARY_PATH环境变量

修改dmdba用户下的.bash_profile文件,添加如下内容

bash 复制代码
su - dmdba
vi .bash_profile
-- 添加当前变量
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/oracle/instantclient_19_19"
source .bash_profile

查看:

env 或者env |grep LD_LIBRARY_PATH

3、重启数据库加载Oracle OCI驱动

复制代码
./DmServiceDMSERVER restart 

4、创建外部连接

- 注意用户名全大写

sql 复制代码
CREATE OR REPLACE LINK "SYSDBA"."LINKORA" CONNECT 'ORACLE' WITH "SYSTEM" IDENTIFIED BY "******" USING '10.8.148.17:1528/ORCLPDB1';

5、创建测试表

SYSTEM 模式下创建表

- 注意创建的表名最好全大写

sql 复制代码
CREATE TABLE "SYSTEM"."TREE01" 
   (	"COLUMN_1" CHAR(10) DEFAULT NULL
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM";

测试查询

sql 复制代码
select * from TREE01@LINKORA

四、 通过ODBC数据源进行访问

1、安装ODBC驱动包

下载 odbc驱动包,下载地址

ruby 复制代码
tar -zxvf unixODBC-2.3.9.tar.gz
cd unixODBC-2.3.9
./configure --enable-gui=no
make
make install

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

odbcinst -j

源码编译安装完成之后,还需要检查oracle odbc的依赖是否正常。

有的时候,将操作系统yum安装的unixODBC卸载之后,可能会导致Oracle的odbc动态库缺少依赖库。如下:

ini 复制代码
[root@localhost instantclient_19_13]# ldd libsqora.so.19.1 
	linux-vdso.so.1 =>  (0x00007ffeef3cd000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007ffafac45000)
	libm.so.6 => /lib64/libm.so.6 (0x00007ffafa943000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffafa727000)
	libnsl.so.1 => /lib64/libnsl.so.1 (0x00007ffafa50d000)
	librt.so.1 => /lib64/librt.so.1 (0x00007ffafa305000)
	libaio.so.1 => /lib64/libaio.so.1 (0x00007ffafa103000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007ffaf9ee9000)
	libclntsh.so.19.1 => /opt/oracle/instantclient_19_13/libclntsh.so.19.1 (0x00007ffaf5d76000)
	libclntshcore.so.19.1 => /opt/oracle/instantclient_19_13/libclntshcore.so.19.1 (0x00007ffaf57d2000)
	libodbcinst.so.2 => not found        ###这里缺少依赖
	libc.so.6 => /lib64/libc.so.6 (0x00007ffaf5404000)
	/lib64/ld-linux-x86-64.so.2 (0x00007ffafb103000)
	libnnz19.so => /opt/oracle/instantclient_19_13/libnnz19.so (0x00007ffaf4d92000)

所以在源码编译安装完成之后,需要将/usr/local/lib或者使用find命令查找系统上相关的库文件将对应路径目录加入到LD_LIBRARY_PATH系统环境变量,或者添加到 /etc/ld.so.conf.d目录下指定的配置文件中,如下:

csharp 复制代码
[root@localhost ~]# echo /usr/local/lib > /etc/ld.so.conf.d/libodbc.conf 
[root@localhost ~]# ldconfig

(2)yum安装,配置好yum源之后直接安装即可

typescript 复制代码
[root@localhost ~]# yum install -y unixODBC unixODBC-devel
[root@localhost ~]# odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

2、配置ODBC数据源

1、配置tnsnames.ora,并配置TNS_ADMIN系统环境变量

ini 复制代码
[root@localhost ~]# cat /opt/oracle/instantclient_19_13/network/admin/tnsnames.ora
DB10 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.10)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

###配置TNS_ADMIN系统环境变量
[root@localhost ~]# vim /etc/profile    ---添加下面export
export TNS_ADMIN=/opt/oracle/instantclient_19_13/network/admin

[root@localhost ~]# source /etc/profile

2、配置odbcinst.ini

ini 复制代码
[Oracle ODBC1919]
Description     = Oracle ODBC Driver
Driver          = /opt/oracle/instantclient_19_19/libsqora.so.19.1
Setup           =
FileUsage       =
CPTimeout       =
CPReuse         = 

3、配置odbc.ini

ini 复制代码
[ORA11]                ---主要配置项
DSN = ORA11            ---主要配置项
Driver = Oracle ODBC1913   ---主要配置项(odbcinst.ini中的驱动配置名称)
ServerName = DB10    ---主要配置项  (tnsnames.ora网络服务名)
UserID = 
AggregateSQLType = FLOAT
Application Attributes = T
Attributes = W
BatchAutocommitMode = IfAllSuccessful
BindAsFLOAT = F
CacheBufferSize = 20
CloseCursor = F
DisableDPM = F
DisableMTS = T
DisableRULEHint = T
EXECSchemaOpt =
EXECSyntax = T
Failover = T
FailoverDelay = 10
FailoverRetryCount = 10
FetchBufferSize = 64000
ForceWCHAR = F
LobPrefetchSize = 8192
Lobs = T
Longs = T
MaxLargeData = 0
MaxTokenSize = 8192
MetadataIdDefault = F
QueryTimeout = T
ResultSets = T
SQLGetData extensions = F
SQLTranslateErrors = F
StatementCache = F
Translation DLL =
Translation Option = 0
UseOCIDescribeAny = F

4、测试ODBC访问Oracle数据库

yaml 复制代码
[dmdba@localhost ~]$ isql -v ORA11 scott oracle
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select * from emp;
+-------+-----------+----------+-------+--------------------+----------+----------+-------+
| EMPNO | ENAME     | JOB      | MGR   | HIREDATE           | SAL      | COMM     | DEPTNO|
+-------+-----------+----------+-------+--------------------+----------+----------+-------+
| 7369  | SMITH     | CLERK    | 7902  | 1980-12-17 00:00:00| 800      |          | 20    |
| 7499  | ALLEN     | SALESMAN | 7698  | 1981-02-20 00:00:00| 1600     | 300      | 30    |
| 7521  | WARD      | SALESMAN | 7698  | 1981-02-22 00:00:00| 1250     | 500      | 30    |
| 7566  | JONES     | MANAGER  | 7839  | 1981-04-02 00:00:00| 2975     |          | 20    |
| 7654  | MARTIN    | SALESMAN | 7698  | 1981-09-28 00:00:00| 1250     | 1400     | 30    |
| 7698  | BLAKE     | MANAGER  | 7839  | 1981-05-01 00:00:00| 2850     |          | 30    |
| 7782  | CLARK     | MANAGER  | 7839  | 1981-06-09 00:00:00| 2450     |          | 10    |
| 7839  | KING      | PRESIDENT|       | 1981-11-17 00:00:00| 5000     |          | 10    |
| 7844  | TURNER    | SALESMAN | 7698  | 1981-09-08 00:00:00| 1500     | 0        | 30    |
| 7900  | JAMES     | CLERK    | 7698  | 1981-12-03 00:00:00| 950      |          | 30    |
| 7902  | FORD      | ANALYST  | 7566  | 1981-12-03 00:00:00| 3000     |          | 20    |
| 7934  | MILLER    | CLERK    | 7782  | 1982-01-23 00:00:00| 1300     |          | 10    |
+-------+-----------+----------+-------+--------------------+----------+----------+-------+
SQLRowCount returns -1
12 rows fetched
SQL> select * from t1;
+---------------------+-----------------------------------------+----+-----------------------------------------+
| NAME                | AGE                                     | SEX| GRADE                                   |
+---------------------+-----------------------------------------+----+-----------------------------------------+
| ??                  | 18                                      | ?  | 1000                                    |
+---------------------+-----------------------------------------+----+-----------------------------------------+
SQLRowCount returns -1
1 rows fetched
SQL> 

###可以看到上面中文会显示乱码,主要与客户端字符集环境有关

3、使用ODBC数据源创建DBLINK访问Oracle

DBLINK创建语法:

sql 复制代码
create link "LINKODBC1" connect 'ODBC' with "SCOTT" identified by "oracle" using 'ORA11';

测试:

sql 复制代码
[dmdba@localhost ~]$ cd $DM_HOME/bin
[dmdba@localhost bin]$ ./disql
disql V8
username:
password:

Server[LOCALHOST:5236]:mode is normal, state is open
login used time : 3.101(ms)

/***创建DBLINK***/
SQL> create link "LINKODBC1" connect 'ODBC' with "SCOTT" identified by "oracle" using 'ORA11';
executed successfully
used time: 7.763(ms). Execute id is 800.

SQL> select * from t1@linkodbc1;

LINEID     NAME AGE SEX GRADE
---------- ---- --- --- -----
1          ??   18  ?   1000

used time: 678.249(ms). Execute id is 801.
SQL> 
---上面中文问号是由于数据库启动时未加载NLS_LANG环境变量导致,
需要在配置NLS_LANG环境变量并生效后重启数据库后可以正常显示

五、总结

DM DBLINK使用Oracle OCI方式和ODBC数据源的方式创建访问Oracle数据库,通过简单的测试对比发现,使用Oracle OCI方式兼容性等都要更好。

使用Oracle OCI方式,如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动后,才能正常使用DBLINK。

使用ODBC数据源方式,如果目的表数据有中文,那么需要在DM数据库服务器上配置正确的NLS_LANG环境变量并生效后在当前窗口重启DM数据库。

通过测试对比,建议使用Oracle OCI方式来创建DM DBLINK访问Oracle数据库。

更多资讯请上达梦技术社区了解:eco.dameng.com

相关推荐
星辰离彬16 分钟前
Java 与 MySQL 性能优化:MySQL连接池参数优化与性能提升
java·服务器·数据库·后端·mysql·性能优化
超级小忍29 分钟前
Spring Boot 与 Docker 的完美结合:容器化你的应用
spring boot·后端·docker
麦兜*2 小时前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud
程序员爱钓鱼4 小时前
Go语言实战案例-读取用户输入并打印
后端·google·go
Livingbody7 小时前
基于【ERNIE-4.5-VL-28B-A3B】模型的图片内容分析系统
后端
你的人类朋友9 小时前
🍃Kubernetes(k8s)核心概念一览
前端·后端·自动化运维
追逐时光者10 小时前
面试第一步,先准备一份简洁、优雅的简历模板!
后端·面试
慕木兮人可10 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器
发粪的屎壳郎10 小时前
ASP.NET Core 8 轻松配置Serilog日志
后端·asp.net·serilog