[Linux] 기타 : WSL + MSSQL + FreeTDS
0단계: 예비 – 리눅스 실습을 위한 환경 만들기
본 시리즈에서는 생존형 리눅스 명령어에 대해서 다룹니다. 자유로운 개발을 하면서 알게 된 생존 리눅스 시작합니다.
꼭 읽어야 할 사람만 읽으세요!
이번 글은 WSL + MSSQL + FreeTDS 연동 가이드입니다.
로컬(Windows)에서는 Python과 MSSQL이 잘 붙었는데, 서버(Linux) 배포 시 ODBC 드라이버가 없다고 자꾸 에러에 시달렸습니다. 이 문제를 해결하려고 FreeTDS + pyodbc + ODBC설정이라는 번거로운 조합을 써야만 했습니다.
이 글은 저처럼 MSSQL + Python + Linux 조합에서 연결 때문에 고생한 사람들을 위한 생존형 가이드입니다. MySQL만 쓰신다면 이 글은 굳이 안봐도 됩니다.
FreeTDS와 MSSQL이 뭔가요?
MSSQL이란?
MSSQL은 Microsoft에서 만든 관계형 데이터베이스 시스템(RDBMS)입니다. Windows 환경에서 가장 널리 사용되는 DB 중 하나이며, .NET, C#, ASP.NET 등 마이크로소프트 생태계와의 궁합이 아주 좋습니다.
FreeTDS란?
FreeTDS는 Linux에서 MSSQL에 접속하기 위한 드라이버입니다. MS에서 만든 공식 드라이버는 Windows에 최적화되어 있고, Linux에서는 이를 직접적으로 연결할 방법이 별로 없었죠.
그래서 나온 것이 FreeTDS입니다:
- MSSQL과 통신할 수 있는 TDS (Tabular Data Stream) 프로토콜을 구현해줍니다.
- ODBC 방식으로 접근할 수 있게 도와줍니다.
- Python (pyodbc), isql/tsql, 등에서 이 드라이버를 사용해 MSSQL과 연결할 수 있습니다.
개발 환경에서는 pyodbc만 써도 잘 붙어요. 하지만 운영 서버가 리눅스일 경우, MSSQL 드라이버가 아예 설치돼 있지 않거나 버전이 맞지 않아 연결이 안 되는 경우가 많습니다.
(번외) 운영 서버가 리눅스여야 하나요?
운영 서버가 리눅스인 경우가 많긴 하지만, 아래와 같은 상황에선 Windows 서버도 자주 사용됩니다.
상황 | 설명 |
사내 인프라가 전부 Windows 기반일 때 | AD(Active Directory), IIS, .NET, MSSQL 등 마이크로소프트 기술 스택에 맞춰 통합 관리하는 경우 |
정부·공공기관 | 일부 보수적인 환경에서는 보안/감사 목적 및 정책상 Windows Server를 고수하기도 합니다 |
기존에 구축된 시스템이 모두 Windows에서 돌아갈 때 | 변경 비용이 크기 때문에 계속 유지 |
Visual Basic, C#, ASP.NET 웹사이트 등과 직접 연결할 경우 | Windows 환경이 개발과 배포에 더 최적화돼 있음 |
리눅스를 쓰면 좋은 이유는?
그럼에도 불구하고 많은 운영 서버가 Linux 기반인 이유는 다음과 같습니다:
- 라이선스 비용이 없음 (오픈소스)
- 서버 자원 사용이 적음 (경량)
- 자동화 및 쉘 스크립트 활용이 쉬움
- 컨테이너(Docker), CI/CD, 클라우드와의 궁합이 뛰어남
- 대부분의 DevOps 툴들이 리눅스 위주로 최적화됨
FreeTDS 설치 및 설정 가이드 (Ubuntu 22.04)
FreeTDS 설치
1. 필수 패키지 설치
sudo apt update
sudo apt install -y freetds-bin freetds-dev unixodbc unixodbc-dev tdsodbc odbcinst odbcinst1debian2
설치되는 주요 패키지는 다음과 같습니다.
- freetds-bin → FreeTDS 기본 실행 파일
- freetds-dev → FreeTDS 개발 라이브러리
- unixodbc → ODBC 지원 패키지
- unixodbc-dev → ODBC 개발용 패키지
- tdsodbc → FreeTDS ODBC 드라이버
- odbcinst → ODBC 드라이버 관리 도구
- pyodbc → Python용 ODBC 드라이버
FreeTDS 버전 확인
tsql -C
정상 출력 예시
Compile-time settings (established with the "configure" script)
Version: freetds v1.3.6
freetds.conf directory: /etc/freetds
FreeTDS 설정 파일 (/etc/freetds/freetds.conf)
1. FreeTDS 설정 파일 수정
sudo nano /etc/freetds/freetds.conf
2. MSSQL 서버 정보 추가
[my_mssql]
host = 211.***.**.***
port = ****
tds version = 7.3
host와 port는 MSSQL 서버 환경에 맞게 설정을 바꿔주셔야 합니다.
저장 후 종료 (Ctrl + O → Enter → Ctrl + X)
앞으로 나오는 저장 후 종료는 위 방식으로 통일됩니다.
FreeTDS ODBC 드라이버 확인
1. FreeTDS ODBC 드라이버 파일 위치를 확인해줍시다.
find /usr -name "libtdsodbc.so"
출력 예시
/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
파일이 없으면 수동으로 설치를 진행합니다.
sudo apt install -y tdsodbc
그래도 없으면 심볼릭 링크를 생성해줍시다.
sudo ln -s /usr/lib/x86_64-linux-gnu/libtdsodbc.so.0 /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
다시 확인
ls -l /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
ODBC 드라이버 설정 (/etc/odbcinst.ini)
1. ODBC 드라이버 설정 파일을 수정해야합니다.
sudo nano /etc/odbcinst.ini
2. ODBC 드라이버를 등록해줍시다.
[FreeTDS]
Description = FreeTDS Driver for MSSQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
저장 후 종료
ODBC 드라이버 등록 확인!
sudo odbcinst -i -d -f /etc/odbcinst.ini
odbcinst -q -d
FreeTDS 가 출력되면 정상입니다!
ODBC DSN 설정 (/etc/odbc.ini)
DSN을 설정하면 편리하게 데이터베이스에 연결할 수 있습니다.
sudo nano /etc/odbc.ini
[my_mssql]
Driver = FreeTDS
Description = MSSQL 2008 R2 DB
Server = 211.****.**.***
Port = ****
Database = some_db
TDS_Version = 7.3
저장 후 종료
FreeTDS 연결 테스트
1. FreeTDS로 MSSQL 직접 연결 (tsql 테스트)
FreeTDS가 잘 설치되고, MSSQL과 직접 통신이 되는지 테스트합니다. tsql은 FreeTDS 자체 테스트 도구입니다.
tsql -S my_mssql -U some_db_name -P '비밀번호'
- tsql: FreeTDS에서 제공하는 CLI 도구 (SQL 입력 가능한 터미널 느낌)
- -S: freetds.conf에 설정한 [my_mssql] 이름
- -U: DB 사용자명
- -P: DB 비밀번호
성공하면 SQL Prompt 출력
1> SELECT @@VERSION;
2> GO
이렇게 쿼리를 날릴 수 있는 SQL 프롬프트가 뜨면 연결 성공입니다!
ODBC를 이용한 MSSQL 연결 테스트
1. ODBC 직접 연결 (isql 테스트)
ODBC 드라이버가 FreeTDS를 통해 MSSQL과 통신이 가능한지 확인해봅시다. isql은 ODBC 설정이 정상 작동하는지 확인해줍니다.
isql -v my_mssql some_db_name '비밀번호'
- isql: ODBC 테스트용 CLI 도구
- -v: verbose (더 자세한 메시지 출력)
- my_mssql: odbc.ini에서 등록한 DSN 이름
정상 연결 시
+----------------------+
| Connected! |
+----------------------+
위 메시지가 뜨면 ODBC와 MSSQL도 연결 성공입니다!
Python 연동 테스트 (pyodbc)
이제 Python에서 MSSQL에 연결해 실제 데이터를 쿼리할 수 있는지 테스트해봅시다.
import pyodbc
conn = pyodbc.connect(
'DRIVER={FreeTDS};'
'SERVER=211.***.**.***;'
'PORT=****;'
'DATABASE=some_db;'
'UID=some_name;'
'PWD=비밀번호;'
'TDS_Version=7.3;'
)
cursor = conn.cursor()
cursor.execute("SELECT @@VERSION;")
print(cursor.fetchone())
conn.close()
- pyodbc.connect(...) 안에 ODBC 정보를 직접 문자열로 넣은 값입니다.
- DRIVER={FreeTDS}로 지정했기 때문에 FreeTDS가 필요해요.
- @@VERSION: 현재 연결된 MSSQL의 버전 정보를 출력하는 SQL 문.
출력값이 나오면 연결 성공!
MSSQL의 버전 문자열 출력됩니다. (예: Microsoft SQL Server 2019...)
최종 점검 리스트
점검 항목 명령어 정상 동작 조건
FreeTDS 설치 확인 | tsql -C | FreeTDS 버전 정보 출력 |
ODBC 드라이버 확인 | odbcinst -q -d | FreeTDS 출력 |
FreeTDS 설정 확인 | cat /etc/freetds/freetds.conf | 서버 정보 포함 |
MSSQL 연결 테스트 (FreeTDS) | tsql -S my_mssql -U some_db -P '비밀번호' | SQL Prompt 출력 |
MSSQL 연결 테스트 (ODBC) | isql -v my_mssql some_db '비밀번호' | Connected! 출력 |
Python 연동 테스트 | python script.py | SQL 결과 출력 |
이제 FreeTDS를 통해 MSSQL과의 연결이 완벽하게 완료되었습니다!ㅜㅜ
여기까지 따라오신 여러분, 고생하셨습니다. MSSQL + Python + Linux 조합은 흔하지 않고, 공식 문서도 빈약하며, 에러 메시지도 전혀 친절하지 않습니다.
"로컬에서는 되는데 서버에서는 왜 안 돼?" 같은 현상에 멘탈이 갈리셨다면 저도 같은 경험을 했습니다.
그래서 이 글은 누군가의 고통을 줄이기 위한 생존 가이드입니다.
이제 당신은 pyodbc + FreeTDS의 혼돈 속에서 살아남으실 수도 있는 사람입니다.
혹시 이 글이 도움이 되셨다면, 같은 조합으로 고생하고 있을 동료에게 이 문서를 슬쩍 공유해주세요.
우리는 많진 않지만... 적어도 혼자는 아닙니다.
언제나처럼 — 시작은 삽질이지만, 끝은 지식입니다.