Background Image
나머지...
2017.12.07 14:19

Y2K38, "UNIX Millennium Bug"

조회 수 889 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

시작하며

당신은 소프트웨어 엔지니어 입니까.  정보시스템 매니저 입니까, 아니면 평범한 회사원 입니까?

당신이 무엇을 하던지간에 50세 이하라면 당신은 Y2K Millennium Bug를 만나실 수 있습니다.


1990년대 후반의 Y2K 이슈

1990년대 후반에 전 세계가 떠들석했던 이슈가 있었는데 연도를 2자리로 표기해서 생긴 “Y2K”입니다. 

1997-12-23이 아니라 97-12-23 형태로 말입니다. 

90년대 이전 대부분의 정보시스템은 연도를 ‘1997’과 같이 4자리로 표기하지 않고 ‘97’과 같이 2자리로 표현했는데, 

이런 관행이 정보시스템이 2000년과 1900년을 구분을 못하는 문제의 원인이 되었던 것이지요. 

2000년 10월 23일에 태어난 신생아의 주민등록번호는 001023로 시작되는데 이것은 1900년에 태어난 100살의 노인도 마찬가지 입니다, 

주민번호가 고유하지 않을 가능성이 생긴 것입니다. 

정보시스템에서는 치명적이라 할 수 있지요. 

온 세계의 정보 시스템 관리자가 자기의 시스템에서 사용하는 날짜가 4자리로 되어있는지 검사하고 감리하느라고 분주했고 “Y2K 비즈니스”라는 사업분야가 생길 정도였습니다. 

Y2K의 위력에 버금가는 아니 그것보다 클 수 있는 이슈가 Y2K38 Unix Millennium Bug라고  할 수 있습니다. 물론 20년이나 남았지만 말입니다. 


Linux의 시간 정보 보관 방법

32bit 정수를 시간을 표현하기 위한 자료구조(time_t)로 사용하는 Linux 시스템에서, 시간 정보는 ‘2017-12-07 09:11:24’과 같은 문자열 형태로 보관하기도 하지만 

정보시스템 내부 용도로 ‘1512605484’과 같은 정수형 숫자를 많이 사용합니다. 

이 정수형 숫자의 의미는 ‘1970-01-01 00:00:00’부터 현재까지 경과된 초(seconds)를 의미합니다. 

1970-01-01 자정에서 ‘1512605484’ 초가 경과한 날짜는 ‘2017-12-07 09:11:24’라는 의미입니다. 

날짜 계산을 많이 하는 정보시스템은 시간을 정수로 보관하는 것이 저장 용량이나 처리 시간을 고려할 때 훨씬 유리하기 때문에 내부의 자료구조등에서 이러한 방법을 많이 사용합니다.


Y2K38 소개

32bit time_t를 사용하는 Linux 시스템은 32bit 정수에 시간 정보를 보관하는데 

32bit의 정수의 최대치는 2,147,483,647이고 1970-01-01 자정에서 ‘2,147,483,647’초가 경과된 날짜는 ‘2038-01-19 03:14:07’입니다. 

이것이 32bit로 표현할 수 있는 날짜의 한계입니다. 

그러면 여기서 1초가 지나면 정보시스템은 어떻게 될까요? 

2038-01-19 03:14:08 이 정상이나 32bit 연산의 오버플로우가 발생되어 ‘-2,147,483,648’ 이 되고, 

이것을 그대로 문자열 형의 날짜로 바꾸면 1901-12-13 20:45:52가 된다는 것입니다.


아래는 일본의 어느 강좌에서 사용한 Sample C 프로그램 입니다. 

seq가 2까지는 정상 시간을 출력하다가 seq가 3일때, 정수의 최대치를 초과하면서 예상 못한 결과가 출력됩니다. 

Code를 이해할 필요는 없으나 우리가 예상하지 못하는 결과가 발생한다는 것은 알 수 있습니다.

#include <stdio.h>
#include <time.h>

void main()
{
        int seq;
        time_t tx;
        struct tm *tp;

        for (seq = 0; seq < 6;seq++)
          {
             tx = 2147483645+seq;
             tp = gmtime(&tx);
             printf ("seq: %d, Date Time: %d-%02d-%02d %02d:%02d:%02d\n",
                seq,
                tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday,
                tp->tm_hour, tp->tm_min, tp->tm_sec);
           }
}


실행결과

seq: 0, Date Time: 2038-01-19 03:14:05
seq: 1, Date Time: 2038-01-19 03:14:06
seq: 2, Date Time: 2038-01-19 03:14:07
seq: 3, Date Time: 1901-12-13 20:45:52
seq: 4, Date Time: 1901-12-13 20:45:53
seq: 5, Date Time: 1901-12-13 20:45:54

Y2K38 Unix Millennium Bug 효과
당신의 정보시스템은 2038-01-19 03:14:07 이후에도 안전하게 작동하려는지요? 
2038-01-19 아침 9시 당신의 교통카드는 거절될 수 있습니다.
당신의 신용카드도 유효 기한 경과로 거부 당할 수 있습니다. 
네비게이션은 엉뚱한 곳으로 당신을 안내할 수도 있습니다. 
ATM/주식거래도 중단될 수 있습니다. 항공 관제 혼란 등의 대란이 올 수도 있습니다. 
물론 과장이지만.

현대는 정보화 시대이고 정보시스템이 일상 생활에 미치는 영향이 크기때문에 Y2K38 버그가 영향을 줄만한 분야는 매우 방대합니다. 
아래를 포함한 거의 모든 분야가 대상이 될 수 있습니다.
  • 수도/전기/교통 등의 공공 인프라

  • 은행/증권 등의 금융 시스템

  • 위성을 포함한 유무선 통신 시스템

  • 의료

  • 정부 서비스

  • 군사 분야

Y2K38 해결하기

해결 방법 중 하나는 시간을 32비트 정수가 아니고 64비트 정수에 보관하는 것입니다. 

이런 경우 290 Billion Year 이전에는 문제가 없습니다. 

당신이 IT 시스템 관리자라면 당신이 사용하고 있는 정보시스템의 OS/DBMS와 같은 시스템 소프트웨어, 플랫폼/Compiler와 같은 개발 도구 뿐만 아니라 

응용 소프트웨어까지 광범위하게 Y2K38 bug free인지 체크해봐야 합니다.


CUBRID와 Y2K38
CUBRID에서는 날짜 시간을 보관하기 위한 여러가지 데이터 타입 (column type)을 제공하는데 
어떤 TYPE이 Y2K38 free인지 아래의 표를 참조하면 됩니다.


 Type

  Bytes  

  Y2K38 Bug Free   

 TIMESTAMP

 4

NO 

 DATETIME

 8

YES 

     TIMESTAMPLTZ    

 4

NO 

 TIMESTAMPTZ

 8

NO 

 DATETIMELTZ

 8

YES 

 DATETIMETZ

 12

YES 



위의 표를 고려할때 다음과 같은 SQL 문은 오류를 발생합니다.

insert into TBL1 values (timestamp'2038-02-01 01:15:45');
insert into TBL1 values (timestampltz'2038-02-01 01:15:45');
insert into TBL1 values (timestamptz'2038-02-01 01:15:45');


다음과 같은 SQL문은 정상 동작합니다.

insert into TBL1 values (datetime'2038-02-01 01:15:45');
insert into TBL1 values (datetimeltz'2038-02-01 01:15:45');
insert into TBL1 values (datetimetz'2038-02-01 01:15:45');


CUBRID에서 제공하는 날짜 관련 여러 data type이 있는 만큼, 정확히 알고 사용하는 것이 좋습니다. 자세한 것은 매뉴얼을 참조하세요 


맺음말

Y2K와 마찬가지로 Y2K38도 사회적 이슈가 되는 문제가 될 것은 명확한 일입니다. 2038년, 당신의 정보시스템은 안전하십니까

올바르게 알고 미리 미리 대처하는 것이 현명한 방법입니다. 검색엔진에 ‘Y2K38’을 입력하세요 


  1. CUBRID 10의 새로운 기능 "문자열 압축"

    CUBRID 10은 새로운 기능이 추가 되었습니다. 그 중에서 문자열 압축기능이 추가되었습니다. 지금부터 문자열 압축 기능에 대해서 알아보도록 하겠습니다. 문자열 압축 기능은 아래의 표와 같습니다. CUBRID 문자열 압축은 255byte 이상에서만 실행되고, 압축이 효율적이지 않으면 압축을 실행하지 않습니다. 문자열 압축률이 얼마나 좋은지 테스트하기 위해서 문자열 압축 기능이 없는 CUBRID 9.3과 10.1에서 테스트 데이타 10만건을 입력하고, 테이블 크기를 확인하는 방법으로 진행하였습니다. “케이스 #1”은 중복 되지 않는 문자열 데이타를 입력하고 압축률을 확인하였고, “케이스 #2”는 중복 된 데이타를 입력하고 압축률을 확인하였습니다. 각 케이스별로 데이타 10만건을 생성한 방법은 아래 표와 같습니다. 먼저 테스트 데이타 1건을 입력하고, “insert 테이블 select ...” 구문에서 카탈로그 테이블과 카테시안 곱(Cartesian Product)을 활용하여 테스트 데이타를 생성하였습니다. 위 표의 SQL문으로 데이타 10만건을 입력하고 테이블 크기를 확인하였습다. 테이블 크기는 “show heap capacity of 테이블명;” 명령을 실행하고 Num_pages 값을 확인하였고, 결과는 아...
    Date2018.12.26 Category제품 여행 By권호일 Views257 Votes0
    Read More
  2. GitHub Desktop을 활용한 소중한 소스 코드 관리

    1) 소중한 자신의 소스 코드가 손상 되거나 손실 되는 경우 2) 외부에서 자신의 소스 코드를 열람해야할 경우 3) 소스 코드의 변경 된 부분을 찾아야 하는 경우 소스 코드를 사용하다 보면 위와 같은 문제로 업무의 연속성이 끊어지는 경우가 발생 합니다. 이러한 문제를 GitHub Desktop을 통해 아주 간단하고 편리하게 사용 및 관리 하는 기능을 소개 하려 합니다. - 비용 : 무료 단, 소스 코드를 비공개하려면 과금 필요 - GUI 프로그램으로 git bash(커맨드 라인) 보다 편리하며, 손 쉽게 사용할 수 있습니다. [1 : GitHub 회원 가입] - 회원 가입 URL : https://github.com/ - IMAGE #1 GitHub 공식 홈페이지 접속 화면 사용할 정보 입력 : Username, Email, Password - IMAGE #2 STEP 1 : 계정 생성 동의 하기 - IMAGE #3 STEP 2 : 계정 유형 선택 - IMAGE #4 사용자 유형 선택 (Skip 해도 무관) - IMAGE #5, 6, 7 STEP 3단계 모두 마치면, Email 확인 후 계정 사용 가능 [2 : GitHub Desktop 설치] - 설치 URL : https://desktop.github.com/ - 지원 OS : Windows, OS X(MAC) - IMAGE #1 공식 홈페이지에서 GitHub Desktop 설치 파일을 받으 실 수 있습니다. (약 80MB) ...
    Date2018.12.03 Category나머지... By윤준수 Views6057 Votes0
    Read More
  3. 오픈소스 DBMS 10년의 여정

    10년 전인 2008년 11월 22일 NHN(현, 네이버)의 첫번째 개발자 행사인 DEVIEW 2008을 통해 CUBRID 오픈소스 버전이 첫 선을 보였습니다. 사용자 확산을 위해 2006년 5월 무료 라이선스를 선언을 한 이후 2008년 초부터 1년 가까이 오픈소스 전환을 위한 준비 과정을 거쳐 결국 오픈소스 DBMS로 변신을 한 것입니다.   -> CUBRID 2008 신제품이 출시되던 날…   오픈소스 DBMS 전환에 대한 사용자들의 인식을 제고하기 위해 버전 표기는 기존 숫자(CUBRID 6, 7) 중심에서 연도 체계 방식으로 변경하여 “CUBRID 2008”로 명칭을 했으며(2013년 3월 출시한 CUBRID 9부터 다시 숫자 표기로 변경), 라이선스의 경우 많은 논의 과정을 통해 엔진은 소스 코드 수정/배포 시 공개 의무가 있는 GPL v2 or higher, 인터페이스와 도구는 자유롭게 수정/배포가 가능한 BSD 라이선스를 채택했습니다.   CUBRID 2008 출시 후 초기 2년 동안의 미션은 개발자 및 사용자 확산이었습니다. CUBRID Inside라는 개발자 중심의 커뮤니티 행사를 통해 내부 개발자와 외부 개발자간에 만남의 장을 마련했고, 닉네임 Pcraft님 같은 경우에는 CUBRID Manager에 컨트리뷰션을 하시다가 추후 CUBRID 개발팀...
    Date2018.11.30 Category오픈소스 이야기 By정병주 Views748 Votes0
    Read More
  4. 2018년 CUBRID 정기교육을 마무리 하며..

    큐브리드에서는 매년 정기적으로 정기교육을 실시하고 있습니다.   금년도에는 공개SW개발자센터에 공개SW커뮤니티를 등록하여 커뮤니티 활성화 및 큐브리드를 사용자를 위한 교육을 진행했습니다. 정기교육이 어떻게 진행되고 있는지, 커리큘럼, 자주 듣는 궁금증 등에 대해 알아보겠습니다. 『2018년 정기교육 일정』 일시 장소 참석인원 03월 20일 ~ 21일 공개SW역량프라자(상암) 23명 05월 29일 ~ 30일 공개SW개발자센터(선릉) 06명 09월 04일 ~ 05일 공개SW역량프라자(상암) 24명 10월 16일 ~ 17일 공개SW역량프라자(상암) 13명       정기교육은 2일 과정으로 4회 진행되며, 교육에 참여해주신 분들에게 교육 교재와 자료를 나눠드리고, 점심식사도 제공하고 있습니다. 『신청방법』      http://www.cubrid.com/education에서 일정을 확인할 수 있으며, 교육일정 1개월 전에 온라인 신청을 오픈합니다. 『커리큘럼』      다음과 같이 1일차, 2일차로 교육내용이 다르며, 2일동안 교육을 참여해주시는 것이 도움이 됩니다. 또한 실습과정도 포함되어 있습니다.       2일 과정을 수료해주신 분들에게는 큐브리드에서 발급한 수료증을 나눠드립니다. 1일차 CUBRID 소개 ...
    Date2018.11.15 Category알려요~ By정훈 Views224 Votes0
    Read More
  5. timezone, tz data

    Timezone Timezone 하면 딱 생각나는 것은 +09:00, 우리나라는 그리니치 표준시 (GMT)보다 9시간 빠르다는 것이다.  해외 여행중 한국에 국제 전화할 때 꼭 알아야 할 것, "한국 시간 몇시인가?" 잘못하면 식구들 자는 중에 집에 전화할 수 있다. Timezone이 뭔가? 사전적 정의는 “특정 국가나 지역의 현지시간 (local time)” 이다. 그리니치 표준시의 정오는 경도 0도에 위치한 그리니치 천문대 남중 자오선을 태양이 지나가는 시간이다. 1925년 부터, 특정 지역의 local-time은 그리니치 표준시를 기준으로 몇시간 빠르고 느린가로 표현되어왔다. 그리니치 동쪽은 +, 서쪽은 -로 표현한다. GMT 시간이 그리니치 천문대를 지나는 태양을 기준으로 하기 때문에 시간이 지구의 자전 주기와 관련 되며, 자전의 흐름이 늦어지면서 오차가 발생되었고 새로운 표준시 제정에 대한 요구가 나오게 되었다. 1972년, 국제 표준시는 그리니치 표준시에서 UTC (Coordinated Universal Time)로 변경되었다.   UTC는 세슘 원자 시계 기반의 세계 표준시이며,  UTC와 GMT는 소숫점 단위에서만 차이가 나기 때문에 일상적으로 같은 수준으로 혼용해서 사용하기도 하나 기술적인 표현에서는 UT...
    Date2018.11.14 Category제품 여행 By한기수 Views1736 Votes0
    Read More
  6. CUBRID-HA 제약사항을 극복해보자

     Charpter0. 들어가며.. 주요한 시스템인 경우, 장애가 발생하더라도 실시간으로 서비스를 제공해야 함으로 CUBRID이중화 방식은 필히 적용해야 할 구성방식입니다. 그러나 LOB 를 사용하지 못하는 제약사항이 있어 이를 극복할 수 있는 방법이 있지 않을까해서 테스트한 내용입니다. 본 장에서는 Linux에서, fail-over, fail-back상황에서 테스트했지만, 더 많은 OS, 더 많은 상황에서도 동기화가 되는지 종합적인 테스트가 이루어져야 할 것입니다. Chapter1. HA란 무엇인가 CUBRID에서는 HA기능을 기본적으로 제공하고 있다. HA란 무엇인가??  High Availability(HA)란, 하드웨어, 소프트웨어, 네트워크 등에 장애가 발생해도 지속적인 서비스를 제공하는 기능이다. 이 기능은 하루 24시간 1년 내내 서비스를 제공해야 하는 네트워킹 컴퓨팅 부분에서 필수적인 요소이다. HA 시스템은 두 대 이상의 서버 시스템으로 구성하여 시스템 구성 요소 중의 한 요소에 장애가 발생해 서비스를 중단 없이 제공할 수 있다.  운영중인 하나의 서버(master-node)에 이상이 발생하여도 대기중 이였던 서버(slave-node)를 활용하여 중단없는 서비스를 제공한다는 것이다.  어떠한 방식으...
    Date2018.11.07 Category제품 여행 By큐브리드_김주현 Views393 Votes0
    Read More
  7. CUBRID contribute의 두번째 걸음, CUBRID 디버깅 하기

    디버깅은 실행중인 프로세스를 컨트롤할 수 있어 문제점을 찾거나 현재 로직을 확인 할 때 유용한 방법입니다. 이번에는 GDB를 활용하여 CUBRID server 프로세스를 디버깅해보도록 하겠습니다. GDB 사용에 앞서 CUBRID 빌드가 되어 있어야 합니다. CUBRID  빌드 관련 내용은 아래 링크를 확인하세요. http://www.cubrid.com/blog/3814572   디버깅을 위해서는 'debug' 모드로 빌드해주세요.  1 2 [root]vi build.sh build_mode="debug" cs   빌드시 에러가 발생한다면 표준에러만 파일로 리다이렉션하여 확인하는 것이 좋습니다.  1 2 [root]vi build.sh 2> error.out vi error.out cs 빌드가 완료가 되었다면 bash_profile 파일에 PATH 관련 정보를 추가 저장합니다. CUBRID 위치는 build시 저장한 위치로 변경하세요.  1 2 3 4 5 6 7 8 9 10 cd ~ [root]vi .bash_profile export CUBRID=/cubrid10.1/CUBRID   export CUBRID_DATABASES=$CUBRID/databases export PATH=$PATH:$CUBRID/bin export LD_LIBRARY_PATH=$CUBRID/lib:$LD_LIBRARAY_PATH CLASSPATH=$CUBRID/jdbc/cubrid_jdbc.jar export CLASSPATH [root]source .bash_profile cs demo DB를 생성합니다.​ 1 2 3 4 5 6 c...
    Date2018.08.09 Category제품 여행 By박세훈 Views549 Votes0
    Read More
  8. No Image

    CUBRID 사용 포트와 OS명령어로 포트 오픈 상태 점검하기

    CUBRID를 설치 후 사용자들이 응용 프로그램과 CUBRID Manager 또는 CUBRID Migration Toolkit(CMT)를 연결 할 때 어떤 포트를 사용해야 하는지 "방화벽 문제로 CUBRID DB서버와 접속이 안되는 현상" 때문에 Q&A 문의가 생각보다 많이 있어 이번 블로그 내용에서는 접속대상 서버(PC)와 CUBRID DB서버간 포트개방 생태를 OS명령어로 확인하는 방법을 소개하고자 합니다.  우선, CUBRID 포트관련 내용을 간단하게 정리하면 설정 파일들은 $CUBRID/conf 디렉토리에 위치해 있고 cubrid.conf에 cubrid_port_id=1523, cubrid_broker.conf에 BROKER_PORT=30000,33000, cubrid_ha.conf에 ha_port_id=59901, cm.conf에 cm_port=8001 포트로 기본설정되어 있습니다, 아래 표는 CUBRID가 사용하는 포트를 정리한 것입니다.   1, CUBRID 포트 정리표 구분 대상 장비 Linux 포트 Windows 포트 방화벽 Single DB WEB/WAS Server 33000(TCP) 33000~33040(TCP) 개방 CUBRID Manager 30000(TCP) 8001(TCP) 30000~30040(TCP) 8001(TCP) 개방 CUBRID CMT 30000(TCP) 30000~30040(TCP) 개방 CUBRID HA WEB/WAS Server 33000(TCP) 33000~33040(TCP) 개방 CUBRID Manager 30000(TCP) 8001(TCP) ...
    Date2018.07.03 Category제품 여행 By정만영 Views1762 Votes0
    Read More
  9. Windows 10에서 CUBRID linux 버전 사용하기

    MS에서 2016.08.02 기준으로 Windows 1주년 업데이트 버전을 배포했다. 해당 업데이트의 믄 변화에는 bash(Linux 용 Windows 하위시스템 beta)를 사용할 수 있다는 것이다. 해당 버전에서 정상 동작 하는지 테스트를 해 보았으나, 초기 버전에는 linux의 shared memory 관리 부분이 구현이 덜 되어 데이터베이스 서버 엔진은 구동이 가능하지만  쉐어드 메모리를 사용하는 브로커는 정상 작동하지 않았다. 해당 버그는 MS의 GitHUB https://github.com/Microsoft/WSL/issues/92 에 보고 되어 수정이 되었다. Windows 16215 버전 이후 버전 및 작년 가을에 레드스톤3 업데이트 Fall Creators Update 에 와서는 CUBRID가 정상 구동 할 수 있는 shared memory 환경이 되었다. Windows 10 버전를 꾸준히 업데이트만 받았다면, 이제 CUBRID를 bash 환경에서 구동이 가능하다. 일단 기본적으로 활성화되는 기능은 아니기 때문에 제어판 > 프로그램 > 프로그램 및 기능 > Windows 기능 켜기/끄기에서 해당 기능을 활성화 해야한다. 활성화 이후에는 재부팅이 필요 할 수 있다. 또는 MS의 Install the Windows Subsystem for Linux 가이드 (https://docs.microsoft.com/ko-kr/windows/w...
    Date2018.06.27 Category제품 여행 By성진 Views806 Votes0
    Read More
  10. 큐브리드의 유용한 명령어 살펴보기

    데이터베이스 시스템을 운영하면서 성능 개선은 매우 중요한 일입니다. CUBRID는 다른 DBMS와 다르게 JDBC 드라이버-브로커-데이터베이스 서버의 3계층(3-tier) 구조로 구성되어 있습니다. 3계층 중 브로커는 서버와 외부 응용 프로그램 간의 통신을 중계하는 CUBRID 전용 미들웨어로서, 커넥션 풀링, 모니터링, 로그 추적 및 분석 기능을 제공합니다. CUBRID는 CUBRID BROKER프로세스가 생성한 SQL LOG파일을 통해 SQL 성능 분석을 할 수 있습니다. (다른 DBMS 성능 모니터링은 시스템 DMV를 조회하여 확인합니다.)  이번 블러그에서는 CUBRID BROKER가 생성한 SQL LOG 파일을 이용하여 성능 문제를 분석하고 개선하는데 유용한 유틸리티에 대해 3회에 걸쳐 소개할 예정이며, 첫번째로 소개할 유틸리티는 broker_log_top 입니다. ▣ broker_log_top broker_log_top 유틸리티는 수행 시 특정 기간 동안 생성된 SQL LOG 파일를 분석하여 실행 시간이 긴 순서대로 나열합니다. 이 유틸리티는 수행시 log_top.res와 log_top.q와 같이 2개의 결과 파일을 남깁니다. log_top.res 파일에는 특정기간 동안 수행된 SQL들에 대한 최대 수행 시간, 최소 수행 시간, 평균 수행 시간 및 수...
    Date2018.01.04 Category제품 여행 By성진 Views1994 Votes0
    Read More
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 12 Next
/ 12

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2147 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales