1.系统环境
[root@hadoop102 etc]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
2. 安装包
unixODBC :2.3.12
freetds:1.4.10
3. 部署步骤
3.1 源码包安装unixODBC
下载最新的unixODBC源码包,下载url:http://www.unixodbc.org
放置目录下,如:/usr/local,然后执行以下命令:
# 需要root权限
[root@hadoop100 software]# tar -xvf unixODBC-2.3.12.tar.gz -C /usr/local
[root@hadoop100 software]# cd /usr/local/unixODBC-2.3.12/
[root@hadoop100 unixODBC-2.3.12]# sudo ./configure --prefix=/usr/local/unixODBC-2.3.12 --includedir=/usr/local/include --libdir=/usr/local/lib --bindir=/usr/bin --sysconfdir=/usr/local/etc
[root@hadoop100 unixODBC-2.3.12]# sudo make && make install
安装目录为/usr/local/unixODBC-2.3.12,安装成功后,unixODBC所需的头文件都被安装到了/usr/local/include下,编译好的库文件安装到了/usr/local/lib 下,与unixODBC相关的可执行文件安装到了/usr/bin下,配置文件放到了/usr/local/etc下。
若./configure编译过程中出现如下错误信息:
configure: error: no acceptable C compiler found in $PATH
需安装gcc组件,命令如下:
yum -y install gcc
# 也可通过二进制安装,命令如下:
yum -y install unixODBC unixODBC-devel
3.2检查unixODBC安装情况
验证安装是否成功
[root@hadoop102 etc]# odbcinst -j
unixODBC 2.3.12
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
3.3 安装FreeTDS
下载freetds-1.4.10,官网地址:http://www.freetds.org/
FreeTDS是unix 和Linux library的一个集合,通过FreeTDS可以连接到MicrosoftSQL Server 和 Sybase DB
执行以下命令:
# 需要root权限
[root@hadoop100 software]# tar -xvf freetds-1.4.10.tar.gz -C /usr/local
[root@hadoop100 software]# cd /usr/local/freetds-1.4.10/
# 查看当前支持的 tdsver 版本,选择对应支持的 MSSQL 版本
[root@hadoop100 freetds-1.4.10]# ./configure --help
--with-tdsver=VERSION TDS protocol version (5.0/7.1/7.2/7.3/7.4/auto)
# 重编译安装,注意 tdsver 版本
[root@hadoop100 freetds-1.4.10]# sudo ./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/unixODBC-2.3.12 --enable-msdblib --with-tdsver=7.4
[root@hadoop100 freetds-1.4.10]# sudo make && make install
安装参数说明
--prefix=/usr/local/freetds FreeTDS的默认安装目录 /usr/local/freetds
--enable-msdblib 允许Microsoft 的函数库
--with-tdsver=7.4 指定TDS的协议版本,不填写则默认5.0版,7.5支持MSSQL2008和MSSQL2014
3.4 检查FreeTDS安装情况
3.4.1直接连接MSSQL数据库
[root@hadoop102 etc]# /usr/local/freetds/bin/tsql -H 172.26.203.210 -p1433 -Usa -Proot
locale is "zh_CN.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1>
2>
3.4.2查看FreeTDS 版本
[root@hadoop102 etc]# /usr/local/freetds/bin/tsql -C
Compile-time settings (established with the "configure" script)
Version: freetds v1.4.10
freetds.conf directory: /usr/local/freetds/etc # (注意这个路径,修改这个文件配置信息)
MS db-lib source compatibility: yes
Sybase binary compatibility: no
Thread safety: yes
iconv library: yes
TDS version: 7.4
iODBC: no
unixodbc: yes
SSPI "trusted" logins: no
Kerberos: no
OpenSSL: no
GnuTLS: no
MARS: yes
3.4.3配置文件连接
修改freetds.conf文件:在 FreeTDS 的配置文件中添加指向具体数据库的访问信息
[root@hadoop102 etc]# vim /usr/local/freetds/etc/freetds.conf
# 添加如下内容:
[localmssql]
host = 172.26.203.210
port = 1433
tds version = 7.4
client charset = UTF-8
连接
[root@hadoop102 etc]# /usr/local/freetds/bin/tsql -S localmssql -U sa -P root
locale is "zh_CN.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1>
3.4.4配置ODBC连接MSSQL
通过odbcinst -j
可以查看配置文件路径:/etc/odbc.ini
、/etc/odbcinst.ini
(有时配置在/usr/local/etc/odbc.ini
、/usr/local/etc/odbcinst.ini
)
在 /etc/odbcinst.ini 中登记FreeTDS驱动
[root@hadoop102 etc]# vim /usr/local/etc/odbcinst.ini
# 添加如下内容:
# Driver from FreeTDS package
# setup from FreeTDS package
# unixodbc驱动名称
[FreeTDS]
# 简介
Description=ODBC of FreeTDS for MS SQL 2008
# 驱动所在位置
Driver=/usr/local/freetds/lib/libtdsodbc.so
在 /etc/odbc.ini 配置MSSQL数据链接信息
[root@hadoop102 etc]# vim /usr/local/etc/odbc.ini
# 添加如下内容:
[ODBC Data Sources]
local= My second Test DSN
[local]
Driver = /usr/local/freetds/lib/libtdsodbc.so
Description = test
Trace = No
Server = 172.26.203.210
Database = Test
Port = 1433
TDS_Version = 7.4
3.4.5测试ODBC链接
[root@hadoop102 etc]# isql -v local sa root
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| echo [string] |
| quit |
| |
+---------------------------------------+
SQL>
4. Doris 使用ODBC访问外部数据源
4.1 修改Doris BE ODBC配置文件
在doris be conf文件夹中找到 dbcinst.ini文件
在文件中添加SQL Server驱动信息
[root@hadoop102 lib]# vim $DORIS_HOME/be/conf/odbcinst.ini
# 添加如下内容:
[SQL Server]
Description = ODBC for SQL Server
Driver = /usr/local/freetds/lib/libtdsodbc.so
Setup = /usr/local/freetds/lib/libtds.so
FileUsage = 1
4.2 不使用Resource方式访问
CREATE EXTERNAL TABLE wb_dim_store4 (
storeid int NOT NULL,
storename varchar(25) NULL,
address varchar(25) NULL,
Maplongitude decimal(18,6) NULL,
Maplatitude decimal(18,6) NULL
) ENGINE=ODBC
COMMENT "ODBC"
PROPERTIES (
"host" = "172.26.203.210",
"port" = "1433",
"user" = "sa",
"password" = "root",
"database" = "Test",
"table" = "dim_store",
"driver" = "SQL Server", -- 注意这里的名称和be下的odbcinst.ini里的SQL Server[]里的名称一致
"odbc_type" = "sqlserver"
);
-- 测试结果
select count(*) from wb_dim_store4;
4.3 通过ODBC_Resource来创建ODBC外表 (推荐使用的方式)
首先创建Resource
CREATE EXTERNAL RESOURCE `sqlserver_odbc`
PROPERTIES (
"type" = "odbc_catalog",
"host" = "172.26.203.210",
"port" = "1433",
"user" = "sa",
"password" = "root",
"database" = "Test",
"driver" = "SQL Server", -- 注意这里的名称和be下的odbcinst.ini里的SQL Server[]里的名称一致
"odbc_type" = "sqlserver"
);
然后创建 ODBC 外表
CREATE EXTERNAL TABLE wb_dim_store5 (
storeid int NOT NULL,
storename varchar(25) NULL,
address varchar(25) NULL,
Maplongitude decimal(18,6) NULL,
Maplatitude decimal(18,6) NULL
) ENGINE=ODBC
COMMENT "ODBC"
PROPERTIES (
"odbc_catalog_resource" = "sqlserver_odbc",
"database" = "Test",
"table" = "dim_store"
);
-- 测试结果
select count(*) from wb_dim_store5;
5. 问题
5.1 查询外部表报错
select count(*) from wb_dim_store5;
假如查询上述外部表报以下错误,并且/usr/local/freetds/lib/libtdsodbc.so这个文件存在且已授权777
1064 - errCode = 2, detailMessage = driver connect Error: 01000 [unixODBC][Driver Manager]Can't open lib '/usr/local/freetds/lib/libtdsodbc.so' : file not found (0)
可以使用 ldd 命令来查看库文件的依赖项是否有问题
[root@hadoop102 lib]# ldd /usr/local/freetds/lib/libtdsodbc.so
linux-vdso.so.1 => (0x00007ffd039aa000)
libodbc.so.2 => not found
libodbcinst.so.2 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f720a697000)
libc.so.6 => /lib64/libc.so.6 (0x00007f720a2c9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f720ab25000)
# 这个输出表明 libtdsodbc.so 在加载时缺少一些依赖的动态链接库。
# 具体来说,它提示缺少 libodbc.so.2 和 libodbcinst.so.2
# 因此需要重新安装unixODBC
[root@hadoop102 lib]# yum install unixODBC
# yum install -y unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel
# 检查unixODBC安装情况
[root@hadoop102 lib]# 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
# 重新生成链接库缓存: 重新生成链接库缓存,以确保系统能够找到新安装的库
[root@hadoop102 lib]# ldconfig
[root@hadoop102 lib]# ldd /usr/local/freetds/lib/libtdsodbc.so
linux-vdso.so.1 => (0x00007ffd00930000)
libodbc.so.2 => /lib64/libodbc.so.2 (0x00007eff06fa3000)
libodbcinst.so.2 => /lib64/libodbcinst.so.2 (0x00007eff06d91000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007eff06b75000)
libc.so.6 => /lib64/libc.so.6 (0x00007eff067a7000)
libltdl.so.7 => /lib64/libltdl.so.7 (0x00007eff0659d000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007eff06399000)
/lib64/ld-linux-x86-64.so.2 (0x00007eff0747d000)
# 依赖性没有出现not found即可
因为重新安装了unixODBC,需要重新配置一下odbc.ini
、odbcinst.ini
这两个文件
在 /etc/odbc.ini 配置MSSQL数据链接信息
在 /etc/odbcinst.ini 中登记FreeTDS驱动