프린트 하기

OS환경 : Oracle Linux 7.6, Windows Server 2012 (64bit)


DB 환경 : Oracle Database 12.1.0.2, SQL Server 2012


방법 : Oracle Linux 7.6 에 12c R1에서 Windows Server 2012 에 SQL Server 2012 로 db 링크

이기종 DB간 연동을 해야하는 경우가 있을 수 있음

오라클 타db로 연동을 하기위해선 Oracle Gateway라는 유료 소프트웨어를 이용하거나

무료로 연동을 하는 방법 두가지가 존재함

유료 소프트웨어를 사용하는 경우에 추후 문제가 발생할 경우 당연히 오라클의 지원을 받을 수 있지만

무료로 연동하는 경우에는 추후 문제가 발생하여도 오라클에서 지원을 받기 힘듦

이런 부분을 인지하고 사용해야함



MS ODBC를 사용하는 방법과 FreeTDS를 사용하는 방법 두가지를 설명함

Linux의 경우 MS ODBC를 사용하면 되지만 Unix의 경우 MS ODBC가 따로 없기 때문에 FreeTDS를 사용해야함

테스트 결과 MS ODBC를 사용하는 방법으로는 OS에서 tsql, isql 명령으로 접근하는것만 성공하고

db링크를 통해 연결하는 방법은 성공하지 못함 (MS ODBC)로 표시해둔 내용은 하지 않아도됨

db링크 연결은 FreeTDS를 사용하는 방법만 설명함



환경 정보

Oracle Linux 7.6 + Oracle Database 12.1.0.2 서버 호스트명, IP : oel7, 192.168.137.50

Windows Server 2012 + SQL Server 2012 서버 호스트명, IP : WIN-P5KNTBRVB79, 192.168.137.12



샘플 데이터 생성(Windows)

SQL Server Management Studio 실행



SQL Server 인증 선택 후 sa 계정으로 로그인



쿼리 입력 후 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL>
BEGIN TRANSACTION
GO
CREATE TABLE dbo.table_1
     (
      cola int NULL
     )
GO
INSERT INTO dbo.table_1
values (1)
INSERT INTO dbo.table_1
values (1)
GO
COMMIT;



메세지에 1개 행이 영향을 받음이 나오면 제대로 데이터가 들어간 것

왼쪽 개체 탐색기 - 새로고침 버튼 선택



해당 테이블 데이터 조회 

정상적으로 cola 컬럼에 1, 1 데이터가 나오는것을 확인할 수 있음

1
2
SQL>
select * from table_1;



OS 환경 설정(Windows)

odbc 데이터 원본(64비트) 실행



시스템 DSN - 추가



SQL Server 선택 - 마침



이름 지정 ms2012(odbc에서 연결지정할 이름)

서버 선택



해당 서버 선택



확인 후 다음



사용자가 입력한 로그인 ID 및 암호를 사용하는 SQL Server 인증 사용 선택

추가 구성 옵션의 기본 설정을 얻기 위해 SQL Server에 연결 선택 후 ID/PW 입력



기본 데이터베이스를 다음으로 변경에 

필요한 데이터베이스 선택



마침



요약 확인 후 데이터 원본 테스트



성공 확인 후 확인 선택



확인



시스템 DSN에 [ms2012 64비트 SQL Server]이 생성된것을 확인가능



SQL Server 구성 관리자 실행



SQL Server 네트워크 구성 - MS2012에 대한 프로토콜 - TCP/IP 선택



프로토콜 확인



IP 주소 탭에서 IP1(현재 서버IP)에 사용, 활성 모두 예 확인



OS 환경 설정(Linux)

Linux에서 unixODBC 설치(공통)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# yum install unixODBC*
Loaded plugins: langpacks, ulninfo
ol7_UEKR5                                                                                                                             | 2.5 kB  00:00:00     
ol7_latest                                                                                                                            | 2.7 kB  00:00:00     
packages-microsoft-com-prod                                                                                                           | 3.0 kB  00:00:00     
(1/2): ol7_latest/x86_64/updateinfo                                                                                                   | 2.9 MB  00:00:00     
(2/2): ol7_latest/x86_64/primary_db                                                                                                   |  34 MB  00:00:01     
Resolving Dependencies
--> Running transaction check
---> Package unixODBC.x86_64 0:2.3.1-14.0.1.el7 will be updated
--> Processing Dependency: libesoobS.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libmimerS.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libnn.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libodbcdrvcfg1S.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libodbcdrvcfg2S.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libodbcminiS.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libodbcnnS.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libodbctxtS.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: liboplodbcS.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: liboraodbcS.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libsapdbS.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libtdsS.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: libtemplate.so.2()(64bit) for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
--> Processing Dependency: unixODBC(x86-64) = 2.3.1-14.0.1.el7 for package: unixODBC-devel-2.3.1-14.0.1.el7.x86_64
---> Package unixODBC.x86_64 0:2.3.7-1.rh will be an update
--> Running transaction check
---> Package unixODBC-devel.x86_64 0:2.3.1-14.0.1.el7 will be updated
---> Package unixODBC-devel.x86_64 0:2.3.7-1.rh will be an update
--> Finished Dependency Resolution
 
Dependencies Resolved
 
=============================================================================================================================================================
 Package                              Arch                         Version                           Repository                                         Size
=============================================================================================================================================================
Updating:
 unixODBC                             x86_64                       2.3.7-1.rh                        packages-microsoft-com-prod                       213 k
Updating for dependencies:
 unixODBC-devel                       x86_64                       2.3.7-1.rh                        packages-microsoft-com-prod                        42 k
 
Transaction Summary
=============================================================================================================================================================
Upgrade  1 Package (+1 Dependent package)
 
Total download size: 255 k
Is this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for packages-microsoft-com-prod
(1/2): unixODBC-devel-2.3.7-1.rh.x86_64.rpm                                                                                           |  42 kB  00:00:00     
(2/2): unixODBC-2.3.7-1.rh.x86_64.rpm                                                                                                 | 213 kB  00:00:00     
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                        300 kB/| 255 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : unixODBC-2.3.7-1.rh.x86_64                                                                                                                1/4 
warning: /etc/odbc.ini created as /etc/odbc.ini.rpmnew
warning: /etc/odbcinst.ini created as /etc/odbcinst.ini.rpmnew
  Updating   : unixODBC-devel-2.3.7-1.rh.x86_64                                                                                                          2/4 
  Cleanup    : unixODBC-devel-2.3.1-14.0.1.el7.x86_64                                                                                                    3/4 
  Cleanup    : unixODBC-2.3.1-14.0.1.el7.x86_64                                                                                                          4/4 
  Verifying  : unixODBC-devel-2.3.7-1.rh.x86_64                                                                                                          1/4 
  Verifying  : unixODBC-2.3.7-1.rh.x86_64                                                                                                                2/4 
  Verifying  : unixODBC-devel-2.3.1-14.0.1.el7.x86_64                                                                                                    3/4 
  Verifying  : unixODBC-2.3.1-14.0.1.el7.x86_64                                                                                                          4/4 
 
Updated:
  unixODBC.x86_64 0:2.3.7-1.rh                                                                                                                               
 
Dependency Updated:
  unixODBC-devel.x86_64 0:2.3.7-1.rh                                                                                                                         
 
Complete!



Linux에서 설치 확인(공통)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ODBC Manager Driver 정보 확인
# isql --version
unixODBC 2.3.7
 
ODBC Manager 정보 확인
# odbcinst -j
unixODBC 2.3.7
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



Linux에서 Sql Server 용 ODBC 설치(MS ODBC)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   193  100   193    0     0    558      0 --:--:-- --:--:-- --:--:--   559
 
# yum install msodbcsql17 -y
Loaded plugins: langpacks, ulninfo
packages-microsoft-com-prod                                                                                                           | 3.0 kB  00:00:00     
packages-microsoft-com-prod/primary_db                                                                                                | 288 kB  00:00:00     
Resolving Dependencies
--> Running transaction check
---> Package msodbcsql17.x86_64 0:17.5.2.1-1 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
=============================================================================================================================================================
 Package                            Arch                          Version                           Repository                                          Size
=============================================================================================================================================================
Installing:
 msodbcsql17                        x86_64                        17.5.2.1-1                        packages-microsoft-com-prod                        802 k
 
Transaction Summary
=============================================================================================================================================================
Install  1 Package
 
Total download size: 802 k
Installed size: 2.3 M
Downloading packages:
warning: /var/cache/yum/x86_64/7Server/packages-microsoft-com-prod/packages/msodbcsql17-17.5.2.1-1.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID be1229cf: NOKEY
Public key for msodbcsql17-17.5.2.1-1.x86_64.rpm is not installed
msodbcsql17-17.5.2.1-1.x86_64.rpm                                                                                                     | 802 kB  00:00:00     
Retrieving key from https://packages.microsoft.com/keys/microsoft.asc
Importing GPG key 0xBE1229CF:
 Userid     : "Microsoft (Release signing) <gpgsecurity@microsoft.com>"
 Fingerprint: bc52 8686 b50d 79e3 39d3 721c eb3e 94ad be12 29cf
 From       : https://packages.microsoft.com/keys/microsoft.asc
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
The license terms for this product can be downloaded from
https://aka.ms/odbc17eula and found in
/usr/share/doc/msodbcsql17/LICENSE.txt . By entering 'YES',
you indicate that you accept the license terms.
 
Do you accept the license terms? (Enter YES or NO)
yes [YES 입력]
  Installing : msodbcsql17-17.5.2.1-1.x86_64                                                                                                             1/1 
  Verifying  : msodbcsql17-17.5.2.1-1.x86_64                                                                                                             1/1 
 
Installed:
  msodbcsql17.x86_64 0:17.5.2.1-1                                                                                                                            
 
Complete!



Linux에서 mssql-tools 설치(MS ODBC)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# yum install mssql-tools -y
Loaded plugins: langpacks, ulninfo
No package ACCEPT_EULA=Y available.
Resolving Dependencies
--> Running transaction check
---> Package mssql-tools.x86_64 0:17.5.2.1-1 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
=============================================================================================================================================================
 Package                            Arch                          Version                           Repository                                          Size
=============================================================================================================================================================
Installing:
 mssql-tools                        x86_64                        17.5.2.1-1                        packages-microsoft-com-prod                        223 k
 
Transaction Summary
=============================================================================================================================================================
Install  1 Package
 
Total download size: 223 k
Installed size: 710 k
Downloading packages:
mssql-tools-17.5.2.1-1.x86_64.rpm                                                                                                     | 223 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
The license terms for this product can be downloaded from
http://go.microsoft.com/fwlink/?LinkId=746949 and found in
/usr/share/doc/mssql-tools/LICENSE.txt . By entering 'YES',
you indicate that you accept the license terms.
 
Do you accept the license terms? (Enter YES or NO)
yes
  Installing : mssql-tools-17.5.2.1-1.x86_64                                                                                                             1/1 
  Verifying  : mssql-tools-17.5.2.1-1.x86_64                                                                                                             1/1 
 
Installed:
  mssql-tools.x86_64 0:17.5.2.1-1                                                                                                                            
 
Complete!



Linux에서 프로파일에 적용(MS ODBC)

1
2
3
# echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
# echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
# . ./.bash_profile 



FreeTDS 다운로드

FreeTDS는 이기종간 연결을 위한 유닉스와 리눅스용 라이브러리의 집합임

http://www.freetds.org/index.html 공식홈페이지 접속



오른쪽에 있는 Stable Release (1.2.3)을 눌려서 파일 다운로드 후 서버에 업로드



FreeTDS 설치

1
2
3
4
5
# tar -xvf freetds-1.2.3.tar.gz 
# cd freetds-1.2.3/
# ./configure -prefix=/usr/local/freetds -enable-msdblib -with-gnu-ld
# make
# make install

make 시 warning: ~~ 이 발생해도 무시하고 make install 진행



freetds.conf 파일 설정

아래 내용 최하단에 추가

1
2
3
4
5
6
# vi /usr/local/freetds/etc/freetds.conf
[ms2012]
host = 192.168.137.12 # MsSQL Server IP Address
port = 1433 # MsSQL Server Port
tds version = 8.0
client charset = UTF-8



freetds tsql 정상 동작 확인

예시

1
/usr/local/freetds/bin/tsql -S <freetds.conf에서 정한이름> -U 계정 -'패스워드'


실사용

1
2
3
4
5
6
7
8
9
10
11
/usr/local/freetds/bin/tsql -S ms2012 -U sa -'dnls1!'
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> select * from table_1;
2> go
cola
1
1
(2 rows affected)
1> quit

1, 2, 3, 4.... 계속숫자가 올라가지 않고 1> 에서 멈춰서 텍스트를 입력할 수 있으면 정상

테이블 조회도 정상적으로 가능함



[MS ODBC 드라이버 사용 시]

odbcinst.ini 파일 확인(MS ODBC)

1
2
3
4
5
# cat /etc/odbcinst.ini 
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1
UsageCount=1

이 파일에 나와있는 [ODBC Driver 17 for SQL Server] 를 아래 odbc.ini의 Driver = 부분에 정확하게 입력해줘야함



odbc.ini 파일 설정(MS ODBC)

1
2
3
4
5
6
# vi /etc/odbc.ini
[ms2012]
Description = ms2012 CONNECTION
Driver = ODBC Driver 17 for SQL Server
Servername = ms2012
Database = master



isql 정상 동작 확인(MS ODBC)

예시

1
/usr/bin/isql -<odbc.ini_파일에_설정한_이름(ms2012)> <mssql접속계정> <'패스워드'>


실사용(MS ODBC)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# /usr/bin/isql -v ms2012 sa 'dnls1!'
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select * from table_1;
+------------+
| cola       |
+------------+
| 1          |
| 1          |
+------------+
SQLRowCount returns 0
2 rows fetched

쿼리 입력된다면 정상



[FreeTDS ODBC 드라이버 사용 시 (unix 의 경우 MS ODBC가 없기 때문에 FreeTDS를 사용해야함]

odbcinst.ini 파일 확인

1
2
3
4
5
# cat /etc/odbcinst.ini 
[FreeTDS]
Description=FreeTDS 8.0
Driver=/usr/local/freetds/lib/libtdsodbc.so
FileUsage=1

이 파일에 나와있는 [FreeTDS] 를 아래 odbc.ini의 Driver = 부분에 정확하게 입력해줘야함



odbc.ini 파일 설정

1
2
3
4
5
6
# vi /etc/odbc.ini
[ms2012]
Description = ms2012 CONNECTION
Driver = FreeTDS
Servername = ms2012
Database = master



isql 정상 동작 확인

예시

1
/usr/bin/isql -<odbc.ini_파일에_설정한_이름(ms2012)> <mssql접속계정> <'패스워드'>


실사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# /usr/bin/isql -v ms2012 sa 'dnls1!'
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select * from table_1;
+------------+
| cola       |
+------------+
| 1          |
| 1          |
+------------+
SQLRowCount returns 0
2 rows fetched

쿼리 입력된다면 정상



오라클 환경설정

아래 작업부터는 oracle 계정으로 접속 후 작업

$ORACLE_HOME/hs/admin/init 파일 설정

1
2
3
4
5
6
$ vi $ORACLE_HOME/hs/admin/initms2012.ora
HS_FDS_CONNECT_INFO = ms2012
HS_FDS_TRACE_LEVEL = off
HS_FDS_SHAREABLE_NAME = /usr/local/freetds/lib/libtdsodbc.so
HS_LANGUAGE = AMERICAN_AMERICA.KO16MSWIN949
set ODBCINI=/etc/odbc.ini



리스너 파일 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ vi $ORACLE_HOME/network/admin/listener.ora
LISTENER =
 (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=oel7)(PORT=1521)) #host=현재 oracle db서버 hostname
 )
 
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (ORACLE_HOME = /app/oracle/product/121/db_1)
      (SID_NAME = oracle12)
    )
    (SID_DESC =
      (ORACLE_HOME = /app/oracle/product/121/db_1)
      (SID_NAME = ms2012)
      (PROGRAM = dg4odbc)
    )
  )

11번째 줄 : 기존 인스턴스 부분은 수정필요 없음

15번째 줄 : 위에서 설정한 ODBC 인스턴스명



tnsnames.ora 파일 설정

1
2
3
4
5
6
7
$ vi $ORACLE_HOME/network/admin/tnsnames.ora
ms2012_tns =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =(SID = ms2012))
    (HS = OK)
  )



tnsping 체크

1
2
3
4
5
6
7
8
9
10
11
12
$ tnsping ms2012_tns
 
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 19-JUL-2020 19:13:32
 
Copyright (c) 19972014, Oracle.  All rights reserved.
 
Used parameter files:
 
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA =(SID = ms2012)) (HS = OK))
OK (0 msec)

정상적으로 OK 가 나옴



DB Link 생성

1
2
3
SQL> create database link msserver connect to "sa" identified by "dnls1!" using 'ms2012_tns';
 
Database link created.

ms 유저이름 및 패스워드는 쌍따옴표 "", 연결할 tns는 따옴표 ''로 입력



쿼리 조회 테스트

1
2
3
4
5
6
SQL> select * from "table_1"@msserver;
 
      cola
----------
     1
     1

정상조회됨



접속 불가시 DEBUG 기능 활용

hs/admin/init 파일 수정

1
2
3
4
5
6
$ vi $ORACLE_HOME/hs/admin/initms2012.ora
HS_FDS_CONNECT_INFO = ms2012
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_SHAREABLE_NAME = /usr/local/freetds/lib/libtdsodbc.so
HS_LANGUAGE = AMERICAN_AMERICA.KO16MSWIN949
set ODBCINI=/etc/odbc.ini

trace level을 debug로 설정 시 db링크로 접속 시도할 때마다

$ORACLE_HOME/hs/log/에 로그가 발생함



정상 접속

1
2
3
4
5
6
SQL> select * from "table_1"@msserver;
 
      cola
----------
     1
     1



정상 접속 시 DEBUG 로그



테스트를 위해 freetds.conf에 있는 tds version을 8.0에서 7.4로 변경

1
2
3
4
5
6
# vi /usr/local/freetds/etc/freetds.conf
[ms2012]
host = 192.168.137.12 # MsSQL Server IP Address
port = 1433 # MsSQL Server Port
tds version = 7.4
client charset = UTF-8



리스너 재기동

1
2
$ lsnrctl stop
$ lsnrctl start



비정상 접속

1
2
3
4
5
6
SQL> select * from "table_1"@msserver;
select * from "table_1"@msserver
              *
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
ORA-02063: preceding line from MSSERVER

ORA 메세지 발생



비정상 접속 시 DEBUG 로그

DEBUG 로 접속 불가 원인을 파악해볼 수 있음



참조 : 

https://docs.microsoft.com/ko-kr/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15

https://closed0402.tistory.com/29

https://closed0402.tistory.com/31

https://idchowto.com/?p=3701

Doc. 232482.1, 561033.1, 2312814.1
https://m.blog.naver.com/222503/220759218490

https://positivemh.tistory.com/630