DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

myisamchk - MyISAM 테이블-관리 유틸리티

DBMS 2
MySQL 가이드
클라이언트 및 유틸리티 프로그램
myisamchk - MyISAM 테이블-관리 유틸리티
작성자
admin
작성일
2021-02-19 10:58
조회
1586

myisamchk - MyISAM 테이블-관리 유틸리티

myisamchk 일반 옵션
myisamchk 검사 옵션
myisamchk 복구 옵션
기타 myisamchk 옵션
myisamchk 메모리 사용

myisamchk 유틸리티는 데이터 베이스 테이블 검사, 복구, 또는 최적화를 위한 정보를 가져온다. myisamchk는 MyISAM 테이블과 함께 동작한다 (데이터 및 인덱스를 저장하기 위해 .MYD 및 .MYI 파일을 가지고 있는 테이블).
myisamchk를 다음과 같이 호출한다:



shell> myisamchk [options] tbl_name ... 

options은 myisamchk을 어떻게 구동시킬지를 나타낸다. 옵션들에 대해서는 다음 섹션에서 설명하기로 한다. myisamchk --help을 호출하면 사용 가능한 옵션을 볼 수가 있다.

아무런 옵션을 사용하지 않으면, myisamchk은 디폴트로 테이블 검사만을 실행한다. 보다 많은 정보를 얻기 위해서 또는 myisamchk로 하여금 정확한 연산을 하도록 만들기 위해서는, 다음 섹션에서 설명하는 방식으로 옵션을 지정하도록 한다.

tbl_name은 여러분이 검사 또는 복구하고자 하는 데이터 베이스 테이블이다. 만일 여러분이 데이터 베이스 디렉토리가 아닌 다른 곳에서 myisamchk를 구동 시킨다면, 반드시 데이터 베이스 디렉토리 경로를 지정해 주어야 하는데, 그 이유는 myisamchk가 데이터 베이스 위치를 모르기 때문이다. 사실, myisamchk는 여러분이 작업을 하고 있는 파일이 데이터 베이스 디렉토리에 있는지에 대해서는 관여를 하지 않는다.

여러분은 데이터 베이스 테이블과 상응하는 파일을 복사해서 다른 위치에 저장한 후에 그곳에서 복구 연산을 실행할 수 있다.

여러분이 원하기만 한다면 myisamchk 명령어 라인에서 테이블 이름을 지정할 수가 있다. 또한 테이블의 인덱스 파일 (.MYI 접미사를 갖고 있는 파일)을 명명함으로써 하나의 테이블을 지정할 수가 있다. 이를 통해서 여러분은 *.MYI를 사용해서 디렉토리에 있는 모든 파일을 지정할 수 있게 된다. 예를 들면, 여러분이 데이터 베이스 디렉토리에 있다면, 아래와 같이 그 디렉토리에 있는 모든 MyISAM 테이블을 검사할 수가 있다:



shell> myisamchk *.MYI 

만일 여러분이 데이터 베이스 디렉토리에 없다면, 그 디렉토리의 경로를 지정해 줌으로써 거기에 있는 모든 테이블을 검사할 수가 있다:



shell> myisamchk /path/to/database_dir/*.MYI 

또한, 여러분은 MySQL 데이터 디렉토리 경로를 와일드 카드를 사용해서 지정해 주면 모든 데이터 베이스에 있는 모든 테이블까지도 검사를 할 수 있게 된다:



shell> myisamchk /path/to/datadir/*/*.MYI 

모든 MyISAM 테이블을 쉽고 빠르게 검사할 수 있는 방법은 다음과 같다:



shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI 

만일 여러분이 모든 MyISAM 테이블을 검사해서 깨져 있는 (corrupted) 테이블을 복구하고자 한다면, 아래의 명령어를 사용하면 된다:



shell> myisamchk --silent --force --fast --update-state \ 

--key_buffer_size=64M --sort_buffer_size=64M \

--read_buffer_size=1M --write_buffer_size=1M \

/path/to/datadir/*/*.MYI


이 명령어는 여러분이 64MB 이상의 메모리 여유가 있다는 가정하에 실행된 것이다.

여러분이 myisamchk를 구동시키는 동안에는 다른 어떤 프로그램도 동일 테이블을 사용하지 않도록 해야 한다. 그렇지 않으면, 여러분이myisamchk를 구동 시킬 때, 아래와 같은 에러 메시지가 나오게 된다:



warning: clients are using or haven't closed the table properly   

이 경고문은 여러분이 다른 프로그램(mysqld 서버와 같은)이 업데이트를 아직 끝마치지 않았거나 또는 올바르게 닫히지가 않은 테이블을 검사하고자 시도한다는 것을 의미하는 것이다.

만일 mysqld이 구동 중이라면, FLUSH TABLES를 사용해서 메모리에 아직 남아 있는 테이블 수정 내용을 우선 플러시 하도록 만들어야 한다. 그런 후에, myisamchk를 사용하는 동안에는 다른 어떤 프로그램도 그 테이블을 사용하지 못하도록 해야 한다. 이런 문제를 해소하기 위한 가장 쉬운 방법은 myisamchk를 사용해서 테이블을 검사하는 대신에 CHECK TABLE를 사용하는 것이다.


myisamchk 일반 옵션

이 섹션에서는 myisamchk가 수행하는 모든 타입의 테이블 관리 연산용 옵션에 대해서 설명하기로 한다.


  • --help, -?
    도움말을 출력한 후에 종료.
  • --debug=debug_options, -# debug_options
    디버깅 로그를 작성한다. debug_options 스트링은 종종 'd:t:o,file_name'이 된다.
  • --silent, -s
    침묵 모드 (Silent mode). 에러가 발생될 때에만 결과를 작성한다. -s를 두 번 사용하면 (-ss) myisamchk가 아주 침묵 모드가 된다.
  • --verbose, -v
    상세 모드. 프로그램이 실행하고 있는 사항에 대해 자세한 정보를 표시한다. 이것은 -d 와 -e를 사용해서 실행시킬 수가 있다. -v를 여러 번 사용할 수도 있다 (-vv, -vvv).
  • --version, -V
    버전 정보를 표시한 후에 종료.
  • --wait, -w
    테이블이 잠겨 있는 경우에 에러와 함께 종료하는 대신에, 테이블이 풀릴 때까지 대기를 한다. 만일 외부 잠금을 비 활성화 한 상태로 mysqld를 구동 시킨다면, 테이블은 또 다른 myisamchk 명령어에 의해서만 잠길 수 있다는 점을 알아두자.

여러분은 --var_name=value 신텍스를 사용해서 아래의 변수들을 설정할 수도 있다:



Variable Default Value
decode_bits 9
ft_max_word_len version-dependent
ft_min_word_len 4
ft_stopword_file built-in list
key_buffer_size 523264
myisam_block_size 1024
read_buffer_size 262136
sort_buffer_size 2097144
sort_key_blocks 16
stats_method nulls_unequal
write_buffer_size 262136

가능한 myisamchk 변수 및 이들 변수의 디폴트 값은 myisamchk --help를 사용해서 알아볼 수가 있다:

sort_buffer_size는 정렬 키에 의해 키가 복구될 때 사용되며, 여러분이 -recover를 사용하는 경우는 일반적인 경우가 된다.

key_buffer_size는 여러분이 --extend-check를 가지고 테이블을 검사하거나 또는 삽입되는 키 열로 키를 복구할 때 (일반 삽입의 경우) 사용된다. 키 버퍼를 통한 복구는 아래와 같은 경우에 사용된다:


  • --safe-recover를 사용하는 경우.
  • 키 정렬을 위해 필요로 한 임시 파일이 키 파일을 직접 생성할 때 보다 두 배 이상 큰 경우. 이러한 경우는 CHAR, VARCHAR, 또는 TEXT 컬럼에 대한 키 값을 크게 가지고 있을 때 종종 나타나는데, 그 이유는 정렬 연산이 완벽한 키 값을 저장하기 때문이다. 만일 여러분이 임시 공간을 많이 가지고 있고 myisamchk를 사용해서 정렬을 복구 한다면, --sort-recover 옵션을 사용하도록 한다.

키 버퍼를 통한 복구는 정렬을 사용하는 것 보다 디스크 공간을 덜 사용하지만, 속도는 더 느려지게 된다.

만일 보다 빠른 복구를 하고자 한다면, key_buffer_size 와 sort_buffer_size 변수를 사용 가능한 메모리의 25% 정도로 늘려 준다. 이 두 변수는 모두 크게 만들 수가 있는데, 그 이유는 한번에 하나만 사용되기 때문이다.

myisam_block_size는 인덱스 블록용으로 사용되는 크기이다.

stats_method는 --analyze 옵션이 주어졌을 때 인덱스 통계 수집을 위해서 NULL 값을 어떻게 다루어야 하는지를 나타낸다. 이것은 myisam_stats_method 시스템 변수와 비슷하게 동작을 한다. MySQL 5.0의 경우, stats_method는 MySQL 5.0.14에서 추가 되었다. 이 보다 오래된 버전의 경우, 통계 수집 방식은 nulls_equal과 같다.

ft_min_word_len 및 ft_max_word_len은 FULLTEXT 인덱스에 대한 최소 및 최대 문자 길이 (word length)를 나타낸다. ft_stopword_file은 스톱워드 (stopword) 파일 이름이다. 다음과 같은 환경에서는 이것을 설정해야 한다.

만일 myisamchk를 사용해서 테이블 인덱스 수정 연산 (예를 들면 복구 또는 분석)을 실행 한다면, FULLTEXT 인덱스는 여러분이 다른 것을 지정하지 않는 한 최소 및 최대 문자 길이에 대한 디폴트 풀-텍스트 파라미터와 스톱워드 파일을 사용해서 재 구축된다. 이 결과 쿼리에서 문제가 발생한다.

이러한 파라미터들은 서버에만 알려져 있기 때문에 문제가 발생하는 것이다. 이것들은 MyISAM 인덱스 파일에는 저장되지 않는다. 서버에서 최소 및 최대 문자 길이 또는 스톱워드를 수정할 때 이러한 문제를 발생 시키지 않기 위해서는, mysqld용으로 사용한 것과 같은 ft_min_word_len, ft_max_word_len, 그리고 ft_stopword_file값을 myisamchk에 지정한다. 예를 들면, 최소 문자 길이를 3으로 설정을 했다면, myisamchk를 사용해서 아래와 같이 테이블을 복구할 수가 있다:



shell> myisamchk --recover --ft_min_word_len=3 tbl_name.MYI

풀-텍스트 파라미터에 대해서 myisamchk 및 서버가 동일한 값을 확실하게 사용하도록 하기 위해서는, 옵션 파일의 [mysqld] 및 [myisamchk] 섹션 모두에 이것을 지정하도록 한다:



[mysqld]
ft_min_word_len=3
[myisamchk]
ft_min_word_len=3


myisamchk를 사용할 수 있는 다른 방법으로는, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE, 또는 ALTER TABLE를 사용하는 것이다. 이러한 명령문들은 서버가 실행하는 것이며, 서버는 올바른 풀-텍스트 파라미터 값을 알게 된다.


myisamchk 검사 옵션

myisamchk는 아래 옵션을 사용해서 테이블 체크 연산을 실행한다:


  • --check, -c
    테이블 에러를 체크한다. 다른 연산 타입을 명확하게 지정하지 않을 경우에는 디폴트로 이것을 실행한다.
  • --check-only-changed, -C
    마지막 체크를 한 이후에 변경된 테이블만 체크한다.
  • --extend-check, -e
    테이블을 매우 철저하게 체크한다. 테이블에 인덱스가 많으면 속도가 매우 느려진다. 이 옵션은 아주 특별한 경우에만 사용해야 한다. 일반적으로는, myisamchk 또는 myisamchk --medium-check는 테이블에 에러가 있는지를 체크할 때 사용한다. 만일 여러분이 --extend-check를 사용하고 메모리가 많이 있다면, key_buffer_size 변수 값을 크게 해 줌으로써 복구 연산을 보다 빠르게 진행 시킬 수가 있다.
  • --fast, -F
    올바르게 닫히지 않은 테이블만 체크한다.
  • --force, -f
    myisamchk를 통해 테이블에서 에러를 발견하게 되면, 자동으로 복구 연산을 실시한다. 복구 타입은 --recover 또는 -r 옵션을 가지고 지정한 것과 같게 된다.
  • --information, -i
    체크한 테이블 정보를 출력한다.
  • --medium-check, -m
    --extend-check 연산 보다는 빠르게 체크를 진행한다. 이것은 모든 에러의 99.99%를 찾아주기 때문에, 대부분의 경우에 이것을 사용하는 것이 좋다.
  • --read-only, -T
    테이블이 검사되었음을 표시하지 않는다. 외부 잠금을 사용하지 않은 채로 mysqld를 구동할 때와 같이, 잠금을 사용하지 않는 어플리케이션이 사용하는 테이블을 검사하기 위해 myisamchk를 사용하는 경우에 유용하다.
  • --update-state, -U

    검사한 테이블이 깨졌는지를 알려주기 위해 테이블 체크 정보를 .MYI 파일에 저장한다. 이 옵션은 --check-only-changed 옵션 효과를 전체적으로 얻기 위해서는 사용할 수 있지만, mysqld 서버가 그 테이블을 사용하고 있고 여러분이 외부 잠금을 비 활성화 시킨 채로 구동 시키는 경우에는 이 옵션을 사용할 수 없다.
myisamchk 복구 옵션

myisamchk는 테이블 복구 연산용으로 다음과 같은 옵션을 사용한다:


  • --backup, -B
    .MYD 파일을 file_name-time.BAK 형태로 백업한다.
  • --character-sets-dir=path
    문자 셋이 설치되어 있는 디렉토리.
  • --correct-checksum
    테이블용 체크섬 (checksum)을 교정한다.
  • --data-file-length=len, -D len
    데이터 파일의 최대 길이 (데이터 파일이 “가득 차는 (full)” 경우에 이것을 재 생성할 때).
  • --extend-check, -e
    데이터 파일로부터 가능한 모든 열을 복구하기 위한 시도를 한다. 일반적인 경우, 이것은 많은 수의 가비지 (garbage) 열도 함께 찾는다. 꼭 필요한 경우가 아니면 이 옵션을 사용하지 않도록 한다.
  • --force, -f
    종료하는 대신에 이전 중간 파일 (tbl_name.TMD과 같은 이름을 가지고 있는 파일)을 겹쳐 쓴다.
  • --keys-used=val, -k val
    myisamchk의 경우에는, 이 옵션 값이 업데이트가 되는 인덱스를 가리키는 비트-값 (bit-value)이 된다. 옵션의 각 바이너리 비트 값은 테이블 인덱스에 대응이 되며, 이 때 첫 번째 인덱스는 비트 0 이 된다. 옵션 값 0 은 모든 인덱스 업데이트를 비 활성화 시키는데, 보다 빠른 삽입을 실행하기 위해서 사용할 수가 있다. 비 활성화된 인덱스는 myisamchk -r을 사용해서 다시 활성화 시킬 수가 있다.
  • --max-record-length=len
    myisamchk가 열을 가지게 위한 메모리를 할당받지 못하는 경우에는, 주어진 길이보다 긴 열은 건너 띄도록 한다.
  • --parallel-recover, -p
    -r 및 -n과 같은 형태의 기법을 사용하지만, 다른 쓰레드를 사용해서 모든 키를 병렬로 생성한다. 아직은 베타 테스트 중인 코드이다.
  • --quick, -q
    데이터 파일을 수정하지 않기 때문에 보다 빠른 복구를 실행한다. 이 옵션을 두 번 지정하면, 키가 중복되는 경우에는 myisamchk가 원래의 데이터 파일을 수정하게 된다.
  • --recover, -r
    유니크 (unique)하지 않은 유니크 키를 제외하고는 거의 모든 문제를 해결할 수 있는 복구를 실행한다. 테이블 하나를 복구할 경우에는, 이 옵션을 먼저 시도해 보도록 한다. -recover를 사용해서는 테이블을 복구할 수 없다고 myisamchk가 보고하는 경우에만 --safe-recover를 시도한다. (--recover가 실패하는 경우에도, 데이터 파일은 피해를 입지 않은 채로 남아 있게 된다.) 사용할 수 있는 메모리가 많이 있다면, sort_buffer_size의 크기를 늘리도록 한다.
  • --safe-recover, -o
    모든 열을 순서대로 읽은 후에 찾은 열을 기반으로 모든 인덱스 트리를 업데이트하는 방식으로 복구를 진행한다 (이전 버전 방식). 이 방식은 -recover 방식 보다는 매우 느리게 실행되지만, -recover가 처리하지 못하는 특이한 경우에도 복구를 진행한다. 이 복구 방식은 -recover 보다는 디스크 공간을 덜 사용한다. -recover를 사용해서 우선 복구를 실행한 후에,-recover가 실패하는 경우에만 --safe-recover를 실행하도록 한다. 사용할 수 있는 메모리가 많다면, key_buffer_size의 값을 늘리도록 한다.
  • --set-character-set=name
    테이블 인덱스가 사용한 문자 셋을 변경 시킨다. 이 옵션은 5.0.3 이후에 --set-collation으로 대체 되었다.
  • --set-collation=name
    테이블 인덱스를 정렬하기 위한 콜레션 (collation)을 지정한다. 문자 셋 이름은 콜레션 이름의 처음 부분의 의미를 가진다. 이 옵션은 MySQL 5.0.3에서 추가 되었다.
  • --sort-recover, -n
    임시 파일이 비록 클 경우에라도 myisamchk로 하여금 키 해석을 위한 정렬을 실행하도록 만든다.
  • --tmpdir=path, -t path
    정렬용 임시 파일을 위해서 사용하는 디렉토리의 경로. 이것을 설정하지 않으면, myisamchk 는 TMPDIR 환경 변수 값을 사용한다. Tmpdir는 임시 파일을 생성하기 위한 라운드-로빈 방식으로 연속적으로 사용된 디렉토리 경로 리스트로 설정될 수 있다. 디렉토리 이름간의 구분 문자는 유닉스에서는 콜론 (‘:’)이고 윈도우, 넷웨어, 그리고 OS/2에서는 세미 콜론 (‘;’)이다.
  • --unpack, -u
    myisampack를 사용해서 패킹된 테이블을 푼다.
기타 myisamchk 옵션

myisamchk는 아래의 옵션을 사용해서 테이블 체크 및 복구 이외의 연산을 실행한다:


  • --analyze, -a
    키 값의 분포도 (distribution)를 분석한다. 이것은 테이블 및 여기에 사용되는 인덱스를 보다 잘 선택하기 위한 조인 옵티마이저 (join optimizer)를 활성화 시킴으로써 조인의 성능을 개선시켜 준다. 키 분포도에 대한 정보를 얻기 위해서는, myisamchk --description --verbose tbl_name 명령어 또는 SHOW INDEX FROM tbl_name 명령문을 사용한다.
  • --block-search=offset, -b offset
    주어진 오프셋에 속해 있는 레코드를 찾는다.
  • --description, -d
    테이블 상세 정보를 출력한다.
  • --set-auto-increment[=value], -A[value]
    새로운 레코드에 대한 AUTO_INCREMENT 번호 매기기 (numbering)를 주어진 값에서부터 시작하도록 만든다 (만일 AUTO_INCREMENT 값이 주어진 값보다 큰 값을 가지고 이미 존재한다면, 이것보다 보다 앞선 값을 가지도록 한다). 만일 value가 지정되지 않으면, 새로운 레코드에 대한 AUTO_INCREMENT 번호는 현재 테이블에서 가장 큰 값보다 하나가 더 많은 값으로 시작을 한다.
  • --sort-index, -S
    내림 차순 (high-low order)으로 트리 블록을 정렬한다. 이것은 검색을 최적화 시키며, 인덱스를 사용하는 테이블 스캔을 보다 빠르게 실행한다.
  • --sort-records=N, -R N
    특정 인덱스에 따라서 레코드를 정렬시킨다. 이것은 데이터를 보다 지역적으로 (localized) 만들고 이 인덱스를 사용하는 범위-기반 SELECT 및 ORDER BY 연산을 빠르게 만든다?을 정렬한다면, 아마도 속도가 느리게 될 것이다.) 테이블 인덱스 번호는 SHOW INDEX를 사용해서 알 수가 있는데, 이것은 myisamchk가 바라보는 것과 같은 순서로 테이블 인덱스를 표시한다. 인덱스는 1부터 시작해서 번호가 매겨진다.
    만일 키가 패킹되지 않으면 (PACK_KEYS=0), 키는 똑 같은 길이를 가지게 되고, 따라서 myisamchk가 정렬을 한 후에 레코드를 이동시킬 때에는, 인덱스에 있는 레코드 오프셋을 덮어 쓰게 된다.
    만일 키가 패킹이 되면 (PACK_KEYS=1), myisamchk는 키 블록을 우선 푼 후에, 인덱스를 재 생성하고 키 블록을 다시 패킹한다. (이와 같은 경우, 인덱스 재 생성은 각 인덱스에 대한 오프셋 업데이트 보다 빠르게 된다.)
myisamchk 메모리 사용

myisamchk 구동 시킬 때에는 메모리 할당이 매우 중요하다. Myisamchk는 메모리 관련 변수가 설정되면 더 이상 메모리를 사용하지 않는다. 매우 큰 테이블에서 myisamchk를 사용하고자 한다면, 우선 얼마나 많은 메모리를 사용할 지를 결정해야 한다. 복구를 실행하기 위해서는 디폴트로 약 3MB를 사용한다. 이 보다 큰 값을 사용하면, myisamchk 실행 속도를 보다 빠르게 만들 수가 있다. 예를 들면, 만일 여러분이 32MB이상의 메모리를 가지고 있다면, 여러분은 아래와 같이 옵션을 사용할 수 있을 것이다:



shell> myisamchk --sort_buffer_size=16M --key_buffer_size=16M \
--read_buffer_size=1M --write_buffer_size=1M ...


대부분의 경우에는 --sort_buffer_size=16M 정도면 충분할 것이다.

myisamchk는TMPDIR에 있는 임시 파일을 사용한다는 점을 알아두자. 만일 TMPDIR이 메모리 파일 시스템을 가리킨다면 메모리 에러가 발생할 수도 있다. 에러가 발생할 경우에는, myisamchk를 --tmpdir=path 옵션과 함께 구동 시켜서 좀더 많은 공간을 가지고 있는 파일 시스템의 디렉토리를 지정하도록 한다.

복구를 하는 경우에는 myisamchk가 디스크 공간을 많이 필요로 한다:


  • 데이터 파일의 두 배 크기가 필요하다 (원본 파일과 복사본). 하지만, --quick을 사용해서 복구를 하는 경우에는 이 공간이 필요 없게 된다; 이와 같은 경우에는, 인덱스 파일만이 재 생성된다. 이 공간은 원본 데이터 파일과 동일한 파일 시스템에서 필요하게 된다! (복사본은 원본 파일의 디렉토리와 동일한 곳에 생성된다.)
  • 이전 인덱스 파일을 대체하는 새로운 인덱스 파일을 위한 공간. 이전 (구형) 인덱스 파일은 복구가 시작될 때 잘려 나간다. 이 공간은 원본 인덱스 파일과 동일한 파일 시스템에서 필요하게 된다!
  • --recover 또는 --sort-recover (--safe-recover를 사용할 때가 아님)를 사용할 때에는, 정렬 버퍼용 공간이 필요하게 된다. 아래의 공식을 사용해서 필요한 공간을 계산하도록 한다:
    (largest_key + row_pointer_length) × number_of_rows × 2
    여러분은 키 길이와 row_pointer_length의 길이를 myisamchk -dv tbl_name를 사용해서 체크할 수가 있다. 이 공간은 임시 디렉토리에 할당된다 (TMPDIR 또는 --tmpdir=path에 의해 지정됨).

만일 여러분이 복구를 하는 과정 중에 디스크 공간에 관련된 문제를 가지게 되면, --recover를 사용하지 말고 --safe-recover를 시도해 보기 바란다.