'카테고리'에 해당되는 글 27건

  1. 2008.04.16 :: RoundCube Webmail (5)
  2. 2008.03.18 :: MYSQL 날짜 데이터 타입 (2)
  3. 2008.03.17 :: 모든 파일명 변경하는 스크립트
  4. 2007.11.23 :: 리눅스 커널 파라메터 (2)
  5. 2007.11.23 :: ASCII Code Table
  6. 2007.11.23 :: 한글 유니코드 값 구하는 공식
  7. 2007.11.15 :: Understanding the Query Cache
  8. 2007.11.06 :: InnoDB
  9. 2007.08.21 :: CentOS 4.5 yum update시 missing error. (2)
  10. 2007.03.10 :: 스토리지... (8)
리눅스 2008. 4. 16. 12:35
RoundCube Webmail은 오픈소스중 알려져 있는 많은 웹메일 중에 하나이다.

나 또한 최근까지 다람쥐 메일이라고 불리우는 Squirrel Mail을 사용했는데,
오랫동안 개발되어 온 만큼 많은 플러그인이 존재하기 때문에 여러 기능이 있다는 강점이 있으나
역시 보기좋은 떡이 먹기에도 좋다고.. 90년대틱한 디자인이 영 마음에 안들었었다.

그러다 어느날 우연히 RoundCube 라는 프로그램을 발견했고,
잠깐의 삽질 끝에 깔끔한 디자인의 괜찮은 프로그램을 사용할 수 있게 되었다.
또한 또하나의 강점으로 Ajax를 지원하며, UTF8이 기본으로 지원되고 있다.

그러나 아직 개발이 꾸준히 일어나고 있는 중이라 그런것인지
stable 이라는 딱지에 맞지 않게 버그도 심심치 않게 발견할 수 있었고,
가장 큰 문제점인 euc-kr이 제대로 지원되지 않는다는 문제가 있었다.

한글 문제는 곧 케릭터셋 문제에 있으리라 확신했고, 고쳐보고자 마음먹고 소스를 뒤적뒤적...
그러다가 디폴트 케릭터셋 처리 코드에 버그가 있음을 발견했고,
이 문제를 roundcube.net (http://trac.roundcube.net/ticket/1484991) 에
문제되는 부분과 패치된 부분의 코드를 현재 포팅해놓은 상태이다.

그 외에도 euc-kr을 처리하려면 패치를 조금 더 해야되는데..
생각보다 꽤 많은 코드에 ISO-8859-1 값이 Static으로 박혀 있었다.
물론 몽땅 다 replace 시켜주면 되겠지만.. 나의 귀차니즘이 어디가겠나?-_-
최소한의 패치로 처리할 수 있는 방법을 선택했다.
현재 tini4u.net에서 테스트중이고, 별 문제는 없는것 같은데.. 시간이 지나봐야 알 것 같다.

아래는 euc-kr 처리를 위한 패치부분이다.
FileName: roundcube/program/include/rcube_imap.php

--- Original Code
+++ Patch Code

=> Line number : 217
-  $this->default_charset = $ch;
+  $this->default_charset = $cs;

=> Line number : 2362
- return rcube_charset_convert($input, !empty($fallback) ? $fallback : 'ISO-8859-1');
+ return rcube_charset_convert($input, !empty($fallback) ? $fallback : 'euc-kr');

euc-kr 패치가 적용되기 전 화면
사용자 삽입 이미지


euc-kr 패치가 완료된 후 화면
사용자 삽입 이미지
posted by 티니

댓글을 달아 주세요

  1.  Addr  Edit/Del  Reply 윤용섭

    한글파일명 첨부해서 메일발송 잘 되던가요?
    저도 몇가지 테스트를 해 보았는데, 이게 제일 큰 문제인것 같아요.(나만 그런가?)

    2008.04.21 15:39
    •  Addr  Edit/Del BlogIcon 티니

      음.. 그러네요
      한글명으로 된 파일 전송이 제대로 이루어지지 않는군요
      시간날때 픽스해봐야겠습니다

      2008.05.03 19:35 신고
  2.  Addr  Edit/Del  Reply BlogIcon 무적가이

    /program/steps/mail/get.inc

    파일에 아래 부분처럼 수정하면 됩니다~ 대략 107 라인
    UTF8 문제였음! ^^
    수정하는김에 header("Content-Length: {$part->size}";); 도 추가했어요.
    티니님덕에 한글부분은 쉽게 수정했네요. 감사~~


    ///////////////////////////////////////////////////////////
    // Fixed by DongMan

    $charset = $part->charset;
    if($charset == "";) $charset = $IMAP->default_charset;

    $filename = $part->filename;
    if($charset != "UTF-8";) $filename = iconv("UTF-8", $charset, $filename);

    header(sprintf('Content-Disposition: %s; filename="%s";',
    $_GET['_download'] ? 'attachment' : 'inline',
    $filename ? $filename : "kongpy.$ctype_secondary";));
    header("Content-Length: {$part->size}";);

    ///////////////////////////////////////////////////////////
    /*
    header(sprintf('Content-Disposition: %s; filename="%s";',
    $_GET['_download'] ? 'attachment' : 'inline',
    $part->filename ? abbreviate_string($part->filename, 55) : "roundcube.$ctype_secondary";));
    */

    2008.05.08 18:21
  3.  Addr  Edit/Del  Reply 윤용섭

    감사합니다. 무적가이님 대충해결된 것 같은데, 브비.ppt 라는 파일을 첨부하면 파일명이 제대로 보내지지가 않는 군요. 이 문제도 좀 해결해주시면 고맙겠습니다.

    2008.05.16 12:07
  4.  Addr  Edit/Del  Reply BlogIcon 김정균

    http://my.oops.org/120 에 0.1.1 용 패치를 추가해 놓았습니다. 테스트 해 본 결과로는 한글 파일이 잘 처리되는 것 같습니다.

    다만, 전 get.inc 에 따로 패치를 하지 않았습니다. :-) 웹이 UTF-8 이 아닐 경우에 문제가 되는 것이 아닐까 생각중.. (위의 패치를 잠깐 본 소감으로는..)

    2008.08.21 06:35

DBMS 2008. 3. 18. 14:42
  • DATE_FORMAT(date,format)

format 스트링에 따라서date 값을 포맷한다.

아래에 나와 있는 지정자 (specifier)들은 format 스트링안에서 사용할 수 있다. ‘%문자는 지정자 문자를 포맷하기 전에 필요한 것이다.

Specifier

Description

%a

Abbreviated weekday name (Sun..Sat)

%b

Abbreviated month name (Jan..Dec)

%c

Month, numeric (0..12)

%D

Day of the month with English suffix (0th, 1st, 2nd, 3rd, …)

%d

Day of the month, numeric (00..31)

%e

Day of the month, numeric (0..31)

%f

Microseconds (000000..999999)

%H

Hour (00..23)

%h

Hour (01..12)

%I

Hour (01..12)

%i

Minutes, numeric (00..59)

%j

Day of year (001..366)

%k

Hour (0..23)

%l

Hour (1..12)

%M

Month name (January..December)

%m

Month, numeric (00..12)

%p

AM or PM

%r

Time, 12-hour (hh:mm:ss followed by AM or PM)

%S

Seconds (00..59)

%s

Seconds (00..59)

%T

Time, 24-hour (hh:mm:ss)

%U

Week (00..53), where Sunday is the first day of the week

%u

Week (00..53), where Monday is the first day of the week

%V

Week (01..53), where Sunday is the first day of the week; used with %X

%v

Week (01..53), where Monday is the first day of the week; used with %x

%W

Weekday name (Sunday..Saturday)

%w

Day of the week (0=Sunday..6=Saturday)

%X

Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V

%x

Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v

%Y

Year, numeric, four digits

%y

Year, numeric (two digits)

%%

A literal ‘%’ character

%x

x, for any ‘x’ not listed above

달 및 날짜 지정자를 위한 범위는 0에서부터 시작을 한다..

mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');

        -> 'Saturday October 1997'

mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');

        -> '22:23:00'

mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',

                          '%D %y %a %d %m %b %j');

        -> '4th 97 Sat 04 10 Oct 277'

mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',

                          '%H %k %I %r %T %S %w');

        -> '22 22 10 10:23:00 PM 22:23:00 00 6'

mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');

        -> '1998 52'

mysql> SELECT DATE_FORMAT('2006-06-00', '%d');

        -> '00'

  • DAY(date)

DAY() is a synonym for DAYOFMONTH().

  • DAYNAME(date)

date에 대한 주간 요일 이름을 리턴한다.

mysql> SELECT DAYNAME('1998-02-05');

        -> 'Thursday'

  • DAYOFMONTH(date)

0에서 31 사이의 달별 날짜를 리턴한다.

mysql> SELECT DAYOFMONTH('1998-02-03');

        -> 3

  • DAYOFWEEK(date)

date에 대한 주간 요일 인덱스를 리턴한다 (1 = Sunday, 2 = Monday, …, 7 = Saturday). 이러한 인덱스들은 ODBC 표준을 따른다.

mysql> SELECT DAYOFWEEK('1998-02-03');

        -> 3

  • DAYOFYEAR(date)

1에서 366 사이의 date에 해당하는 일수를 리턴한다.

mysql> SELECT DAYOFYEAR('1998-02-03');

        -> 34

  • EXTRACT(unit FROM date)

EXTRACT() 함수는 DATE_ADD() 또는 DATE_SUB()과 같은 종류의 유닛 지정자를 사용하지만, 날짜 산술식을 실행하는 것이 아닌 날짜에서 부분을 추출하는 기능을 수행한다..

mysql> SELECT EXTRACT(YEAR FROM '1999-07-02');

       -> 1999

mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03');

       -> 199907

mysql> SELECT EXTRACT(DAY_MINUTE FROM '1999-07-02 01:02:03');

       -> 20102

mysql> SELECT EXTRACT(MICROSECOND

    ->                FROM '2003-01-02 10:30:00.00123');

        -> 123

  • FROM_DAYS(N)

주어진 날짜 숫자 N에 대해서 DATE 값을 리턴한다.

mysql> SELECT FROM_DAYS(729669);

        -> '1997-10-07'

  • FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)

unix_timestamp 인수에 대한 표현식을 이 함수가 사용된 문장에 따라서 'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS 포맷으로 리턴한다. unix_timestampUNIX_TIMESTAMP() 함수가 만들어 내는 것과 같은 내부 타임 스탬프 값이다.

만일 format 을 주게 되면, 그 결과는 format 스트링에 따라서 포맷이 되는데, 이것은 DATE_FORMAT() 함수에 대한 엔트리에 목록화 되는 방식과 같은 방식을 사용한다.

mysql> SELECT FROM_UNIXTIME(875996580);

        -> '1997-10-04 22:23:00'

mysql> SELECT FROM_UNIXTIME(875996580) + 0;

        -> 19971004222300

mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),

    ->                      '%Y %D %M %h:%i:%s %x');

        -> '2003 6th August 06:22:58 2003'

  • GET_FORMAT(DATE|TIME|DATETIME, 'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL')

포맷 스트링을 리턴한다. 이 함수는 DATE_FORMAT() STR_TO_DATE() 함수를 결합하는데 있어서 매우 유용한 것이다.

첫 번째 인수와 두 번째 인수에 대해서 몇 가지 포맷 스트링 값이 사용 가능하다. 이 값들은 ISO 9075를 참조한다.

Function Call

Result

GET_FORMAT(DATE,'USA')

'%m.%d.%Y'

GET_FORMAT(DATE,'JIS')

'%Y-%m-%d'

GET_FORMAT(DATE,'ISO')

'%Y-%m-%d'

GET_FORMAT(DATE,'EUR')

'%d.%m.%Y'

GET_FORMAT(DATE,'INTERNAL')

'%Y%m%d'

GET_FORMAT(DATETIME,'USA')

'%Y-%m-%d-%H.%i.%s'

GET_FORMAT(DATETIME,'JIS')

'%Y-%m-%d %H:%i:%s'

GET_FORMAT(DATETIME,'ISO')

'%Y-%m-%d %H:%i:%s'

GET_FORMAT(DATETIME,'EUR')

'%Y-%m-%d-%H.%i.%s'

GET_FORMAT(DATETIME,'INTERNAL')

'%Y%m%d%H%i%s'

GET_FORMAT(TIME,'USA')

'%h:%i:%s %p'

GET_FORMAT(TIME,'JIS')

'%H:%i:%s'

GET_FORMAT(TIME,'ISO')

'%H:%i:%s'

GET_FORMAT(TIME,'EUR')

'%H.%i.%S'

GET_FORMAT(TIME,'INTERNAL')

'%H%i%s'

TIMESTAMP는 또한 GET_FORMAT() 함수의 첫 번째 인수로 사용이 가능한데, 이와 같은 경우, 함수는 DATETIME 함수와 같은 값을 리턴한다.

mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR'));

        -> '03.10.2003'

mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'));

        -> '2003-10-31'

  • HOUR(time)

time에 대해서 시간 (hour)를 리턴한다. 일별 시간에 대해서는 0에서 23 사이의 값을 가진다. 하지만, TIME 값의 실제 범위는 이것보다 훨씬 크기 때문에, HOUR 23 보다 큰 값을 리턴할 수 있다.

mysql> SELECT HOUR('10:05:03');

        -> 10

mysql> SELECT HOUR('272:59:59');

        -> 272

  • LAST_DAY(date)

날짜 또는 데이트타임 값을 가져와서 그 달의 가장 마지막 날짜에 해당하는 값을 리턴한다. 만일 인수가 올바르지 않으면 NULL을 리턴한다.

mysql> SELECT LAST_DAY('2003-02-05');

        -> '2003-02-28'

mysql> SELECT LAST_DAY('2004-02-05');

        -> '2004-02-29'

mysql> SELECT LAST_DAY('2004-01-01 01:01:01');

        -> '2004-01-31'

mysql> SELECT LAST_DAY('2003-03-32');

        -> NULL

  • LOCALTIME, LOCALTIME()

LOCALTIME LOCALTIME()NOW()과 동일한 것이다.

  • LOCALTIMESTAMP, LOCALTIMESTAMP()

LOCALTIMESTAMP LOCALTIMESTAMP()NOW()과 동일하다.

  • MAKEDATE(year,dayofyear)

주어진 연도 및 연도별 날짜 값을 가지고서, 해당하는 날짜를 리턴한다. dayofyear 인수는 0 보다 커야 하며, 그렇지 않을 경우에는 NULL을 리턴한다.

mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32);

        -> '2001-01-31', '2001-02-01'

mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365);

        -> '2001-12-31', '2004-12-30'

mysql> SELECT MAKEDATE(2001,0);

        -> NULL

  • MAKETIME(hour,minute,second)

hour, minute, 그리고 second 인수를 가지고 계산된 시간 값을 리턴한다.

mysql> SELECT MAKETIME(12,15,30);

        -> '12:15:30'

  • MICROSECOND(expr)

시간 또는 데이트타임 수식 expr 에서 마이크로 세컨드(microsecond) 값을 리턴하는데, 그 범위는0에서 999999 사이가 된다.

mysql> SELECT MICROSECOND('12:00:00.123456');

        -> 123456

mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010');

        -> 10

  • MINUTE(time)

time에서 분 (minute)에 해당하는 값을 리턴하는데, 그 범위는 0에서 59 사이가 된다.

mysql> SELECT MINUTE('98-02-03 10:05:03');

        -> 5

  • MONTH(date)

date에서 월에 해당하는 값을 리턴하는데, 그 범위는 0에서 12 사이가 된다.

mysql> SELECT MONTH('1998-02-03');

        -> 2

  • MONTHNAME(date)

date에 해당하는 월을 전체 이름으로 표시한다.

mysql> SELECT MONTHNAME('1998-02-05');

        -> 'February'

  • NOW()

이 함수가 사용되는 문장에 따라서 그 형태를 'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS로 해서 현재의 날짜 및 시간을 리턴한다.

mysql> SELECT NOW();

        -> '1997-12-15 23:50:26'

mysql> SELECT NOW() + 0;

        -> 19971215235026

NOW()는 이 명령문이 실행을 시작하는 시점을 나타내는 시간을 상수 값으로 리턴한다. (스토어드 루틴 또는 트리거 안에서는, NOW()는 루틴 또는 트리거링 명령문이 실행되는 시점 값을 리턴한다.) 이 함수는 SYSDATE()와는 차이점을 가지는데, 후자의 경우는 5.0.13 이후에는 함수가 실행된 정확한 시간을 리턴한다.

mysql> SELECT NOW(), SLEEP(2), NOW();

+---------------------+----------+---------------------+

| NOW()               | SLEEP(2) | NOW()               |

+---------------------+----------+---------------------+

| 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |

+---------------------+----------+---------------------+

 

mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();

+---------------------+----------+---------------------+

| SYSDATE()           | SLEEP(2) | SYSDATE()           |

+---------------------+----------+---------------------+

| 2006-04-12 13:47:44 |        0 | 2006-04-12 13:47:46 |

+---------------------+----------+---------------------+

이 두 함수간의 차이점에 대해서는 SYSDATE() 함수 설명을 참고로 하기 바란다.

  • PERIOD_ADD(P,N)

N (month)을 기간 P 에 추가한다 (YYMM 또는 YYYYMM 포맷). 리턴되는 값은 YYYYMM 포맷을 가진다. 기간 인수 P 는 날짜 값이 아니라는 점을 유의한다.

mysql> SELECT PERIOD_ADD(9801,2);

        -> 199803

  • PERIOD_DIFF(P1,P2)

P1 P2 사이의 월별 간격을 리턴하는데, 여기에서 P1 P2 YYMM 또는 YYYYMM 형태가 되어야 한다. 인수 P1 P2 는 날짜 값이 아니라는 점을 유의한다.

mysql> SELECT PERIOD_DIFF(9802,199703);

        -> 11

  • QUARTER(date)

Date에 해당하는 분기를 리턴하는데, 범위는1 에서 4 사이가 된다

mysql> SELECT QUARTER('98-04-01');

        -> 2

  • SECOND(time)

time에서 초 부분을 리턴하는데, 범위는 0 에서 59 사이가 된다.

mysql> SELECT SECOND('10:05:03');

        -> 3

  • SEC_TO_TIME(seconds)

seconds 인수를 리턴하는데, 이 함수가 사용되는 문장에 따라서 'HH:MM:SS' 또는 HHMMSS 포맷의 값으로 시간, , 초로 변환을 시킨다.

mysql> SELECT SEC_TO_TIME(2378);

        -> '00:39:38'

mysql> SELECT SEC_TO_TIME(2378) + 0;

        -> 3938

  • STR_TO_DATE(str,format)

이 함수는 DATE_FORMAT() 함수와는 정 반대 값을 리턴한다. 이 함수는 스트링 str 을 가져와서 스트링 format형태로 포맷을 한다. STR_TO_DATE(), 포맷 스트링이 날짜 및 시간 부분을 모두 가지고 있는 경우에는 DATETIME 값을, 또는 스트링이 날짜 또는 시간 부분만을 가지고 있는 경우에는 DATE 또는 TIME 값을 리턴한다.

Str에 포함되어 있는 날짜, 시간, 또는 데이트타임 값은 ormat에 의해 지정되는 포맷으로 주어져야 한다. format에서 사용될 수 있는 지정자의 경우는 DATE_FORMAT() 함수 설명을 참조하기 바란다. 만일 str이 올바르지 않은 날짜, 시간, 또는 데이트타임 값을 가지고 있다면, STR_TO_DATE()NULL을 리턴한다. MySQL 5.0.3 이후에서는 경고문도 함께 발생한다.

날짜 값의 범위 검사는 Section 11.3.1, “DATETIME, DATE, 그리고 TIMESTAMP 타입에서 설명을 하고 있다. 예를 들면, 이것은, “제로 (zero)” 날짜 또는 날짜 부분에 0을 가지고 있는 날짜는 SQL 모드가 이러한 값을 허용하지 않도록 설정되지 않는 한 사용 가능하다는 것을 의미한다.

mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');

        -> '0000-00-00'

mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y');

        -> '2004-04-31'

  • SUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)

두 번째 인수에 대해서 INTERVAL 폼을 사용해서 호출을 한다면, SUBDATE()DATE_SUB()과 동일한 값을 리턴하게 된다.

mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);

        -> '1997-12-02'

mysql> SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY);

        -> '1997-12-02'

두 번째 형태는 days에 대해서 정수 값을 사용할 수 있도록 하고 있다. 이와 같은 경우, 날짜 또는 데이트타입 수식 expr에서 빼기가 되어야 하는 날짜 수로 해석이 된다.

mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31);

        -> '1997-12-02 12:00:00'

Note: "%X%V" 형태를 사용해서 년-주간 스트링을 날짜로 변환 시킬수는 없는데, 그 이유는 연도와 주간의 결합은 해당 주간이 두 개의 달에 걸쳐 있을 경우에는 연도 및 달을 구분할 수 없기 때문이다. 연도-주간 값을 날짜로 변환하기 위해서는, 주간 요일 (weekday)을 함께 지정해 주어야 한다:

mysql> SELECT STR_TO_DATE('200442 Monday', '%X%V %W');

        -> '2004-10-18'

  • SUBTIME(expr1,expr2)

SUBTIME() 함수는 expr1expr2 수식의 결과 값을 리턴하느데, 그 포맷은 expr1을 따른다.  expr1 은 시간 또는 데이트 타임 수식을 사용할 수 있으며, expr2은 시간 수식이 된다.

mysql> SELECT SUBTIME('1997-12-31 23:59:59.999999','1 1:1:1.000002');

        -> '1997-12-30 22:58:58.999997'

mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998');

        -> '-00:59:59.999999'

  • SYSDATE()

함수가 사용된 문장에 따라서 'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS 포맷으로 현재 날짜 및 시간을 리턴한다.

MySQL 5.0.13 이후부터는, SYSDATE()은 이것이 실행된 시간을 리턴한다. 이 함수는 NOW()과 차이를 가지는데, 후자의 경우는 명령문이 실행을 시작한 상수 시간을 리턴한다.

mysql> SELECT NOW(), SLEEP(2), NOW();

+---------------------+----------+---------------------+

| NOW()               | SLEEP(2) | NOW()               |

+---------------------+----------+---------------------+

| 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |

+---------------------+----------+---------------------+

 

mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();

+---------------------+----------+---------------------+

| SYSDATE()           | SLEEP(2) | SYSDATE()           |

+---------------------+----------+---------------------+

| 2006-04-12 13:47:44 |        0 | 2006-04-12 13:47:46 |

+---------------------+----------+---------------------+

또한, SET TIMESTAMP 명령문은 NOW()가 리턴하는 값에는 영향을 주지만, SYSDATE()가 리턴하는 값에는 영향을 주지 않는다. 이것이 의미하는 것은 바이너리 로그에서 설정된 타임 스탬프가 SYSDATE() 함수 호출에는 영향을 주지 않는다는 것을 나타내는 것이다.

SYSDATE()는 동일한 명령문 안에서도 서로 다른 값을 리턴하고, SET TIMESTAMP에 의해서도 영향을 받지 않기 때문에, 이 함수는 논-디터미니스틱 (non-deterministic)이며 따라서 리플리케이션에서는 안전하지가 못하게 된다. 만일 이것이 문제가 된다면, 서버를 --sysdate-is-now 옵션과 함께 구동 시킴으로서 SYSDATE()NOW()의 별칭으로 동작하도록 할 수는 있다.

  • TIME(expr)

시간 또는 데이트 타임 수식 expr 에서 시간 부분을 추출하고 그 값을 스트링으로 리턴한다.

mysql> SELECT TIME('2003-12-31 01:02:03');

        -> '01:02:03'

mysql> SELECT TIME('2003-12-31 01:02:03.000123');

        -> '01:02:03.000123'

  • TIMEDIFF(expr1,expr2)

TIMEDIFF()expr1expr2 수식의 결과를 시간 값으로 리턴한다. expr1 expr2 는 시간 또는 날짜-시간 수식이 될 수 있지만, 양쪽 모두 동일한 타입이어야 한다.

mysql> SELECT TIMEDIFF('2000:01:01 00:00:00',

    ->                 '2000:01:01 00:00:00.000001');

        -> '-00:00:00.000001'

mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001',

    ->                 '1997-12-30 01:01:01.000002');

        -> '46:58:57.999999'

  • TIMESTAMP(expr), TIMESTAMP(expr1,expr2)

단일 인수를 사용하게 되면, 이 함수는 날짜 또는 데이트 타임 수식 expr 을 데이트 타임 값으로 리턴한다. 두 개의 인수를 사용하게 되면, 이 함수는 시간 수식 expr2 를 날짜 또는 데이트 타임 수식 expr1 에 추가를 하게 되고 그 결과를 데이트타임 값 형태로 리턴한다.

mysql> SELECT TIMESTAMP('2003-12-31');

        -> '2003-12-31 00:00:00'

mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');

        -> '2004-01-01 00:00:00'

  • TIMESTAMPADD(unit,interval,datetime_expr)

정수 수식 interval 를 날짜 또는 데이트타임 수식 datetime_expr에 추가를 한다. interval 에 대한 유닛은 unit 인수에 의해 주어지는데, 이 인수는 다음의 값 중에 하나가 되어야 한다: FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.

unit 값은 위에 나와 있는 키워드중의 하나를 사용하거나 또는 지정될 수 있다. SQL_TSI_의 접두어를 사용해서 지정할 수가 있다. 예를 들면, DAY SQL_TSI_DAY 는 모두 유효하다.

mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');

        -> '2003-01-02 00:01:00'

mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');

        -> '2003-01-09'

TIMESTAMPADD() 5.0.0 이후에 사용 가능해졌다.

  • TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

날짜 또는 데이트 타임 수식 datetime_expr1 datetime_expr2간의 정수 차이를 리턴한다. 그 결과에 대한 유닛은 unit 인수에 의해 주어진다. unit 에 대한 유효 값은 TIMESTAMPADD() 함수에서 설명된 리스트 값과 같다.

mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');

        -> 3

mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');

        -> -1

TIMESTAMPDIFF() 5.0.0 이후에 사용 가능해졌다.

  • TIME_FORMAT(time,format)

이 함수는 DATE_FORMAT() 함수와 비슷하게 사용되지만, format 스트링은 시간, , 그리고 초에만 해당하는 지정자를 가질 수도 있다. 다른 지정자들을 사용하면 NULL 값 또는 0이 나오게 된다.

만일 time 값이 23 보다 큰 시간 부분을 가진다면, %H %k 시간 포맷 지정자 0에서 23 보다 큰 값을 만들게 된다. 다른 시간 포맷 지정자는 시간 값 모듈로 12를 만든다.

mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');

        -> '100 100 04 04 4'

  • TIME_TO_SEC(time)

time 인수를 초로 변환해서 리턴한다.

mysql> SELECT TIME_TO_SEC('22:23:00');

        -> 80580

mysql> SELECT TIME_TO_SEC('00:39:38');

        -> 2378

  • TO_DAYS(date)

주어진 날짜 date에 대해서, 연도 0에서부터 계산된 날짜 숫자를 리턴한다.

mysql> SELECT TO_DAYS(950501);

        -> 728779

mysql> SELECT TO_DAYS('1997-10-07');

        -> 729669

  • UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)

만일 아무런 인수를 지정하지 않고 호출을 한다면, 부호를 사용하지 않은 유닉스 타임 스탬프를 리턴한다 ('1970-01-01 00:00:00' UTC 이후의 초). 만일 UNIX_TIMESTAMP()date 인수를 사용해서 호출되었다면, 이 함수는 '1970-01-01 00:00:00' UTC 이후의 초 형태로 인수 값을 리턴한다. DateDATE 스트링, DATETIME 스트링, TIMESTAMP, 또는 YYMMDD 또는 YYYYMMDD에 있는 숫자가 될 수도 있다. 서버는 date를 현재의 타임 존에 있는 값으로 해석을 해서 UTC의 내부 값으로 변환을 시킨다. 클라이언트는 자신의 타임 존을 Section 5.11.8, “MySQL 서버 타임 지원에서 설명한 방식으로 설정을 한다.

mysql> SELECT UNIX_TIMESTAMP();

        -> 882226357

mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');

        -> 875996580

UNIX_TIMESTAMPTIMESTAMP 컬럼에서 사용하는 경우, 이 함수는 내부 타임 스탬프 값을 직접 리턴하고, 의미적인 (implicit) “스트링에서 유닉스 타임 스탬프로 변환을 실행하지 않는다. 만일 날짜 범위를 벗어난 값을 UNIX_TIMESTAMP()에 주게 되면, 함수는 0을 리턴한다.

  • UTC_DATE, UTC_DATE()

이 함수가 사용된 문장에 따라서, 현재의 UTC 날짜를 'YYYY-MM-DD' 또는 YYYYMMDD 포맷으로 리턴한다.

mysql> SELECT UTC_DATE(), UTC_DATE() + 0;

        -> '2003-08-14', 20030814

  • UTC_TIME, UTC_TIME()

이 함수가 사용된 문장에 따라서, 현재의 UTC 시간을 'HH:MM:SS' 또는 HHMMSS 포맷으로 리턴한다.

mysql> SELECT UTC_TIME(), UTC_TIME() + 0;

        -> '18:07:53', 180753

  • UTC_TIMESTAMP, UTC_TIMESTAMP()

이 함수가 사용된 문장에 따라서, 현재의 UTC 날짜를 'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS 포맷으로 리턴한다.

mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;

        -> '2003-08-14 18:08:04', 20030814180804

  • WEEK(date[,mode])

이 함수는 date에 해당하는 주간 숫자를 리턴한다. WEEK() 함수에 두 개의 인수를 사용하면 해당 주가 일요일 또는 월요일에 시작을 하는지를 지정할 수 있으며 또한 리턴되는 값이 0에서 53 사이 또는 1에서 53 사이에 있는지를 지정할 수가 있게 된다. 만일 mode 인수를 생략한다면, default_week_format 시스템 변수가 사용된다. Section 5.2.2, “서버 시스템 변수를 참조할 것.

아래의 테이블은 mode 인수가 어떻게 동작을 하는지를 보여주는 것이다.

 

First day

 

 

Mode

of week

Range

Week 1 is the first week …

0

Sunday

0-53

with a Sunday in this year

1

Monday

0-53

with more than 3 days this year

2

Sunday

1-53

with a Sunday in this year

3

Monday

1-53

with more than 3 days this year

4

Sunday

0-53

with more than 3 days this year

5

Monday

0-53

with a Monday in this year

6

Sunday

1-53

with more than 3 days this year

7

Monday

1-53

with a Monday in this year

mysql> SELECT WEEK('1998-02-20');

        -> 7

mysql> SELECT WEEK('1998-02-20',0);

        -> 7

mysql> SELECT WEEK('1998-02-20',1);

        -> 8

mysql> SELECT WEEK('1998-12-31',1);

        -> 53

만일 어떤 날짜가 바로 전년도의 마지막 주에 있다면, 여러분이 옵션 인수MySQL0을 리턴한다:

mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);

        -> 2000, 0

  • WEEKDAY(date)

Date에 해당하는 주간 요일 인덱스를 리턴한다 (0 = Monday, 1 = Tuesday, … 6 = Sunday).

mysql> SELECT WEEKDAY('1998-02-03 22:23:00');

        -> 1

mysql> SELECT WEEKDAY('1997-11-05');

        -> 2

  • WEEKOFYEAR(date)

1에서 53 사이의 달력 주간 숫자를 리턴한다.

mysql> SELECT WEEKOFYEAR('1998-02-20');

        -> 8

  • YEAR(date)

1000에서 9999 사이의 date에 해당하는 연도를 리턴하거나, 또는 제로날짜일 경우에는 0을 리턴한다.

mysql> SELECT YEAR('98-02-03');

        -> 1998

  • YEARWEEK(date), YEARWEEK(date,start)

해당되는 연도 및 주를 리턴한다. start 인수는 WEEK() 함수에서 사용되는 것과 동일하게 동작을 한다. 결과에 나오는 연도는 날짜 인수에 표시되어 있는 연도와 다르게 나올 수도 있다.

mysql> SELECT YEARWEEK('1987-01-01');

        -> 198653

posted by 티니
TAG Linux, MySQL

댓글을 달아 주세요

  1.  Addr  Edit/Del  Reply mihn

    퍼갑니다. 감사합니다.

    2009.03.11 12:55
  2.  Addr  Edit/Del  Reply 가가멜

    좋은 정보 감사합니다.

    2012.04.02 10:07

Language 2008. 3. 17. 09:18

모든 파일명을 변경하는 스크립트다.
대문자->소문자, 소문자->대문자로 변환이 가능하다.

사용법: foo.sh {upper|lower}

#!/bin/bash
# Set variable
caseSwitch=${1}
execCNT=1
# Switch Check
if [ ! ${caseSwitch} ]; then
 echo "Usage: {upper|lower}"
 exit 0
fi
# Excute Check
if [ "${caseSwitch}" == "upper" ]; then
 echo -n "Do you want change entire files to upper-case? ex)foobar->FOOBAR (Y/[N]) : "
 read acceptYN
 if [[ "${acceptYN}" =~ '^(y|Y)$' ]]; then
  regexCode="'a-z' 'A-Z'"
 else
  exit 0
 fi
elif [ "${caseSwitch}" == "lower" ]; then
 echo -n "Do you want change entire files to lower-case? ex)FOOBAR->foobar (Y/[N]) : "
 read acceptYN
 if [[ "${acceptYN}" =~ '^(y|Y)$' ]]; then
  regexCode="'A-Z' 'a-z'"
 else
  exit 0
 fi
else
 exit 0
fi
# Change Excute
for list in *
do
 orig_name=`basename $list`
 conv_name=`echo ${orig_name} | tr ${regexCode}`
 if [ "${orig_name}" != "${conv_name}" ]; then
  echo "[${execCNT}] ${orig_name} -> ${conv_name}"
  mv ${orig_name} ${conv_name}
  let "execCNT+=1"
 fi
done
exit 0
posted by 티니
TAG bash

댓글을 달아 주세요

리눅스 2007. 11. 23. 14:19
# 커널이 할당할 수 있는 파일 핸들 최대값 조정 (max 65535)
# 128M -> 8192
# 256M -> 13684
# 512M -> 32768
# 1G -> 65536
# 2G -> 131072
fs.file-max = 65535

# 동시 사용자가 몰릴 경우에 대비해 received host대한 충분한 backlog 수치를 늘려주는 것이 좋음
net.core.netdev_max_backlog=2500

# 소켓 수신 큐 최대값과 기본값 조정.

# 일반적인 경우의 대용량 Serving을 위한 설정. 기본 값이 변경되는 경우 아파치 등의 웹서버 설정을 특별히 해줄 필요는 없다고 함.
net.core.rmem_default = 65536
net.core.rmem_max = 8388608

# 소켓 출력 큐 최대값과 기본값 조정.
# 일반적인 경우의 대용량 Serving을 위한 설정으로 더 적은 시스템콜로 웹페이지를 네트웍 스택에 보낼 수 있음.
# 기본 값이 설정되는 경우 아파치 등의 웹서버 설정을 특별히 해줄 필요는 없다고 함.

net.core.wmem_default = 65536
net.core.wmem_max = 8388608

# TCP layer의 수신 버퍼를 상향 조정
# 대량의 데이터를 클라이언트로 전송하는 경우에는 이 값을 추천. 
net.ipv4.tcp_rmem = 4096 87380 8388608

# TCP layer의 송신 버퍼를 상향 조정 대량의 데이터를 클라이언트로 전송하는 경우에는이 값을 추천.
net.ipv4.tcp_wmem = 4096 65536 8388608

# The tcp_mem variable defines how the TCP stack should behave when it comes to memory usage.
# TCP스택이 메모리를 어떻게 사용할지에 대한 메모리 페이지 단위 설정.
# 순서대로 min pressure max설정이다. tcp_wmem과 tcp_rmem설정에 따른 적정한 크기를 할당한다.
# IA32는 4KB가 한 개의 페이지이다.
# ※ 이 설정 값은 네트워크 성능에 영향을 큰 영향을 줄 수 있으므로 주의가 요구된다.
# {min} {pressure} {max}
net.ipv4.tcp_mem = 4096 4096 4096

# 유저 파일 핸들에 할당되지 않은 커넥션에 대해 몇번을 제거 시도를 할 것인지를 정하는 파라메터.
# 하이로드의 웹서버인 경우 이 값을 7이하로 떨어뜨릴 경우 “TCP: too many of orphaned sockets”와
# “Out of socket memory”에 대한 커널 메시지가 나타날 수 있다.
net.ipv4.tcp_orphan_retries = 7

# 클라이언트의 소켓으로부터 RST을 받아 TIME_WAIT 상태로 가는 경우 즉시 소켓을 종료시킴.
# 웹서버와 같은 유형의 서버에서는 소켓을 열고 닫는 회수가 많으므로 이 쪽을 튜닝하면
# net.ipv4.tcp_max_tw_buckets 값을 줄이는 설정을 해도 됨. 파일 서버와 같은 경우는 이 값을 기본값으로 놓는 것이 좋음.
net.ipv4.tcp_rfc1337 = 1

# SPECWeb99의 권고는 인트라넷 네트워크에서만 사용하는 네트웍인 경우 selective  acknowledgements를 off 시킴으로써 성능이 향상된
다고 함. SPECWeb99의 테스트는 완전한 1-2hop 이내의 네트워크 토폴로지를 가정하였으므로 일반적으로는 이 부분을 on으로 해주는 좋다
는 권고.

# ※ 외부 접속을 받는 네트워크에선 on으로 해야함.
net.ipv4.tcp_sack = 1

# SPECWeb99의 권고는 인트라넷 네트워크에서만 사용하는 서버인 경우 timestamps 생성를 off 시킴으로써 성능이 향상됨.
# SPECWeb99의 테스트는 완전한 1-2hop 이내의 네트워크 토폴로지를 가정하였으므로 일반적으로는
# 이 부분을 on으로 해주는 좋다는 권고. tcp_window_scaling 부분 참조
# ※ 외부 접속을 받는 네트워크에선 on으로 해야함
net.ipv4.tcp_timestamps = 1

# tcp_sack와 tcp_timestamps의 경우와 같은 튜닝 관점이다.
# 단, rmem, wmem과 tcp_rmem, tcp_wmem의 버퍼 상향 조정시에는
# tcp_timestamps와 함께 on 설정을 해주어 윈도크기를 조절하도록 하는 것이 좋다고 권고함.
net.ipv4.tcp_window_scaling = 1

# KEEPALIVE 시간을 줄이면 비정상적으로 stale된 접속을 해제하는 시간을 줄일 수 있음.
net.ipv4.tcp_keepalive_time = 1300

# 소켓의 listen backlog 값 조정으로 동시접속이 몰릴 경우에 대한 최적화
net.ipv4.tcp_max_syn_backlog = 8192

# FIN_TIMEOUT 대기 시간을 줄이면 끊어진 소켓의 소거 시간을 줄일 수 있음.
net.ipv4.tcp_fin_timeout = 30

# 새 접속에서 사용할 수 있는 포트의 사용 가능 범위를 확장.
net.ipv4.ip_local_port_range = 16384 65536

# DOS 공격 중의 하나인 SYN flooding 공격을 막아주도록 On으로 변경.
# 방화벽으로부터 보호되고 있어도 위 공격에 대한 대비책이 없다면 켜주는 것이 좋으나 성능에 영향이 있으며,
# 이 부분을 켜주는 것 보다는 tcp_
net.ipv4.tcp_syncookies = 1

# off상태면 두 네트웍 인터페이스간 IP 패킷 전달을 해제합니다. 
net.ipv4.ip_forward = 0

# 웹서버와 같은 유형의 서버에서 high load에서는 사용자 소켓의 종료 진행에서
# TIME_WAIT 상태가 되는데 이 것의 양이 60초간 지속 된다는 것을 가정하고 이 값을 충분히 높여 주는 것이 좋음.
net.ipv4.tcp_max_tw_buckets = 2000000

# Linux 2.4에서 주의해야할 점.
# 주어진 경로에 대한 ssthread 값이 라우팅 테이블에 캐시되는데 이 값으로 윈도 값 설정이 감소하게 되면
# 이후 10분간의 모든 다른 커넥션에 이 값을 사용하게 되므로 웹서버등에서는 켜주는 것이 좋을 것 같다. 
net.ipv4.route.flush = 1

# 가상 메모리 하부 시스템의 성능 향상. 
# 가상 메모리 및 버퍼 메모리 관리에 대한 성능을 높여줌.
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2

# 브로드캐스브, 멀티캐스트 주소에 ICMP ECHO 요청을 막음. smurf 공격 방지용
#
net.ipv4.icmp_echo_ignore_broadcasts = 1

# SRR 옵션으로 패킷들을 수용한다. IP source routing 을 제어한다. 보통 호스트로
# 향하게 하는 것을 권장한다. TRUE (router) FALSE (host)
#
net.ipv4.conf.all.accept_source_route = 0

#net.ipv4.conf.all.send_redirects=0
#net.ipv4.conf.all.accept_redirects=0
# DOS 공격 중 하나인 IP Spoofing을 Source Route 를 검사해서 방지합니다.
# 방화벽에서 막아주거나 외부에 노출되어 있지 않은 서버 등 공격의 우려가 없다면 끄는 것이 좋음.
# 알 수 없을 경우 on으로 설정해둡니다.
# RFC182에 따른 IP spoof 방지를위한 설정(커널 2.2이상 버전)
#
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

# Log Spoofed Packets, source Routed Packets, Redirect packetes
# ip주소를 스푸핑한다고 예상되는 경우 로그에 기록하기
#
net.ipv4.conf.all.log_martians = 1

# 공유 메모리 최대값 조정
kernel.shmmax=3800000000

# 세마포어 최대값 조정 
# 의미: {배열당 최대 SEM 수}{최대SEM시스템넓이}{SEMOP호출당최대OP수}{최대배열수} 
# 공식: {최대SEM시스템넓이} = {최대 배열 수} x {배열당 최대 SEM 수} (DB2 튜닝문서에 따름)
kernel.sem=1000 32000 32 512

# 메시지큐 시스템 크기 조정
kernel.msgmni = 1024
posted by 티니

댓글을 달아 주세요

  1.  Addr  Edit/Del  Reply BlogIcon 나이데브

    흠. 아직 건들 엄두가 안나는 부분이군요.

    2007.12.30 12:21 신고

Language 2007. 11. 23. 14:08

10진수

16진수

8진수

2진수

ASCII

10진수

16진수

8진수

2진수

ASCII

0

0×00

000

0000000

NULL

64

0×40

100

1000000

@

1

0×01

001

0000001

SOH

65

0×41

101

1000001

A

2

0×02

002

0000010

STX

66

0×42

102

1000010

B

3

0×03

003

0000011

ETX

67

0×43

103

1000011

C

4

0×04

004

0000100

EOT

68

0×44

104

1000100

D

5

0×05

005

0000101

ENQ

69

0×45

105

1000101

E

6

0×06

006

0000110

ACK

70

0×46

106

1000110

F

7

0×07

007

0000111

BEL

71

0×47

107

1000111

G

8

0×08

010

0001000

BS

72

0×48

110

1001000

H

9

0×09

011

0001001

HT

73

0×49

111

1001001

I

10

0×0A

012

0001010

LF

74

0×4A

112

1001010

J

11

0×0B

013

0001011

VT

75

0×4B

113

1001011

K

12

0×0C

014

0001100

FF

76

0×4C

114

1001100

L

13

0×0D

015

0001101

CR

77

0×4D

115

1001101

M

14

0×0E

016

0001110

SO

78

0×4E

116

1001110

N

15

0×0F

017

0001111

SI

79

0×4F

117

1001111

O

16

0×10

020

0010000

DLE

80

0×50

120

1010000

P

17

0×11

021

0010001

DC1

81

0×51

121

1010001

Q

18

0×12

022

0010010

SC2

82

0×52

122

1010010

R

19

0×13

023

0010011

SC3

83

0×53

123

1010011

S

20

0×14

024

0010100

SC4

84

0×54

124

1010100

T

21

0×15

025

0010101

NAK

85

0×55

125

1010101

U

22

0×16

026

0010110

SYN

86

0×56

126

1010110

V

23

0×17

027

0010111

ETB

87

0×57

127

1010111

W

24

0×18

030

0011000

CAN

88

0×58

130

1011000

X

25

0×19

031

0011001

EM

89

0×59

131

1011001

Y

26

0×1A

032

0011010

SUB

90

0×5A

132

1011010

Z

27

0×1B

033

0011011

ESC

91

0×5B

133

1011011

[

28

0×1C

034

0011100

FS

92

0×5C

134

1011100

\

29

0×1D

035

0011101

GS

93

0×5D

135

1011101

]

30

0×1E

036

0011110

RS

94

0×5E

136

1011110

^

31

0×1F

037

0011111

US

95

0×5F

137

1011111

_

32

0×20

040

0100000

SP

96

0×60

140

1100000

.

33

0×21

041

0100001

!

97

0×61

141

1100001

a

34

0×22

042

0100010

"

98

0×62

142

1100010

b

35

0×23

043

0100011

#

99

0×63

143

1100011

c

36

0×24

044

0100100

$

100

0×64

144

1100100

d

37

0×25

045

0100101

%

101

0×65

145

1100101

e

38

0×26

046

0100110

&

102

0×66

146

1100110

f

39

0×27

047

0100111

'

103

0×67

147

1100111

g

40

0×28

050

0101000

(

104

0×68

150

1101000

h

41

0×29

051

0101001

)

105

0×69

151

1101001

i

42

0×2A

052

0101010

*

106

0×6A

152

1101010

j

43

0×2B

053

0101011

+

107

0×6B

153

1101011

k

44

0×2C

054

0101100

'

108

0×6C

154

1101100

l

45

0×2D

055

0101101

-

109

0×6D

155

1101101

m

46

0×2E

056

0101110

.

110

0×6E

156

1101110

n

47

0×2F

057

0101111

/

111

0×6F

157

1101111

o

48

0×30

060

0110000

0

112

0×70

160

1110000

p

49

0×31

061

0110001

1

113

0×71

161

1110001

q

50

0×32

062

0110010

2

114

0×72

162

1110010

r

51

0×33

063

0110011

3

115

0×73

163

1110011

s

52

0×34

064

0110100

4

116

0×74

164

1110100

t

53

0×35

065

0110101

5

117

0×75

165

1110101

u

54

0×36

066

0110110

6

118

0×76

166

1110110

v

55

0×37

067

0110111

7

119

0×77

167

1110111

w

56

0×38

070

0111000

8

120

0×78

170

1111000

x

57

0×39

071

0111001

9

121

0×79

171

1111001

y

58

0×3A

072

0111010

:

122

0×7A

172

1111010

z

59

0×3B

073

0111011

;

123

0×7B

173

1111011

{

60

0×3C

074

0111100

<

124

0×7C

174

1111100

|

61

0×3D

075

0111101

=

125

0×7D

175

1111101

}

62

0×3E

076

0111110

>

126

0×7E

176

1111110

~

63

0×3F

077

0111111

?

127

0×7F

177

1111111

DEL

posted by 티니
TAG ASCII

댓글을 달아 주세요

Language 2007. 11. 23. 14:07
현대 한글 유니코드 값 구하는 공식은 다음과 같다.

[{(초성)×588}+{(중성)×28}+(종성)]+44032

예를 들어, ‘뷁’이라는 글자의 유니코드 값을 구한다면

  • 초성은 ㅂ이므로 7,
  • 중성은 ㅞ이므로 15,
  • 종성은 ㄺ이므로 9가 된다.

이 값을 위 공식에 대입하면 {(7×588)+(15×28)+9}+44032가 된다. 이를 계산하면 48577이 나온다.
곧, ‘뷁’의 10진수 유니코드 값은 48577이다.

이 코드 앞에 &#을 붙이면 된다...

따라서 &#48577;을 쓰면 ‘뷁’을 얻을 수 있다.

원리

이 공식이 성립할 수 있는 까닭은 유니코드에 현대 한글 영역이 가나다순으로 11172글자가 쭉 배열돼 있기 때문이다.

  • 끝에 44032를 더하는 까닭은 첫 번째 현대 한글 ‘가’의 코드가 44032(16진수 U+AC00)이기 때문이다.
  • 초성 값에 588을 곱하는 까닭은 초성이 588(=21×28)글자마다 바뀌기 때문이다. 이때 21은 중성 개수이고 28은 종성 개수이다.
  • 중성 값에 28을 곱하는 까닭은 중성이 28글자마다 바뀌기 때문이다. 이때 28은 종성 개수이다.

초성

  • ㄱ 0
  • ㄲ 1
  • ㄴ 2
  • ㄷ 3
  • ㄸ 4
  • ㄹ 5
  • ㅁ 6
  • ㅂ 7
  • ㅃ 8
  • ㅅ 9
  • ㅆ 10
  • ㅇ 11
  • ㅈ 12
  • ㅉ 13
  • ㅊ 14
  • ㅋ 15
  • ㅌ 16
  • ㅍ 17
  • ㅎ 18

중성
  • ㅏ 0
  • ㅐ 1
  • ㅑ 2
  • ㅒ 3
  • ㅓ 4
  • ㅔ 5
  • ㅕ 6
  • ㅖ 7
  • ㅗ 8
  • ㅘ 9
  • ㅙ 10
  • ㅚ 11
  • ㅛ 12
  • ㅜ 13
  • ㅝ 14
  • ㅞ 15
  • ㅟ 16
  • ㅠ 17
  • ㅡ 18
  • ㅢ 19
  • ㅣ 20

종성
  • 0
  • ㄱ 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
직접 테이블을 보고 싶다면...

posted by 티니

댓글을 달아 주세요

DBMS 2007. 11. 15. 15:30

Understanding the Query Cache

흰콧수염

webmaster@10mbps.com

Last translated on Sep 08. 2004.

5.11 The MySQL Query Cache

MySQL Version 4.0.1 이상부터, qeury cache가 도입되었다. qeury cache가 이용될 경우 클라이언트로부터 입력된 SELECT 쿼리를 캐쉬에 저장한다. 이후 정확히 같은 쿼리가 입력되었을 때, 해당 쿼리를 MySQL 서버에서 실행하지 않고 캐쉬로부터 가져와 클라이언트에게 전달한다.

query cache는 테이블의 내용이 자주 변하지 않고 정확히 같은 쿼리를 반복적으로 사용할 경우 큰 효과를 보여준다.


주의 :

1. query cache는 오래된 data를 클라이언트에게 전달하지 않는다. 테이블의 내용이 변경될 경우, 캐쉬에 저장된 관련 쿼리의 내용을 모두 초기화시킨다.

2. 하나의 서버에 여러 mysqld 데몬을 운영하는 경우에는 동작하지 않는다.



5.11.1 How the Query Cache Operates

모든 query는 클라이언트에게 전달하기 전에 서로 비교하는 과정을 거친다. 따라서 query cache는 아래의 두 query문은 서로 다르게 인식한다.


        SELECT * FROM tbl_name;

        Select * from tbl_name;


query는 동일하게 인식되기 위해서는 정확히 일치해야 한다. 또한 같은 query문이라도 몇몇 상황에서는 다르게 받아들여진다. 다른 database, 다른 protocol 버전, 다른 문자 셑을 가질 경우 각각 서로 다른 query문으로 간주되어 따로 따로 cache 된다.

query cache로부터 결과값이 클라이언트에게 전달되면, 서버는 Qcache_hits 값을 자동 증가시킨다.


특정 테이블의 내용이 변경되면, 해당 테이블로부터 쿼리 cache된 모든 내용은 삭제된다. 테이블의 내용은  INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, 또는 DROP DATABASE와 같은 쿼리로 인하여 변경된다.


query cache는 SELECT SQL_CALC_FOUND_ROWS ...  와  SELECT  FOUND_ROWS() 타입의 쿼리에도 적용된다. FOUND_ROWS()는 선행 query가 cache에 저장되어 있다하더라도 record의 개수 또한 cache에 저장되어 있으므로 정확한 값을 반환한다.


아래의 함수를 포함한 query문은 cache를 이용하지 않는다 :

BENCHMARK()

CONNECTION_ID()

CURDATE()

CURRENT_DATE()

CURRENT_TIME()

CURRENT_TIMESTAMP()

CURTIME()

DATABASE()

ENCRYPT() with one parameter

FOUND_ROWS()

GET_LOCK()

LAST_INSERT_ID()

LOAD_FILE()

MASTER_POS_WAIT()

NOW()

RAND()

RELEASE_LOCK()

SYSDATE()

UNIX_TIMESTAMP() with no parameters

USER()




또 query가 아래와 같은 조건일 경우에도 cached 되지 않는다 :

       

        ❚ 사용자 정의 함수(UDF)가 포함된 경우.

        ❚ 사용자 변수(user variables)가 포함된 경우.

        ❚ mysql의 system database에 있는 테이블을 조회하는 경우.

        ❚ 아래의 형태를 가진 경우 :

       

SELECT ... IN SHARE MODE

SELECT ... INTO OUTFILE ...

SELECT ... INTO DUMPFILE ...

SELECT * FROM ... WHERE autoincrement_col IS NULL


       

        ❚ TEMPORARY tables을 사용하는 경우.

        ❚ table를 사용하지 않는 경우.

        ❚ user가 관련 table에 column 레벨의 권한만을 가진 경우.

 ❚ query가 cache로부터 값을 가져오기 전에 MySQL은 user가 관련 database와 table에 SELECT 권한을 가지고 있는 지 체크한다. 권한이 없을 경우 cached 된 값을 반환하지 않는다.


5.11.2 Query Cache SELECT Options

SELECT 구문에 정의할 수 있는 두 개의 cache 관련 옵션이 있다.


        SQL_CACHE

            query_cache_type이 ON 이거나 DEMAND 인 경우, 결과 값을 cache로부터 반환시킨다.


        SQL_NO_CACHE

            쿼리 결과를 cache 시키지 않는다.


예 :


        SELECT SQL_CACHE id, name FROM customer;

        SELECT SQL_NO_CACHE id, name FROM customer;



5.11.3 Query Cache Configuration

have_query_cache DB 환경 변수는 query cache를 이용할 수 있는 지 여부를 확인할 수 있다.


        mysql> SHOW VARIABLES LIKE 'have_query_cache';

         

Variable_name

Value

have_query_cache

YES


query cache를 이용하기 위한 옵션으로 몇 가지가 있다. 이 옵션들은 /etc/my.cnf 에 정의하거나 mysqld 구동 스크립트에 정의 할 수 있다. query cache 관련 변수는 query_cache_ 로 시작한다.


query cache의 크기를 지정하기 위해서는 query_cache_size를 이용한다. 0으로 설정하면 query cache는 더 이상 사용되지 않는다. 기본값은 0이다.


query cache가 enable 된 경우, query_cache_type 변수는 SELECT 방법에 영향을 준다.


        0 또는 OFF 인 경우 cache시키거나 혹은 cached 된 결과를 가져올 수 없다.

        1 또는 ON 인 경우 SELECT SQL_NO_CACHE 인 구문을 제외하고 cache 기능을 이용한다.

        2 또는 DEMAND 인 경우 SELECT SQL_CACHE 구문만 cache 기능을 이용한다.


클라이언트는 query cache 기능을 이용하고 싶지 않을 경우 아래와 같이 할 수 있다:

        mysql> SET SESSION query_cache_type = OFF;


하나의 query 결과를 caching 하기 위한 최대 값은 query_cache_limit 변수로 수정할 수 있으며, 기본값은 1MB를 가진다.



5.11.4 Query Cache Status and Maintenance

query cache 기능이 존재하는 알고 싶을 경우 아래의 구문을 사용한다.


        mysql> SHOW VARIABLES LIKE 'have_query_cache';

        +------------------+-------+

        | Variable_name        | Value   |

        +------------------+-------+

        | have_query_cache    | YES    |

        +------------------+-------+


좀 더 효율적으로 메모리를 사용하기 위해 FLUSH QUERY CACHE 구문으로 조각모음을 할 수 있다. 그렇다고하여 cache로부터 query된 내용을 삭제하지는 않는다.

query cache로부터 query 결과를 삭제하기 위해서는 RESET  QUERY  CACHE 또는 FLUSH TABLES 구문을 사용한다.

query cache 성능을 모니터링하기 위해서는 SHOW STATUS를 이용한다.


        mysql> SHOW STATUS LIKE 'Qcache%';

        +-------------------------+--------+

        | Variable_name                 | Value    |

        +-------------------------+--------+

        | Qcache_free_blocks            | 36       |

        | Qcache_free_memory          | 138488   |

        | Qcache_hits                   | 79570   |

        | Qcache_inserts                | 27087   |

        | Qcache_lowmem_prunes       | 3114     |

        | Qcache_not_cached           | 22989   |

        | Qcache_queries_in_cache      | 415      |

        | Qcache_total_blocks           | 912      |

        +-------------------------+--------+


SELECT query 전체 구문은 :

          Com_select

        + Qcache_hits

        + queries with errors found by parser


Com_select 값은 :

          Qcache_inserts

        + Qcache_not_cached

        + queries with errors found during columns/rights check

와 같다.


query cache는 가변 길이의 block을 이용한다. 따라서 Qcache_total_blocks 와 Qcache_free_blocks는 분산된 memory 조각을 가르킨다. FLUSH  QUERY  CACHE을 하고 난 뒤에는 하나의 free block만 남게된다.

모든 캐쉬에 저장된 query는 최소 2 block를 가진다. query에 이용된 모든 테이블은 1 block을 갖는다. 그러나 같은 테이블을 2 또는 그 이상의 query에서 조회한다면 1 block을 할당해야한다.

posted by 티니
TAG MySQL

댓글을 달아 주세요

DBMS 2007. 11. 6. 13:47
1. MyISAM

1) 예전의 MySQL 의 Storage Engines 으로 MyISAM 을 사용했었습니다.
    예를 들자면 블로그라던지, 게시판 처럼 한사람이 글을 쓰면 다른 많은 사람들이 글을
    읽는 방식에
최적의 성능을 발휘를 하지요. 지금도 많이 사용하고 있는 방식입니다.
2) 제공하는 웹서비스다 그닥 크지 않다면 이것을 사용해도 괜찮다고 생각을 합니다.

2. InnoDB

1) 트랜잭션-세이프 스토리지 엔진입니다.
2) MyISAM 과 비슷하지만 ORACLE 처럼 많은 기능을 지원을 합니다.
    (* commit, rollback, 장애복구, row-level locking, 외래키 등)
3) 다수의 사용자 동시접속과 퍼포먼스가 증가하여 대용량 데이터를 처리할 때 최대의
    퍼포먼스를 내도록 설계되었습니다.
    CPU효율은 어느 디스크 기반의 데이터 베이스와 비교해도 손색이 없고
    자체적으로 메인 메모리 안에 데이터 캐싱과 인덱싱을 위한 버퍼 풀(pool)을 관리합니다.
4) 테이블과 인덱스를 테이블 스페이스에 저장을 하고 테이블 스페이스는 몇개의
    서버파일이나 디스크 파티션으로
구성되어있습니다.
    이것은 MyISAM 과 다른 점인데, MyISAM은 테이블과 인덱스를 각각 분리된 파일로
    관리합니다.
    여기서 중요한것이 이제 InnoDB 를 제대로 사용을 하기 위해서는 테이블 스페이스 라는
    개념을 파악을 하셔야합니다.
    이것에 대해서는 밑에서 따로 언급을 하겠습니다.

5) InnoDB 테이블은 OS의 파일 사이즈 한계가 2GB이더라도 상관없이 어느 크기나
    가질 수 있습니다.
6) InnoDB는 높은 퍼포먼스가 필요한 대용량 사이트에 적합합니다.

3. InnoDB 사용하기

1) InnoDB 는 MyISAM 과 공유하는 메모리도 있지만 별도의 Buffer pool을 가지고 있으니까

    InnoDB 전용 DB를 구성한다면 MyISAM 이 사용하는 record_boffer 과 key_buffer 에
    너무 많은 메모리를 할당하지 마세요.
 
2) InnoDB 설정
   ㄱ) M
ySQL을 설치한 폴더 아래에 ibdata 와 iblogs 폴더를 생성합니다.
   
ㄴ) my.ini 파일 설정을 변경
      * innodb_buffer_pool_size
        - 현재 자신의 시스템 메모리의 50~80% 사이로 만듭니다.
           x86 시스템에서는 2G 이상 설정을 할 수 없습니다.
      * innodb_additional_mem_pool_size
        - 데이터 사전정보 나 내부의 데이터 구조 정보를 담는 메모리 입니다.
           보통 2M 정도 잡아주면 아주 많은 테이블을 사용한다면 좀 늘려주시면 됩니다.
           만약 메모리공장이 부족하면 error log 에 warning 메서지를 남기니 그때 늘려주세요
      * innodb_flush_log_at_trx_commit
        - insert, update 등 데이터 삽입과 관계가 있습니다.
           commit 을 하였을때 그 즉시 commit 된 데이터를 log file 에 기록할지 안할지를
           설정합니다.
           로그파일을 기록할 경우 갑작스러운 경우 데이터 손실을 막을 수 있지만
           매번 로그를 기록하므로 속도가 저하됩니다.
           1 일경우 기록을 하는것이고, 0일 경우 기록을 안하는것입니다.
      * innodb_log_file_size
        - 트랜잭션을 기록하는 로그 파일의 크기를 결정하는 옵션입니다.
           inno_buffer_pool_size 옵션은 성능을 위한것이지만 시스템이 다운되었을 경우
           데이터가 손실이 되므로,
 이것을 방지하기 위해 log file 을 만들어서 commit 될때마다
           로그에 기억을 하고 자동복구를 합니다.
           로그파일은 무한정 계속 커지는 것이 아니라 일정한 크기와 갯수를 가지고
           순환식으로 처리되므로 크기는
inno_buffer_pool_size 의 15% 정도로 설정을 합니다.
           만약 메모리가 1기가이면 inno_buffer_pool_size = 512M 이고,
           innodb_log_file_size = 80M 가 됩니다.
      * innodb_log_buffer_size
        - 로그 파일을 기록하기 위한 버퍼 사이즈입니다.
          트랜잭션이 작거나 거의 없다면 크게 잡는것은 낭비이므로 보통 1M~8M 사이로
          설정을 합니다.

      [mysqld
]
      innodb_data_home_dir="/var/lib/mysql/ibdata/"
      innodb_log_group_home_dir="/var/lib/mysql/iblogs"
      innodb_data_file_path=ibdata1:10M:autoextend:max:1000M
      innodb_additional_mem_pool_size=3469K
      innodb_flush_log_at_trx_commit=1
      innodb_log_buffer_size=2M
      innodb_buffer_pool_size=256M
      innodb_log_file_size=40M
      innodb_thread_concurrency=8
      innodb_log_archive=0
   ㄷ) my.ini 을 수정했으면 mysql 서버를 재시작합니다.

 3) InnoDB 테이블 만들기
   create table test_inno (
   ~
   )type=innodb;
   으로 맨 마지막에 type=innodb; 라고 명시해주시면 됩니다.

 4) InnoDB 트랜잭션 사용
  ㄱ) 트랜잭션을 사용하기 위해서는 처음에 set autocommit=0; 이나 begin; 을
        선언해야 합니다.
        선언 후 데이터 변경이 있을 때, 이상이 없을 경우는 commit를 하고,
        이상이 있을 경우 rollback을 실행합니다.
        오라클이랑 비슷하다고 보시면 되요
      mysql>set autocommit=0; //begin; 같음
      mysql>insert into test_inno values (1,'aaa');
      mysql>select * from test_inno; //현재창에서는 입력한 내용이 보이지만
                                                    다른창에서는 보이지않음
      mysql>commit; //다른창에서 select를 할경우 입력한 값이 보임

4. InnoDB 테이블 스페이스

 좀전에 MyISAM 과 차이점이 InnoDB 는 테이블과 인덱스를 테이블 스페이스 라는곳에
 저장을 한다고 하였습니다.
 그런데 사용을 하다보니 점차 DB가 늘어나서 테이블 스페이스가 FULL 이 발생하는 경우가
 생깁니다.

 4.0.x 버전부터는 일일이 할 필요가 없다는 글이 있는데 그래도 FULL이 발생하였을 때
 대처방법을 알면 좋겠죠
 my.ini 에서 아래와 같이 추가를 해주면 안됩니다.
 innodb_data_file_path = /ibdata/ibdata1:1000M:autoextend 라고 할 경우
 innodb_data_file_path = /ibdata/ibdata1:1000M;/ibdata/ibdata2:1000M:autoextend 라고
 ibdata2를 추가하면 안됩니다.

 아래와 같은 과정대로 하세요
 1. Use mysqldump to dump all your InnoDB tables.
 2. Stop the server.
 3. Remove all the existing tablespace files.
 4. Configure a new tablespace.
 5. Restart the server.
 6. Import the dump files.

 즉, 일단 mysqldump 로 InnoDB 테이블의 전체 덤프뜬 다음 MySQL 서버를 중지시킵니다.
 그다음 테이블스페이스 파일을 모두 지우고 테이블스페이스를 아래와 같이 추가를 합니다.
 innodb_data_file_path = /ibdata/ibdata1:1000M;/ibdata/ibdata2:1000M:autoextend
 그다음 MySQL 서버를 구동시킨다음 처음에 덤프뜬 파일을 import 하시면 됩니다.

출처 - 모 까페.. (페이지 저장해놨다가 올리려니, 까페이름이 기억이 안나네요..)

posted by 티니

댓글을 달아 주세요

리눅스 2007. 8. 21. 19:24
오늘 CentOS 4.5 plus 미러를 enabled 시켜서 사용하는 시스템을
yum으로 업데이트 시키다 보니 아래와 같은 문제가 발생했다.
[root@localhost]# yum update
Loading "fastestmirror" plugin
Setting up Install Process
Setting up repositories
Loading mirror speeds from cached hostfile
Reading repository metadata in from local files
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Package perl-libwww-perl.noarch 0:5.805-1.1.1 set to be updated
--> Running transaction check
--> Processing Dependency: perl(Compress::Zlib) for package: perl-libwww-perl
--> Finished Dependency Resolution
Error: Missing Dependency: perl(Compress::Zlib) is needed by package perl-libwww-perl

가끔씩 패키지 버전이 올라가면서 문제가 생기는 일이 발생하기에
아무생각없이 yum list perl* 을 날렸는데....
얼레.. Zlib 패키지가 없다??

한참을 삽질하다가 결국 센트 메인테이너에게 질문을 날렸고.. 급 후회를 했다 ㅜ.ㅜ
A: please read this http://bugs.centos.org/view.php?id=2255
A: you probably have a non-CentOS libwww-perl
A: whoops
A: it is indeed a bug ;)
A: workaround is in that bugreport

왜 질문하기전에 bugs.centos.org를 검색하지 않았을까.....
가장 기초적인 실수를 해서 그런지 얼굴이 다 화끈거렸다.
내가 늘 강조하는게 '질문하기전 검색부터' 인데...

결론적으로는...
http://mirror.centos.org/centos-4/4.5/fasttrack/
위 URL에 있는 CentOS-fasttrack.repo 파일을 /etc/yum.repos.d/ 안에 넣어주면 되는것..
[root@localhost]# cd /etc/yum.repos.d/
[root@localhost]# wget http://mirror.centos.org/centos-4/4.5/fasttrack/CentOS-fasttrack.repo
[root@localhost]# yum update


그리고 저사람이 나에게 마지막으로 날린 결정적인 한마디...
'엔드유저도 아닌 당신이 이런 실수를 할지 몰랐다. 요즘 바쁜가보다.'
.....
부끄러워서 할 말을 잃었다... ㅠ_ㅠ
posted by 티니
TAG CentOS, Linux

댓글을 달아 주세요

  1.  Addr  Edit/Del  Reply BlogIcon 나이데브

    .... 무서운 실수.
    전 아직 그런 이야기까지 들을 수준은 아닌가봐요.

    2007.09.08 21:18 신고

리눅스 2007. 3. 10. 21:00
이번에 회사에서 6TB DAS 스토리지 2대를 구입했다. (모델명: Dell社의 MD1000)

원래 3월 6일에 입고 예정이었던 스토리지가 3월 7일과 3월 8일에 양일에 걸쳐 도착했다.
그리고 델 엔지니어가 3월 9일에 도착해서 스토리지를 뜯었다.
(도착하는것부터가 아주 짜증나게 만드는 델-_-..)

다 뜯어놓고 하는말이 지들이 해줄 수 있는건 '뜯어주는것과 RAID 세팅까지만' 이란다-_-;;
(어짜피 첨부터 바라지도 않았으니 별로 신경 안쓴다)
그래서 걍 레이드나 잡으라고 하고 커피나 한잔 홀짝홀짝..

헤더에 있는 300G HDD 2개는 RAID-1로 구성해서 미러링을 하도록 하고..
스토리지의 500G HDD 15개는 RAID-5로 구성해서 14개는 돌리고 1개는 Hot Spare로..

RAID 세팅도 끝났으니 이제 OS 인스톨링...

두둥..
헤더가 /dev/sda로 잡혀야 되는데 /dev/sdb로 잡힌다..
기존 스토리지와 반대로 잡혀 있어서 추후 헷갈릴까봐 이래저래 삽질했었으나..
별 소득 없이 그냥 쓰기로 결정..
첫번째 테클은 이렇게 넘어갔다.

꽤나 크리티컬한 테클은 바로 여기서부터...
리눅스 부팅하고 root로 들어가서 fdisk -l 했더니 아래와 같이 잘 잡혀있는것을 확인..
[root@str1 ~]# fdisk -l
Disk /dev/sda: 6494.2 GB, 6494258987008 bytes
255 heads, 63 sectors/track, 789548 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

fdisk에선 2TB 이상의 파티션을 지원못하니까.. parted를 이용해서 생성해야 된다.
[root@str1 ~]# parted /dev/sda
GNU Parted 1.6.19
Copyright (C) 1998 - 2004 Free Software Foundation, Inc.
This program is free software, covered by the GNU General Public License.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 
Using /dev/sda
(parted) mklabel gpt
(parted) p
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
(parted) mkpart
Partition type?  [primary]?                                              
File system type?  [ext2]?                                               
Start? 0                                                                 
End? 6193408                                                             
(parted) p                                                               
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
1          0.017 6193407.983  ext2
(parted) quit                                                            
Information: Don't forget to update /etc/fstab, if necessary.

자 여기까지.. 파티션을 만들어 주는 과정에는 전~~~혀 아~~무 문제 없이 잘!! 됐다.
그러나 나의 스트레스 신경을 Power on 해주신 멋진 분!!
[root@str1 ~]# mkfs -t ext3 /dev/sda1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
792756224 inodes, 1585512439 blocks
36325948 blocks (2.29%) reserved for the super user
First data block=0
Maximum filesystem blocks=1589641216
48386 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544
 
Writing inode tables: done                           
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information:
SCSI error : <0 2 0 0> return code = 0x6000000
end_request: I/O error, dev sda, sector 12643992930
SCSI error : <0 2 0 0> return code = 0x6000000
end_request: I/O error, dev sda, sector 12661234252
...
...
done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

아니 왜! 기존에 쓰던 장비도 아닌데 I/O 에러가 뜨냔 말이다 -_-;;
그것두 두대 스토리지 동일하게... -_-;
여하튼 내 경험상 저건 파일시스템이 깨졌을때 나오는 메시지니까..
다시한번 파티션 날리고 동일하게 재생성...
[root@str1 ~]# parted /dev/sda
GNU Parted 1.6.19
Copyright (C) 1998 - 2004 Free Software Foundation, Inc.
This program is free software, covered by the GNU General Public License.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 
Using /dev/sda
(parted) p                                                               
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
1          0.017 6193407.983  ext3                             
(parted) rm 1                                                            
(parted) p                                                               
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
(parted) mkpart
Partition type?  [primary]?                                              
File system type?  [ext2]?                                               
Start? 0                                                                 
End? 6193408                                                             
(parted) p                                                               
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
1          0.017 6193407.983  ext3
(parted) quit                                                            
Information: Don't forget to update /etc/fstab, if necessary.

[root@str1 ~]# mkfs -t ext3 /dev/sda1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
792756224 inodes, 1585512439 blocks
36325948 blocks (2.29%) reserved for the super user
First data block=0
Maximum filesystem blocks=1589641216
48386 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544
 
Writing inode tables: done                           
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
 
This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

얼레? 이번엔 또 문제 없이 잘 생성이 되네 그려?-_-;;
(이넘이 대체 나한테 무슨 원한이 있길래 ㅡ.ㅡ;;;)
아무 문제 없이 잘 진행되었지만 찝찝한 기분을 떨쳐버릴 수가 없는 관계로..
디스크에 read/write 테스트를 통해서 괜찮은지 확인하려고 badblocks를 이용..
[root@str1 ~]# badblocks -svw /dev/sda1
badblocks: 파일이 너무 큽니다 while trying to determine device size

헉쓰-_-;;;;;
파티션이 너무 크신감 -_-a..
어쩔 수 없이 e2fsck의 -c 옵션을 이용.. non-destructive read-write 테스트로 시도..
[root@str1 ~]# e2fsck -cvk /dev/sda1
e2fsck 1.35 (28-Feb-2004)
Checking for bad blocks (read-only test):
... [1번부터 15번까지 열심히 진행-.-]
...
...
Pass 1: Checking inodes, blocks, and sizes
 
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
 
/dev/sda1: ***** FILE SYSTEM WAS MODIFIED *****
 
      11 inodes used (0%)
       1 non-contiguous inode (9.1%)
         # of inodes with ind/dind/tind blocks: 0/0/0
24909500 blocks used (1%)
       0 bad blocks
       1 large file
 
       0 regular files
       2 directories
       0 character device files
       0 block device files
       0 fifos
       0 links
       0 symbolic links (0 fast symbolic links)
       0 sockets
--------
       2 files

뭐.. 테스트상으로는 대략 아무 문제가 없으니 일요일부터 데이터 이전작업을 할 계획..
그러나 여전히 찜찜한 기분은 떨쳐 버릴수가 없단 말이지... 쩝..
posted by 티니

댓글을 달아 주세요

  1.  Addr  Edit/Del  Reply BlogIcon LanCome

    전 언제쯤 저런 제품을 만질수잇을까요 ㅠㅠ

    2007.03.10 21:58
  2.  Addr  Edit/Del  Reply BlogIcon 아희

    ㅋㅋㅋㅋ,,,,, 스트레스 대박이었겠구나-, : ),,,, ㅋㅋㅋㅋㅋ
    화이팅-, : ),,거턈,, 첫만남부터- ' -'a,,, 고생쥼 했네-, ㅋㅋㅋ
    첨에 속줌 썩였으니, 말 잘 들으려니,,,(과연;;),,, ' ㅁ'/;;; 힘내라그!!ㅎ

    2007.03.12 13:10 신고
  3.  Addr  Edit/Del  Reply BlogIcon 얀비군

    어이쿠.. 좋은놈 쓰는군요. 돈이 없어 인텔 SS4000-E를 구입해서 썼었는데.. '쑤뤠기-_-'
    저렴한맛에 구입하긴 했으나 써먹을려고 하니 계속 말썽이더군요.
    6TB라.. 음.. 음.. -_

    2007.03.13 12:02
    •  Addr  Edit/Del BlogIcon 티니

      더블에스 사천 음.. 나름 괜찮던데.....
      저처럼 서버가 거부를 하는건 아닌지-_-;;

      2007.03.13 16:55 신고
  4.  Addr  Edit/Del  Reply BlogIcon 얀비군

    가끔 쓸때는 모르겠는데 조그마한 서비스라도 돌리고 트래픽좀 나오면 뻗고 뻑나고 난리도 아니더라구요. ㅎㅎ 나랑 안맞았던건가..

    2007.03.13 20:46