BLOG main image
분류 전체보기 (65)
Ubuntu (6)
Laravel (2)
VMware (2)
Unix (2)
OpenSuse (2)
수영 (51)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2017. 8. 3. 20:06

4줄요약:

서버 환경: Ubuntu 14.04, freetds 0.91, PHP5, MSSQL

오류 발생: 가끔 SQLSTATE[01002] Adaptive Server connection failed (severity 9)

원인 찾기: 오류시에 log 남겨서, 오류 발생 확률(0.5%) 및 오류메세지 확인.

문제 해결: freetds 버전업 (ubuntu PPA 버전 사용)

 

1. 오류 발생:

 일상적인 오류 였으면, 쉽게 발견되었을 건인데.

 나중에 통계 내어 보니. 0.5% 확률로 발생하는 오류여서, 늦게 발견이 되었다.

 오류메세지

 "SQLSTATE[01002] Adaptive Server connection failed (severity 9)"

 

2. 오류 기록:

 일시적인 것인지? 아니면 주기적인 것인지? 일단 log 를 남기기로 하였다.

<?php
$directoryName = '웹디렉토리가 아닌 디렉토리';
$fileName = $directoryName . 'log.txt';
if (is_writable($directoryName)) {
        #echo '디렉토리 쓰기 가능';
        $url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        if (filter_var($url, FILTER_VALIDATE_URL)) {
                #echo "좋은 URL";
                $fileContent = date("Ymd_His") . ' ' . $url . ' ' . $e->getMessage() . "\n";
                file_put_contents($fileName, $fileContent, FILE_APPEND | LOCK_EX);
        } else {
                echo "나쁜 URL";
        }

} else {
        echo '디렉토리 쓰기 불가';
}
?>

 

오류 발생시에는

/웹디렉토리가 아닌 디렉토리/log.txt 파일에 아래와 같이 기록이 남게 함.

20170701_205408 오류발생한URL 오류메세지

 

3. 오류 통계

오류가 매일 조금이지만 로그에 남았다.

오류 로그에 남은 URL을 웹로그 파일에서 카운트해 보니.

대략 0.5% 확률로 오류가 꾸준히 발생하고 있었다.

 

4. 오류 상세내역

/etc/freetds/freetds.conf 설정파일에서

디버깅 로그를 활성화.

dump file = /tmp/freetds.log

 

아래의 오류를 확인함.
dblib.c:7981:20017: "Unexpected EOF from the server"
dblib.c:8002:"Unexpected EOF from the server", client returns 2 (INT_CANCEL)

 

 

5. 오류 해결 찾기

구글링 해본 대략적인 해결 방안은 

MS에서 새로 나온 PHP-MSSQL드라이버를 쓰기

PHP5 mssql 옵션 변경

freetds 최신버전업 등의 글이 보였다.

 

freetds changelog 에 나온 mssql 관련 내용을 보고.

--------------------------------------------------

Author: Frediano Ziglio <freddy77@gmail.com>
Date:   Tue May 2 23:26:24 2017 +0100

    Fix very big login packet using MSSQL

    If login packet is really big to split into multiple TDS packets
    and is encrypted MSSQL only encrypt the first TDS packet, the others
    are not encrypted.

--------------------------------------------------
freetds 버전업을 해보기로 함.

 

6. freetds 버전업 결정

 ubuntu 14.04 : freetds 0.91-5

 ubuntu 16.04 : freetds 0.91-6

 2017년 5월 2일 이후 버전으로 설치를 해야하는데.

 ftp://ftp.freetds.org/pub/freetds/stable/ 에서 날짜를 보니

 freetds-1.00.38 이후 버전을 설치를 해야함.

 

 소스설치 보다는 Ubuntu PPA버전으로 설치를 해보기로 함.

 

7. freetds PPA 설치

-----Ubuntu 14.04, 16.04-----

add-apt-repository ppa:jamiewillis/freetds #저장소추가
apt-get update
apt-get remove freetds-bin #기존 0.91버전 삭제
apt-get install freetds # PPA freetds 1.0.44설치
apt-get -o Dpkg::Options::="--force-overwrite" install freetds #Man페이지 강제덮어쓰기

 

/etc/freetds.conf 에 설정추가
client charset = UTF-8
dump file = /tmp/freetds.log
connect timeout = 5

service apache2 restart
웹페이지 접속 및
/tmp/freetds.log 에서 버전 확인

 

8. 확인

 몇일이 지났는데, 0.5% 확률로 발생하던 오류가 1건도 나지 않았다.

 Ubuntu 14.04 또는 16.04에서 기본 freetds 0.91버전을 MSSQL과 사용하는 분들은

 1.00.38이후의 freetds 버전으로 업그레이드 하는 것이 좋을 것 같다.

'Ubuntu' 카테고리의 다른 글

LVM  (0) 2022.05.28
dkms module fail status remove build install  (0) 2017.09.15
IPTIME A2000UA Ubuntu 16.04 Linux dkms  (0) 2017.08.04
ubuntu geoip php 설치  (0) 2015.09.10
ubuntu 14.04 apt-get kernel upgrade  (0) 2015.09.07