본문 바로가기
DataBase/MySQL

MySQL 한글 메뉴얼 버젼 3.21(3/4)

by 백룡화검 2010. 4. 24.
MySQL 한글 메뉴얼 버젼 3.21(3/4)

10.12 DELETE 문에서 속도에 영향을 미치는 부분 <** DELETE 문 최적화 **>

레코드를 삭제하는 시간은 정확히 인덱스 숫자에 비례한다. 레코드를 빠르게 지우기 위해
인덱스 캐쉬의 크기를 증가시킬 수 있다. 기본 인덱스 캐쉬는 1M 이다; 빠르게 삭제하기 위
해 증가되어야 한다.(충분한 메모리를 가지고 있다면 16M로 하자)


10.13 mysql에서 최대 속도를 얻는 방법

벤치마킹을 시작하자! mysql 벤치마크 스위트에서 어떤 프로그램을 사용할 수 있다. (일반
적으로 'sql-bench' 디렉토리에 있음) 그리고 입맞에 맞게 수정하자. 이렇게 하면 당신의 문
제를 해결할 수 있는 다른 해결책을 찾을 수 있으며 당신에게 가장 빠른 해결책을 테스트할
수 있다.

- mysqld를 적절한 옵션으로 시작하자. 메모리가 많을수록 속도가 빠르다.
10.1 [MySQL parameters] 참고.
- SELECT 문의 속도를 빠르게 하기 위해 인덱스를 만들자.
10.4 [MySQL indexes] 참고.
- 가능한 효율적으로 컬럼 타입을 최적화하자. 예를 들면 가능한 NOT NULL로 컬럼을 정
의하자. 10.10 [Table efficiency] 참고.
- --skip-locking 옵션은SQL 요청에서 파일 락킹을 없앤다. 속도가 빨라지지만 다음의 과
정을 따라야 한다:
ㅇ isamchk로 테이블을 체크하거나 수리하기 전에 mysqladmin flush-tables 로 모
든 테이블을 플러시해야 한다. (isamchk -d tbl_name은 언제나 허용된다. 왜냐하면 이건 단
순히 테이블의 정보를 보여주기 때문이다)
ㅇ 동시에 뜬 두개의 mysql 서버가 동일한 테이블을 업데이트하려 한다면 동일한
데이터 파일에 두개의 mysql 서버를 띄우면 안된다.

--skip-locking 옵션은 MIT-pthreads로 컴파일할때 기본값이다. 왜냐면 모든 플랫
폼의 MIT-pthreads에서 flock()가 완전하게 지원이 되지 않기 때문이다.

- 업데이트에 문제가 있다면 업데이트를 미루고 나중에 하자. 많은 업데이트를 하는 것이
한번에 하나를 업데이트하는 것보다 더 빠르다.
- FreeBSD 시스템에서 MIT-pthreads에 문제가 있으면 FreeBSD 3.0 이후 버전으로 업데
이트 하는것이 좋다. 이렇게 하면 유닉스 소켓을 사용하는 것이 가능하며(FreBSD에서 유닉
스 소켓이 MIT-pthreads에서 TCP/IP 연결을 사용하는 것보다 빠르다) 그리고 스레드 패키
지가 조정(intergrated?)되어야 한다.
- 테이블이나 컬럼 단계를 체크하는 GRANT는 성능을 떨어뜨린다.


10.14 로우 포맷과 다른 점은 무엇인가? 언제 VARCHAR/CHAR을 사용해야 하는가?

mysql은 실제의 SQL VARCHAR 타입이 없다. 그대신 mysql은 레코드를 저장하고 이것을
VARCHAR로 에뮬레이트하는데 세가지 방법이 있다.

테이블에 VARCHAR, BLOB, TEXT 컬럼이 없으면 고정 row size를 사용한다. 그외에는
동적 row size를 사용한다. CHAR 과 VARCHAR 컬럼은 애플리케이션의 관점에서 동일하
게 취급된다; 둘다 trailing space는 컬럼을 가져올때 제거된다.

isamchk -d 를 이용 테이블에서 사용하는 포맷을 체크할 수 있다.
(-d 는 "테이블 묘사"를 의미)

mysql은 세가지 다른 테이블 포맷을 가지고 있다; 고정길이, 다이나믹, 압축.


고정 길이 테이블
- 기본 포맷. 테이블에 VARCHAR, BLOB, TEXT 컬럼이 없을 때 사용.
- 모든 CHAR, NUMERIC, DECIMAL 컬럼은 컬럼 길이에 space-padded 이다. (** space-
padded를 무엇이라고 번역해야 할지 애매모호해서 **)
- 매우 빠름
- 캐쉬하기 쉽다
- 손상 후 복구가 쉽다. 왜냐면 고정된 위이에 레코드가 위치하기 때문이다.
- 많은 양의 레코드가 지워졌거나 운영 시스템에서 자유 공간을 늘리길 원치 않는다면 (isa
mchk를 이용) 재조직화할 필요없다.
- 보통 다이나믹 테이블보다 많은 디스크 공간을 필요로 한다.


다이나믹 테이블
- 테이블이 VARCHAR, BLOB, TEXT 컬럼을 포함하고 있을 때 사용.
- 모든 문자열 컬럼은 다이나믹하다.(4보다 작은 길이를 가진 문자열 제외)
- 컬럼이 문자열 컬럼에서 비었거나 ('') 숫자형 컬럼에서 0(NULL 값을 가진 컬럼과 동일
한 것이 아니다) 을 나타내는 비트맵이 모든 레코드 앞에 선행된다. 문자열 컬럼에서 trailin
g space를 제거한 후 zero의 길이를 가지거나 숫자형 컬럼이 zero의 값을 가지면 비트 맵으
로 표시되고 디스크에 저장되지 않는다. 비지 않은 문자는 문자내용에 길이 바이트만큼 추
가되어 저장된다.
- 보통 고정 길이 테이블보다 디스크 공간 절약.
- 줄의 길이를 확장하는 정보를 가지고 줄을 업데이트하면 줄은 단편화될 것이다. 이런 경
우 더 좋은 성능을 위해 때때로 isamchk -r 을 실행해야 한다. 통계적으로(?) isamchk -ei
tbl_name을 사용하자.
- 손상후 복구가 어렵다. 왜냐면 레코드가 많은 조각드로 단편화되고 링크(단편)가 없어지
기 때문이다.
- 다이나믹 사이즈 테이블의 예상되는 열 길이 :
3
+ (number of columns + 7) / 8
+ (number of char columns)
+ packed size of numeric columns
+ length of strings
+ (number of NULL columns + 7) / 8

각 링크마다 6 바이트가 더 있다. 다이나믹 레코드는 업데이트로 레코드가 늘어날때마다 링
크된다. 각 새로운 링크는 최소 20바이트일 것이며, 그래서 다음의 확장은 아마도 동일한 링
크로 될 것이다. 그게 아니라면 다른 링크가 있을 것이다. isamchk -ed 로 얼마나 많은 링
크가 있는지 체크할 수 있다. 모든 링크는 isamchk -r 로 제거할 수 있다.(** ?? **)

There is a penalty of 6 bytes for each link. A dynamic record is linked whenever an up
date causes an enlargement of the record. Each new link will be at least 20 bytes, so th
e next enlargement will probably go in the same link. If not, there will be another link.
You may check how many links there are with isamchk -ed. All links may be removed
with isamchk -r.


압축 테이블

- 읽기 전용 테이블은 pack_isam 유틸리티로 만들 수 있다. 확장 mysql 이메일 지원을 구
입한 모든 고객은 내부적인 용도로 pack_isam을 사용할 권리가 주어진다.
- 압축해제 코드는 모든 mysql 배포판에 있으므로 pack_isam이 없는 고객도 pack_isam으
로 압축된 테이블을 읽을 수 있다. (테이블이 같은 플랫폼에서 압축되어 있는한)
- 매우 적은 디스크 용량을 사용.
- 각 레코드는 개별적으로 압축이 된다.( 매우 적은 액세스 overhead) 레코드의 헤더는 테
이블의 가장 큰 레코드에 따라 (1-3 바이트) 고정된다. 각 컬럼은 다르게 압축이 된다. 압축
타입은 다음과 같다:

ㅇ 일반적으로 각 컬럼마다 다른 Huffman 테이블이다.
ㅇ Suffic 공간 압축
ㅇ Prefix 공간 압축
ㅇ 0 값을 가진 숫자는 1비트로 저장.
ㅇ integer 컬럼의 값이 작은 범위를 가졌다면, 컬럼은 최대한 작은 타입으로 저장
된다. 예를 들면 BIGINT 컬럼은 모든 값이 0부터 255라면 TINIINT 컬럼(1바이트)로 저장
된다.
ㅇ 컬럼이 몇가지 가능한 값으로만 구성되어 있다면, 컬럼 타입은 ENUM으로 변환
된다.
ㅇ 컬럼은 위 압축 방법을 조합하여 사용한다.
- 고정 길이나 다이나믹 길이의 테이블을 다룰 수 있다. 그러나 BLOB나 TEXT 컬럼은 다
룰 수 없다.
- isamchk로 압축을 해재할 수 있다.

mysql은 다른 인덱스 타입을 지원한다. 그러나 일반적인 타입은 NISAM이다. 이것은 B-tre
e 인덱스이며 모든 키의 갑을 합하여 (키 길이+4)*0.67로 인덱스 파일의 크기를 대강 계산
할 수 있다. (이것은 모든 키가 정렬된 순서로 입력된 가장 나쁜 경우이다)


String indexes are space compressed. If the first index part is a string, it will also be p
refix compressed. Space compression makes the index file smaller if the string column h
as a lot of trailing space or is a VARCHAR column that is not always used to the full
length. Prefix compression helps if there are many strings with an identical prefix.

문자열 인덱스는 공간이 압축된다. 첫번째 인덱스 부분이 문자열이라면, prefix가 압축된다.
문자열 컬럼이 다량의 trailing space를 가졌거나 언제나 완전한 길이를 사용하지 않는 VA
RCHAR 컬럼일 때 space 압축은 인덱스 파일을 더 작게 만든다. prefix 압축은 많은 문자
열에 동일한 prefix가 있을 때 유용하다.
{{<!-- This HTML file has been created by texi2html 1.52 (hacked by david@detron.se)
from /dr1/my/masters/mysql/Docs/manual.texi on 2 Febuary 1999 -->
}}11. mysql 벤치마크 스위트

여기에는 mysql 벤치마크 스위트(그리고 crash-me)에 대한 기술적인 설명이 들어가야 한다. 그렇
지만 아직 작성이 되지 않았다. 현재로서는 배포판의 'bench' 디렉토리에서 코드와 결과를 살펴보
아야 한다.(또한 다음의 웹페이지에서 살펴볼 수 있다.
{{{{http://www.mysql.com/crash-me-choose.htmy)
}}
}}

이것은 사용자에게 주어진 SQL 수행이 제대로 수행되는지 아닌지를 알려주는 벤치마크이다.

crash-me 는 실제로 질의를 수행하여 데이터베이스에서 지원하는 기능과 능력, 제한사항 등을 측
정하는 프로그램이다. 예를 들어 다음의 사항을 측정한다:

ㅇ 지원하는 컬럼 타입
ㅇ 지원하는 인덱스 숫자
ㅇ 지원하는 펑션
ㅇ 질의의 최대 크기
ㅇ VARCHAR 컬럼의 최대 크기
번역자 : 문태준(taejun@hitel.net)

12. mysql 유틸리티

12.1 다양한 mysql 프로그램 개요

mysql client 라이브러리를 사용하여 서버와 통신을 하는 모든 mysql 클라이언트는 다음의
환경 변수를 사용한다:

Name Description
MYSQL_UNIX_PORT 기본 소켓; 로컬호스트에서 접속할때 사용
MYSQL_TCP_PORT 기본 TCP/ip port
MYSQL_PWD 기본 패스워드
MYSQL_DEBUG 디버깅할때 Debug-trace 옵션
TMPDIR 임시 테이블/파일이 생성되는 디렉토리

MYSQL_PWD 를 사용하는 것은 보안에 취약하다. 6.2 [Connecting] 참고.

'mysql' 클라이언트는 명령행 라인 히스토리에 환경 변수를 저장하기 위해 MYSQL_HISTF
ILE 이라는 파일을 사용한다.

모든 MYSQL 프로그램은 매우 다양한 옵션이 있다. 그러나 모든 MYSQL 프로그램에서 --
help 옵션을 제공한다. --help 옵션을 이용해 프로그램의 다양한 옵션에 대한 모든 정보를
볼 수 있다. 예를 들어, mysql --help 를 해보자.

아래의 목록은 mysql 프로그램에 대해서 설명하고 있다:

isamchk : mysql 테이블 정보 보기, 점검, 최적화, 복구 유틸리티. 많은 기능이 있기 때문에
별도의 장에서 자세히 설명하고 있다. 13장 참고.

make_binary_release : 컴파일된 mysql 바이너리 버전을 만든다. 다른 myql 사용자의 편의
를 위해 ftp.tcx.e의 '/pub/mysql/Incoming' 에 올리자.

msql2mysql : msql 프로그램을 mysql로 변환하는 쉘 스크립트. 모든 경우를 다룰 수는 없
지만 변환할때 유용할 것이다.

mysql : 간단한 SQL 쉘. (GNU readline 호환성있음) 상호대화식 및 비대화식으로 사용할
수 있다. 대화식으로 사용하는 경우, 질의 결과는 아스키-테이블 포맷으로 출력된다. 비대화
식으로 사용할 경우, 결과는 텝으로 분리된 포맷으로 출력된다. (출력 포맷은 명령행 라인
옵션을 이용해 바꿀 수 있다) 다음과 같이 스크립트를 사용할 수 있다:

shell> mysql database < script.sql > output.tab

클라이언트에서 메모리가 부족해서 문제가 생기면 --quick 옵션을 사용하자. 그러면 질의
결과를 가져오기 위해 mysql_store_result() 대신 mysql_use_result()를 사용한다.

mysqlaccess : host, user, database 조합의 접근 권한 점검 스크립트.

mysqladmin : 데이터베이스 생성 및 삭제, 승인 테이블 재로딩, 디스크에 테이블 플러싱, 로
그 파일 재오픈 등을 수행하는 관리자용 유틸리티. mysqladmin은 또한 서버에서 버전, 프로
세스, 상태(status) 정보를 확인할 수 있다.

mysqlbug : mysql 버그 레포트 스크립트. mysql의 버그를 알릴 때 사용하는 스크립트.

mysqld : SQL 대몬. 항상 실행되고 있어야 한다.

mysqldump : mysql 데이터베이스를 SQL문 형태의 파일이나 탭으로 구분된 텍스빚 파일로
덤프하는 유틸리티.

mysqlimport : LOAD DATA INFILE을 사용해 텍스트 파일의 자료를 테이블에 입력하는
유틸리티. 12.2 참고.

mysqlshow : 데이터베이스, 테이블, 컬럼과 인덱스에 대한 정보 출력

mysql_install_db : 기본 권한으로 MYSQL 승인 테이블 생성. 처음 설치했을때만 수행된다.

replace : msql2mysql에서 사용되는 유틸리티이다. 그렇지만 다양하게 적용할 수 있다. 파일
이나 표준 입력의 문자열을 교체할 수 있다. 먼저 긴 문자열을 매칭하기 위해 제한된 상황
의 시스템에서 사용하자(** ??) 문자열을 교체하는데 사용할 수 있다. 예를 들어 다음의 명
령어는 파일에서 a와 b를 교체한다:

shell> replace a b b a -- file1 file2 ...

safe_mysqld : mysqld 대몬을 시작하는 스크립트. 에러가 났을때 서버를 재시작하고 로그
파일에 실행 정보를 기록하는 등 몇가지 안정 대책이 있다.



12. 2 텍스트 파일에서 데이터 입력(수입?)하기

mysqlimport 는 명령행 인터페이스에서 LOAD DATA INFILE sql 문을 제공한다. 대부분
의 옵션은 LOAD DATA INFILE 과 동일하다. 7.15 [Load] 참고.
다음과 같이 사용한다:

shell> mysqlimport [options] filename ...

명령행에서 지정한 텍스트 파일에 대하여, mysqlimport는 파일이름에서 확장자를 제거한다.
그리고 파일의 내용을 어떤 테이블에 넣을 것인지 결정하는데 사용한다. 예를 들어 vkdlfdlf
madl 'patient.txt', 'patient.text', 'patient'는 모두 patient라는 테이블 이름으로 입력될 것이
다.

mysqlimport 는 다음의 옵션을 지원한다:

-C, --compress : 서버, 클라이언트에서 압축을 지원하면 서버/클라이언트 사이에서 모든
정보를 압축한다

-#, --debug[=option_string] : 프로그램 사용 추적(디버깅용)

-d, --delete : 텍스트 파일에서 입력하기 전에 테이블을 비움

--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--fields-terminated-by=...
: LODA DATA INFILE 에서의 옵션과 동일한 기능을 갖는 옵션

-f, --force : 에러 생략.텍스트 파일을 위한 테이블이 없으면, 다른 남아있는 파일을 계속
처리(if a table for a text file doesn't exist, continue processing any remaining files) 이
옵션이 없는 경우, 테이블이 없으면 빠져나온다

--help : 도움말 출력

-h host_name, --host=host_name : 지정한 호스트의 mysql 서버에 데이타 입력. 기본값은
localhost

-i, --ignore : --replace 옵션의 정보 참고.

-l, --lock-tables : 텍스트 파일로 처리하기 전에 모든 테이블에 쓰기 락을 건다. 그러면 서
버에서 모든 테이블이 동기화될 수 있다.

-L, --local : 클라이언트에서 입력 파일 읽음. 기본적으로, localhost에서 접속하면 텍스트
파일은 서버에 있다고 가정된다.

-pyour_pass, --password[=your_pass] : 서버에 연결할 때 사용하는 비밀번호. '=your_pass
'를 지정하지 않으면 터미널에서 비밀번호를 물어봄

-P port_num, --port=port_num : 호스트에 연결할 때 사용하는 TCP/IP 숫자. (localhost가
아닌 호스트에서 접속할 때 사용. 예를 들어 유닉스 소켓을 사용하는 경우)

-r, --replace : --replace 와 --ignore 옵션은 unique key 값의 레코드가 중복되어 있을 경
우에 사용된다. --replcae 를 명시할 경우, 동일한 unique key 값을 가지고 있는 레코드를
대체한다. --ignore 를 명시할 경우, unique key 값이 동일한 레코드는 생략된다. 두 옵션
모두 명시하지 않는다면, 중복되는 키 갑이 발견되면 에러를 출력하고 텍스트 파일의 나머
지 부분은 생략이 된다.

-s, --silent : 침묵 모드. 에러가 발생했을 때만 출력.

-S /path/to/socket, --socket=/path/to/socket : 로컬호스트(기본 호스트값)에서 접속할 때
사용하는 소켓 파일.

-u user_name, --user=user_name : 서버에 연결할 때 사용하는 mysql 사용자 이름. 기본값
은 유닉스 로그인 이름.

-v, --verbose : Verbose 모드. 프로그램의 수행에 대한 상세한 정보 출력.

-V, --version : 버전 정보 출력.



12.3 mysql 압축 읽기 전용 테이블 생성기
** 이 부분은 번역 생략. 간단하게 소개만 합니다 **

pack_isam 은 10 라이센스 이상을 구입하거나 extended support 를 받을 때 사용할 수 있
는 추가 유틸리티. 바이너리로만 배포하므로 특정한 플랫폼에서만 사용 가능. 압축률은 40%
-70% 정도이다. 메모리맵을 사용하므로(mmap()) mmap()가 작동되지 않으면 문제가 생긴
다. 압축하고나서는 읽기 전용 테이블이 되며 BLOB 칼럼은 압축하지 못한다.

공개적으로 구할 수 있는 mysql에서 압축 읽기 전용 테이블을 생성하지는 못하지만 읽는
것은 가능하다. 기타 자세한 내용은 매뉴얼을 참고하자.
13. 테이블 유지보수 및 파손 복구에 isamchk 사용하기


데이터베이스 테이블의 정보를 얻을 때, 테이블 점검, 복구 및 최적화 할때 isamchk 유틸리티를 사
용할 수 있다. 다음의 섹션은 어떻게 isamchk를 사용하는지(옵션에 대한 상세한 설명 포함), 테이블
유지 계획을 어떻게 설정할 것인지, 어떻게 isamchk의 다양한 기능을 수행하기 위해 isamchk를 사
용하는지에 대해 설명하고 있다.

{{}}13.1 isamchk 명령어 사용법

isamchk 는 다음과 같이 사용한다:

shell> isamchk [options] tbl_name

옵션은 isamchk로 무엇을 할 것인지 지정한다. 아래에서 설명한다. (isamchk --help 명령으로 옵션
의 목록을 볼 수 있다) 옵션이 없을 때, isamchk는 단지 테이블을 점검한다. 더 많은 정보를 얻으려
하거나 특정한 작업이 필요하면 아래에서 설명하는데로 옵션을 지정한다.

tbl_name은 점검하기 원하는 데이터베이스 테이블이다. 데이터베이스 디렉토리가 아닌 다른 곳에
서 isamchk를 실행하면, 파일의 경로를 지정해야 한다. 왜냐하면 isamchk는 데이터베이스의 위치
에 대해서 알지 못하기 때문이다. 실제로, isamchk는 작업하려는 파일이 데이터베이스 디렉토리에
있는지 아닌지 신경을 쓰지 않는다; 데이터베이스 테이블에 해당하는 파일을 다른 곳으로 복사하
고 그곳에서 복구 작업을 할 수 있다.

원한다명 isamchk의 명령행에서 여러개의 테이블을 사용할 수 있다. 또한 이름을 인덱스 파일 이
름('.ISM' 가 붙음)으로 지정할 수 있으며 이런 경우 '*.ISM' 패턴을 사용하여 디렉토리의 모든 테이
블을 지정할 수 있다. 예를 들어 데이터베이스 디렉토리에 있다면 다음과 같이 디렉토리의 모든
테이블을 점검할 수 있다:

shell> isamchk *.ISM


If you are not in the database directory, you can check all the tables there by specifying the path to the dir
ectory:

데이터베이스 디렉토리에 있지 않으면, 디렉토리의 경로를 지정하여 모든 테이블을 점검할 수 있
다.

shell> isamchk /path/to/database_dir/*.ISM

또한 mysql data 디렉토리의 경로를 사용한 와일드 카드를 지정하여 모든 데이터베이스의 모든 테
이블을 점검할 수 있다:

shell> isamchk /path/to/datadir/*/*.ISM

isamchk는 다음의 옵션을 지원한다:

-a, --analyze
Analyze the distribution of keys. This will make some joins in MySQL faster.
키의 분포를 분석. mysql에서 특정한 조인을 빠르게 만든다.

-#, --debug=debug_options
Output debug log. The debug_options string often is 'd:t:o,filename'.
디버그 로그 출력. debug_options 문자는 흔지 'd:t:o,filename' 이다.

-d, --description
테이블의 정보 출력

-e, --extend-check
테이블을 매우 상세하게 점검. 아주 특정한 경우에만 필요하다. 일반적으로 isamchk는 이 옵션이
없어도 모든 에러를 찾을 수 있다.

-f, --force
Overwrite old temporary files. If you use -f when checking tables (running isamchk without -r), isamchk
will automatically restart with -r on any table for which an error occurs during checking.
이전의 오래된 임시 파일을 덮어씀. 테이블을 점검할때 -f를 사용하면(-r 없이 isamchk를 실행) isa
mchk는 점검하는 동안 에러가 발생하는 테이블에서 자동으로 -r 옵션을 시작한다.


--help
도움말 출력.

-i, --information
점검을 한 테이블의 통계 정보 출력.

-k #, --keys-used=#
Used with -r. Tell the NISAM table handler to update only the first # indexes. Higher-numbered indexes
are deactivated. This can be used to get faster inserts! Deactivated indexes can be reactivated by using isa
mchk -r.
-r 과 함께 사용. NISAM 테이블 핸들러에 첫 # 인덱스만 업데이트하라는 것을 알려준다. Higher-nu
mberd(?) 인덱스가 해제된다. 이것은 insert를 빠르게 할때 사용한다! 해제된 인덱스는 isamchk -r 을
사용하여 재활성화된다.

-l, --no-symlinks
복구할때 심볼릭 링크를 따르지 않는다. 일반적으로 isamchk는 심볼릭 링크가 가리키는 테이블을
복구한다.



-q, --quick
빠르게 복구하기 위해 -r 과 함께 사용. 일반적으로 원래의 데이타 파일은 건드리지 않는다; 두번째
-q를 지정하여 원래의 데이타 파일을 사용하도록 할 수 있다.

-r, --recover
복구 모드. 유일하지 않는 unique 키만 제외하고 거의 모든 것을 복구한다.

-o, --safe-recover
복구 모드. 구식 복구 방법을 사용; -r을 사용하여 복구하는 것보다 느리다. 그렇지만 -r이 다룰 수
없는 몇가지 경우에 사용할 수 있다.
(** -r이 다룰 수 없는 경우란 무엇인지 잘 모르겠네요... **)

-O var=option, --set-variable var=option
변수값 설정. 설정가능한 변수는 아래에서 설명.

-s, --silent
침묵 모드. 에러가 발생할 때만 출력을 한다. 두개의 -s(-ss)를 사용하면 isamchk에서 매우 조용하
게 작업을 할 수 있다.

-S, --sort-index
Sort index blocks. This speeds up "read-next" in applications.
인덱스 블락 정열. 애플리케이션에서 "read-next" 속도를 향상.(??)

-R index_num, --sort-records=index_num
인덱스에 따라 레코드를 정렬. 이 작업을 하면 데이타를 집중시킬 수 있고 이 인덱스를 사용한 SE
LECT 와 ORDER BY 작업의 속도를 증가시킬 수 있다. (처음에는 정렬하는 시간이 매우 느리다!)
테이블의 인덱스 번호를 찾기 위해 SHOW INDEX를 사용한다. SHOW INDEX는 isamchk에서 사용
하는 것과 같은 순서로 테이블의 인덱스를 보여준다. 인덱스는 1번부터 시작하여 번호가 매겨진
다.

-u, --unpack
Unpack a table that was packed with pack_isam.
pack_isam 으로 압축된 테이블의 압축 해제.

-v, --verbose
Verbose 모드. 정보를 출력. -d 와 -e 와 함께 사용할 수 있다. 여러개의 -v를 사용(-vv, -vvv)하여 더
자세하게 볼 수 있다.

-V, --version
isamchk 버전 출력.

-w, --wait
테이블에 락이 걸려 있으면 기다림.

--set-variable (-O) 옵션의 설정 가능한 변수는 다음과 같다:

keybuffer default value: 520192
readbuffer default value: 262136
writebuffer default value: 262136
sortbuffer default value: 2097144
sort_key_blocks default value: 16
decode_bits default value: 9
{{}}

13.2 isamchk 메모리 사용법

Memory allocation is important when you run isamchk. isamchk uses no more memory than you specify
with the -O options. If you are going to use isamchk on very large files, you should first decide how much
memory you want it to use. The default is to use only about 3M to fix things. By using larger values, you
can get isamchk to operate faster. For example, if you have more than 32M RAM, you could use options s
uch as these (in addition to any other options you might specify):

메모리 할당은 isamchk를 실행할 때 중요하다.isamchk는 -O 옵션에서 지정한 것 이상으로 메모리
를 사용하지 않는다. 매우 큰 파일에서 isamchk를 사용하려 하면, 얼마마 많은 메모리를 사용할 것
인지 먼저 결정해야 한다. 기본값은 문제를 고치는데 3M를 사용한다. 더 많은 값을 사용해 더 빠르
게 isamchk를 사용할 수 있다. 예를 들어 32M 이상 램을 가지고 있다면 다음과 같은 옵션을 사용할
수 있다. (사용자가 지정한 옵션에 추가하여):

shell> isamchk -O sortbuffer=16M -O keybuffer=16M \
-O readbuffer=1M -O writebuffer=1M ...

-O sortbuffer=16M 를 사용하면 대부분의 경우에는 충분하다.

Be aware that isamchk uses temporary files in TMPDIR. If TMPDIR points to a memory file system, you
may easily get out of memory errors.
isamchk 는 TMPDIR의 임시 파일을 사용한다는 것에 주의하자. 만약 TMPDIR이 메모리 파일 시스
템을 가리킨다면 쉽게 메모리 에러에서 벗어날 수 있다.


13. 3 테이블 유지보수 설정
{{}}13.3 Setting up a table maintenance regime

문제가 생길때를 기다리는 것보다 정기적으로 테이블을 점검하는 게 좋다. 유지보수 계획를 위하
여 isamchk -s 를 사용해 테이블을 점검할 수 있다. -s 옵션을 사용하면 isamchk가 침묵 모드로 작동
을 하며 에러가 발생했을 때만 메시지를 출력한다.

서버를 시작할때 테이블을 점검하는 것도 좋은 생각이다. 예를 들어 업데이트 도중에 시스템이 리
부팅을 했을 때마다 일반적으로 영향을 받은 모든 테이블(이것을 "expected crashed table"이라고 한
다)을 점검해야 한다. 만약 오래된 '.pid' (프로세스 ID) 파일이 재부팅후에 남아 있다면 최근 24시간
동안 변경이 된 모든 테이블을 점검하기 위해 safe_mysqld에 isamchk를 실행하는 테스트를 추가해
야 한다.('.pid' 파일은 mysqld가 시작할때 만들어지며 일반적으로 mysqld가 종료될때 제거된다. 시
스템이 시작할때 '.pid' 파일이 있다는 것은 mysqld가 비정상적으로 종료되었다는 것을 나타낸다.)

더 좋은 테스트는 최근에 변경된 시간이 '.pid' 파일보다 최근인 테이블을 점검하는 것이다.

또한 일반적인 시스템 운영중에 정기적으로 테이블을 점검할 수 있다. TcX에서는 'crontab' 파일에
다음의 라인을 사용하여 일주일에 한번씩 우리의 중요한 테이블을 점검하도록 cron 작업을 돌린
다:

35 0 * * 0 /path/to/isamchk -s /path/to/datadir/*/*.ISM

이렇게 하면 손상된 테이블에 대한 정보를 출력하여 필요할때 테이블을 점검하고 복구할 수 있다.

몇년동안 우리는 예상하지 못하게 테이블이 손상(하드웨어 문제가 아닌 다른 이유로 문제가 생긴
테이블)된 경우가 없어서 우리에겐 일주일만으로도 충분하다. (이것은 정말로 진실이다)

우리만큼 mysql에 대해 신뢰를 할 때까지 최근 24시간동안 업데이트된 모든 테이블에 대해 매일
밤마다 isamchk -s 를 실행할 것을 추천한다.


13.4 테이블 정보 얻기

테이블에 대한 정보나 통계를 얻기 위해 아래의 명령을 사용하자. 뒤에서 자세하게 정보에 대해
설명할 것이다.

isamchk -d tbl_name
테이블에 대한 정보를 얻기 위해 "describe(설명) 모드"로 isamchk를 실행. mysql 서버를 --skip-locki
ng 옵션을 사용해 시작하면, isamchk는 서버가 실행되는 동안 업데이트된 테이블에서 에러가 난
것을 보고한다. 그러나 isamchk는 describe 모드에서 테이블을 변경하지 못하기 때문에 데이타를
읽을 위험이 없다.

isamchk -d -v tbl_name
isamchk가 수행하는 것에 대해 더 자세한 정보를 보기위해 -v 옵션을 추가하여 verbose 모드로 수
행할 수 있다.

isamchk -eis tbl_name
테이블에서 가장 중요한 정보만 보여준다. 전체 테이블을 다 읽어야 하기 때문에 속도가 느리다.

isamchk -eiv tbl_name
-eiv 와 비슷하지만 현재 무엇이 진행되고 있는지 보여준다.


isamchk -d 출력 예제:

ISAM file: company.ISM
Data records: 1403698 Deleted blocks: 0
Recordlength: 226
Record format: Fixed length

table description:
Key Start Len Index Type
1 2 8 unique double
2 15 10 multip. text packed stripped
3 219 8 multip. double
4 63 10 multip. text packed stripped
5 167 2 multip. unsigned short
6 177 4 multip. unsigned long
7 155 4 multip. text
8 138 4 multip. unsigned long
9 177 4 multip. unsigned long
193 1 text


isamchk -d -v 출력 예제:

ISAM file: company.ISM
Isam-version: 2
Creation time: 1996-08-28 11:44:22
Recover time: 1997-01-12 18:35:29
Data records: 1403698 Deleted blocks: 0
Datafile: Parts: 1403698 Deleted data: 0
Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3
Max datafile length: 3791650815 Max keyfile length: 4294967294
Recordlength: 226
Record format: Fixed length

table description:
Key Start Len Index Type Root Blocksize Rec/key
1 2 8 unique double 15845376 1024 1
2 15 10 multip. text packed stripped 25062400 1024 2
3 219 8 multip. double 40907776 1024 73
4 63 10 multip. text packed stripped 48097280 1024 5
5 167 2 multip. unsigned short 55200768 1024 4840
6 177 4 multip. unsigned long 65145856 1024 1346
7 155 4 multip. text 75090944 1024 4995
8 138 4 multip. unsigned long 85036032 1024 87
9 177 4 multip. unsigned long 96481280 1024 178
193 1 text


Example of isamchk -eis 출력 예제:

Checking ISAM file: company.ISM
Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4
Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4
Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4
Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3
Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4
Total: Keyblocks used: 98% Packed: 17%

Records: 1403698 M.recordlength: 226 Packed: 0%
Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00
Recordblocks: 1403698 Deleteblocks: 0
Recorddata: 317235748 Deleted data: 0
Lost space: 0 Linkdata: 0

User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966


isamchk -eiv 출력 예제:

Checking ISAM file: company.ISM
Data records: 1403698 Deleted blocks: 0
- check file-size
- check delete-chain
index 1:
index 2:
index 3:
index 4:
index 5:
index 6:
index 7:
index 8:
index 9:
No recordlinks
- check index reference
- check data record references index: 1
Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4
- check data record references index: 2
Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4
- check data record references index: 3
Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4
- check data record references index: 4
Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3
- check data record references index: 5
Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 6
Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 7
Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 8
Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 9
Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4
Total: Keyblocks used: 9% Packed: 17%

- check records and index references
[LOTS OF ROW NUMBERS DELETED]

Records: 1403698 M.recordlength: 226 Packed: 0%
Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00
Recordblocks: 1403698 Deleteblocks: 0
Recorddata: 317235748 Deleted data: 0
Lost space: 0 Linkdata: 0

User time 1639.63, System time 251.61
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
Blocks in 4 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 10604, Involuntary context switches 122798



다음은 앞의 예제에서 사용한 테이블의 데이타와 인덱스 파일 크기이다:

-rw-rw-r-- 1 monty tcx 317235748 Jan 12 17:30 company.ISD
-rw-rw-r-- 1 davida tcx 96482304 Jan 12 18:35 company.ISM


isamchk가 출력하는 정보 타입에 대한 설명은 아래와 같다. "keyfile"은 인덱스 파일이다. "Record"
와 "row"는 같은 말이다.

ISAM file
ISAM (index) 파일 이름.

Isam-version
ISAM 포맷 버전. 현재는 항상 2.

Creation time
데이타 파일 생성 시간.

Recover time
인덱스/데이타 파일이 최근에 복구된 시간.

Data records
테이블에 있는 레코드 수.

Deleted blocks
지워진 블락이 차지하고 있는 공간. 이러한 공간을 줄이기 위해 테이블의 최적화를 할 수
있다. 13.5.3 [최적화] 참고.

Datafile: Parts
동적인 레코드 포맷을 위해, 얼마나 많은 데이타 블락이 있는지를 알림. 단편화된 레코드
가 없는 최적화된 테이블에서는 Data records 와 같다.

Deleted data
회수하지 않은 지원진 데이타의 바이트 수. 이렇나 공간을 없애기 위해 테이블을 최적화
할 수 있다. 13.5.3 [최적화] 참고.

Datafile pointer
데이타 파일 포인터의 크기로 바이트수. 일반적으로 2,3,4,5 바이트이다. 대부분의 테이
블은 2바이트로 관리를 한다. 그렇지만 아직까지 mysql에서는 제어를 할 수 없다. 고정 테이블에서
이는 레코드 주소(address)이다. 동적 테이블에서 이는 바이트 주소이다.



Keyfile pointer
인덱스 파일 포인터의 크기로 바이트. 일반적으로 1,2,3 바이트이다. 대부분의 테이블은
2바이트로 관리를 한다. 그렇지만 이 크기는 mysql에서 자동으로 계산이 된다. 항상 블락 주소이
다.

Max datafile length
테이블의 데이터 파일(.ISD 파일)의 최대 크기. 바이트.

Max keyfile length
테이블의 key file(.ISM 파일)의 최대 크기. 바이트.

Recordlength
각 레코드가 차지하고 있는 공간. 바이트.

Record format
테이블의 레코드를 저장하는데 사용된 포맷. 위에서 보여준 예제는 고정 길이를 사용하고 있다.
다른 값은 Compressed 와 Packed 이다.

table description
테이블의 모든 키의 목록. 각 키에 대한 자세한 설명은 다음과 같다:
Key
키의 숫자.
Start
Where in the record this index part starts.
레코드에서 인덱스가 시작하는 위치.
Len
How long this index part is. For packed numbers, this should always be the full length of the column. For
strings, it may be shorter than the full length of the indexed column, because you can index a prefix of a st
ring column.
인덱스 부분의 길이. For packed numbers(꽉 찬 숫자를 위해??? 번역이 이상..), 컬럼의 총
길이가 되어야 한다. 문자열에서는 인덱스된 컬럼의 총 길이보다 작아야 한다. 왜냐하면 문자열
컬럼 앞에 인덱....

Index
이 인덱스에 같은 값이 여러개 존재할 수 있는지 없는지를 나타냄.
Type
인덱스 부부의 데이터 타입. packed, stripped, empty 옵션을 가진 NISAM 데이타 타입이
다.
Root
루트 인덱스 블락의 주소.
Blocksize
각 인덱스 블락의 크기.기본값은 1024이다. 그렇지만 이 값은 컴파일 할때 변경할 수 있
다.
Rec/key
This is a statistical value used by the optimizer. It tells how many records there are per value for this key.
A unique key always has a value of 1. This may be updated after a table is loaded (or greatly changed) wit
h isamchk -a. If this is not updated at all, a default value of 30 is given.
최적화기(optimizer)에서 사용하는 통계적인 값. It tells how many records there are per valu
e for this key. unique 키는 항상 1의 값을 가진다. 이 값은 isamchk -a로 테이블이 로딩된 후에(또는
매우 많이 변경되었을때) 업데이트된다. 전혀 업데이트되지 않으면 기본값으로 30이 주어진다.


위의 첫번째 예제에서, 9번째 키는 두부분을 가진 멀티-파트 키이다.


Keyblocks used
What percentage of the keyblocks are used. Since the table used in the examples had just been reorganize
d with isamchk, the values are very high (very near the theoretical maximum).
키블락이 사용하고 있는 비율.(%) 예제의 테이블은 isamchk로 재조직화(reorganize)되었
기 때문에 값이 매우 높다.(이론적인 최대값에 매우 근접)

Packed
MySQL tries to pack keys with a common suffix. This can only be used for CHAR/VARCHAR/DECIM
AL keys. For long strings like names, this can significantly reduce the space used. In the third example ab
ove, the 4th key is 10 characters long and a 60% reduction in space is achieved.
.... 이름과 같은 long 문자열에서 공간 사용을 상당히 줄인다. 위의 네번째 예제에서 4번째 키는 10
문자 long 이고 60%의 공간이 줄었다.
(** 번역이 잘 안되는데 접미사같은 것을 붙여서 문자열 등의 공간을 줄인다 머 그런 것이겠지요 *
*)

Max levels
How deep the B-tree for this key is. Large tables with long keys get high values.

Records
테이블의 레코드수.
M.recordlength
평균 레코드 길이. 고정 길리 레코드의 테이블에서 이 값은 레코드 길이와 같다.

Packed
MySQL strips spaces from the end of strings. The Packed value indicates the percentage saving
s achieved by doing this.


mysql은 문자끝의 공백을 제거한다.Packed value는 이렇게 해서 절약된 공간의 비율을 말한다.

Recordspace used
데이타 파일이 사용하는 공간의 비율.

Empty space
데이타 파일이 사용하지 않는 공간의 비율.

Blocks/Record
레코드당 평균 블락수.(즉, 단편화된 레코드가 몇개의 링크로 구성되어 있는지) 고정-포
맷 테이블에서는 항상 1이다. 이 값은 가능한한 1에 가깝게 유지해야한다. 이 값이 너무 커지면 isa
mchk로 테이블을 최적화(reorganize)해야 한다. 13.5.3 [Optimizaiton] 참고.

Recordblocks
사용하는 블락(링크)수. 고정 포맷에서 이값은 레코드수와 같다.

Deleteblocks
삭제된 블락(링크)수.

Recorddata
데이타 파일이 사용하는 바이트수.

Deleted data
데이터 파일에서 삭제된(사용하지 않는) 바이트수.

Lost space
레코드가 매우 짧은 길이로 업데이트되면 약간의 공간을 잃게 된다. 이 값은 이러한 공간
의 bytes 합계이다.

Linkdata
동적 테이블 포맷을 사용할 때,레코드 조각은 포이터로 링크된다.Linkdata는 이런 포인터
에서 사용하는 저장 공간의 합이다.


pack_isam으로 테이블을 압축했으면, isamchk -d 는 각 테이블 컬럼에 대한 추가적인 정보를 출력
한다.이러한 정보와 그 정보가 무엇을 의미하는지에 대해서는 12.3 [pack_isam]을 참고.


{{}}13.5 파손 복구에 isamchk 사용하기.
mysql에서 데이타를 저장하는데 사용하는 파일 포맷은 광범위하게 테스트되었다. 그렇지만 데이
터베이스 테이블의 손상될 수 있는 외부적인 상황이 항상 있다:



ㅇ 쓰기 도중에 mysqld 프로세스가 죽었을때.
ㅇ 예상치 못하게 컴퓨터가 셧다운되었을때(예를 들어, 컴퓨터의 전원이 나가는 경우)
ㅇ 하드웨어 에러

이번 절에서는 mysql 데이터베이스에서 data의 손상을 체크하고 이에 대처하는 방법에 대해서 설
명한다.

손상 복구 작업을 할 때 테이터베이스의 각 테이블 tbl_name은 데이터베이스 디렉토리의 세 파일
에 조응한다는 것에 대해서 이해하고 있는 것이 중요하다:

파일 용도
`tbl_name.frm' 테이블 정의(형식) 파일
`tbl_name.ISD' 데이타 파일
`tbl_name.ISM' 인덱스 파일


세가지 파일 타입은 다양한 방법으로 손상을 당한다. 그렇지만 대부분의 문제는 데이타 파일과 인
덱스 파일에서 생긴다.

isamchk는 '.ISD' (데이타) 파일의 복사복을 만들어 작업을 한다. 이전의 '.ISD' 파일을 제거하고 새
로운 파일을 이전의 파일 이름으로 바꾸면서 복구 작업을 마친다. --quick 옵션을 사용하면 isamchk
는 임시 '.ISD' 파일을 만들지 않는다. 대신 '.ISD' 파일이 정확하다고 가정하여 '.ISD' 파일은 손대지
않고 새로운 인덱스 파일만 생성한다. isamchk는 자동으로 'ISD' 파일이 손상되었는지 확인하고 손
상되었을 경우 복구 작업을 중지하므로 --quick 옵션을 사용하는 것은 안전하다. 두개의 -quick 옵
션을 사용할 수 있다. 이런 경우 특정한 에러(중복된 키 등)에서 취소를 하지는 않지만 '.ISD' 파일
을 수정하여 문제를 해결하려고 한다.일반적으로 두개의 --quick 옵션을 사용하는 것은 복구작업
을 수행하기 위한 디스크 공간이 거의 없을 경우에만 유용하다. 이런 경우 isamchk를 수생하기전
에 최소한 백업을 해 놓아야 한다.

{{}}
13.5.1 에러가 났을때 테이블 점검 방법

테이블을 점검하기 위해 다음의 명령을 사용한다:
:
isamchk tbl_name
모든 에러의 99.99%를 발견할 수 있다. 이 경우 발견하지 못하는 것은 데이타 파일과 관
련된 손상이다.(일반적으로 거의 생기지 않는다) 테이블을 점검하고자 한다면 일반적으로는 아무
런 옵션을 주지 않거나 -s 나 --silent 옵션을 주어 isamchk를 수행하는 것이다.

isamchk -e tbl_name
이 옵션은 모든 데이터를 완전하게 점검한다.( -e 는 "extended check" 를 의미한다) 모든
키가 정확한 레코드를 가리키고 있는지 점검한다.It does a check-read of every key for each row to ve
rify that they indeed point to the correct row. 많은 키를 가진 큰 테이블에서는 시간이 많이 걸린다. is
amchk는 일반적으로 첫번째 에러를 발견하면 실행을 멈춘다. 더 많은 정보를 얻고자 한다면, --ver
bose (-v) 옵션을 추가할 수 있다. 이 옵션을 추가하면 isamchk는 최대 20개의 에러가 있을 때까지
계속 실행을 한다. 일반적으로는 간단한 isamchk (테이블 이름 외에 아무런 인수도 없는)만으로 충
분하다.

isamchk -e -i tbl_name
위의 명령과 같다. 그렇지만 -i 옵션을 붙이면 isamchk가 정보의 통계를 출력한다.


13.5.2 테이블 복구방법

손상된 테이블의 징후는 일반적으로 질의가 갑자기 중지되고 다음과 같은 에러를 낸다:
ㅇ`tbl_name.frm' is locked against change
ㅇCan't find file `tbl_name.ISM' (Errcode: ###)
ㅇGot error ### from table handler (Error 135 is an exception in this case)
ㅇUnexpected end of file
ㅇRecord file is crashed

이런 경우, 테이블을 고쳐야 한다. isamchk는 일반적으로 잘못된 것을 감지하고 대부분을 고친다.

복구 과정은 아래에서 설명하는대로 4단계가 있다.시작하기 전에 먼저 데이타베이스 디렉토리로
이동하고(cd 명령 이용) 테이블 파일의 퍼미션을 확인해야 한다. mysqld를 실행할 수 잇는 유닉스
사용자가 읽을 수 있는지 확인해야 한다. (또한 작업을 하려는 사용자. 왜냐하면 점검하려는 파일
에 접근해야 하기 때문이다) 파일을 수정해야 한다면 파일에 쓰기 권한이 있어야 ㅎ난다.

1단계 : 테이블 점검

isamchk *.ISM 또는 (충분한 시간이 있다면 isamchk -e *.ISM). 불필요한 정보를 보지 않으려면 -s (s
ilent) 옵션을 사용한다.

isamchk에서 에러가 있다고 알리는 테이블만 고쳐야 한다. 이런 테이블의 경우는 2단계로 넘어간
다.

점검하면서 에러를 만났을 때(out of memory 에러 등) 또는 isamchk가 기능을 멈추었을 때 3단계로
넘어간다.


2단계 : 쉽고 안전한 복구

먼저 isamchk -r -r tbl_name을 시도한다. (-r -q는 "빠른 복구 모드"를 의미) 이경우 데이타 파일은 손
대지 않고 인덱스 파일 복구를 시도한다. 데이타 파일이 제대로 되어 있고 삭제 링크가 데이타 파
일내의 정확한 위치를 가리키고 있다면, 원활하게 작동을 하고 테이블을 고칠 것이다.(If the data fi
le contains everything that it should and the delete links point at the correct locations within the data file, t
his should work and the table is fixed.) 다음 테이블을 고치자. 그게 아니라면 다음 과정을 사용한다:

1. 진행하기 전에 데이타 파일의 백업본 만들기
2. isamchk -r tbl_name 사용.(-r 는 "복구 모드" 의미) 그러면 데이타 파일에서 정확하지 않
은 레코드와 삭제된 레코드를 제거하고 인덱스 파일을 재구성한다.
3. 앞의 과정이 실패하면, isamchk --safe_recover tbl_name을 사용. Safe recovery 모드는 구
식 복구 방법을 사용하며 일반적인 복구 모드로 할 수 없는 몇가지 경우에 사용할 수 있다.(그렇지
만 더 느리다)


점검하면서 에러를 만났을 때(out of memory 에러 등) 또는 isamchk가 기능을 멈추었을 때 3단계로
넘어간다.


3단계 : 어려운 복구

인덱스 파일의 첫 16k 블락이 파괴되거나 정확하지 않은 정보를 가지고 있을 때, 또는 인덱스 파일
이 없는 경우에만 이번 단계까지 온다. 이경우 새로운 인덱스 파일을 만들어야 한다. 다음과 같이
하자:

1. 데이타 파일을 안전한 장소로 이동.
2. 새로운(빈) 데이타와 인덱스 파일을 만들기 위해 table description 파일을 사용:
shell> mysql db_name
mysql> DELETE FROM tbl_name;
mysql> quit
3. 이전의 데이타 파일을 새롭게 만든 데이터 파일로 복사. (이전의 데이타 파일을 새로운
파일로 옮기지는 말자; 잘못되었을 경우 복사본을 유지하길 원할 것이다)

2단계로 가자. isamchk -r -q는 이제 제대로 작동을 할 것이다. (무한 루프가 되면 안된다. This shoul
dn't be an endless loop).



4단계 : 매우 어려운 복구

description 파일 또한 손상을 입었을 경우에만 이번 단계까지 온다. description 파일은 테이블을 만
든 이후에 변경이 되지 않기 때문에, 이러한 경우는 결코 생겨서는 안된다.

1. 백업본에서 description 파일을 복구해 3단계로 넘어간다. 또한 인덱스 파일을 복구할
수 있고 2단계로 넘어간다. 뒤의 경우 isamchk -r로 시작을 해야 한다.
2. 백업본이 없지만 정확히 어떻게 테이블을 만들었는지 알고 있다면, 다른 데이터베이
스에 테이블의 복사본을 만든다. 새로운 데이타 파일을 제거하고 다른 데이터베이스의 description
과 인덱스 파일을 손상된 데이터베이스로 옮긴다. 이렇게 하면 새로운 description 과 인덱스 파일
을 얻을 수 있지만 데이타 파일만 따로 남아있다. 2단계로 가서 인덱스 파일을 재구성한다.

13.5.3 테이블 최적화

레코드를 삭제하거나 업그레이드 하면서 생긴 단편화된 레코드를 모으고 불필요하고 낭비된 공간
을 제거하기 위해 복구 모드로 isamchk를 실행한다:

shell> isamchk -r tbl_name

SQL OPTIMIZE TABLE 문을 이용하여 같은 방법으로 테이블을 최적화할 수 있다. OPTIMIZE TA
BLE 은 쉽지만 isamchk가 더 빠르다.

또한 isamchk는 테이블의 성능을 향상시킬 수 있는 몇가지 옵션을 사용할 수 있다:

-S, --sort-index
high-low 순서로 인덱스 트리 블락을 정열. 검색을 최적화하고 키에 의한 테이블 검색을
빠르게 한다.
-R index_num, --sort-records=index_num
인덱스에 따라 레코드를 정열. 데이타를 지역화하고 이 인덱스를 사용하는 SELECT 와 O
RDER BY 오퍼레이션의 속도를 향상시킨다. (처음에는 정열을 하는 시간이 엄청 느리다!) 테이블
의 인덱스 번호를 확인하려면 SHOW INDEX를 사용하면 되며, SHOW INDEX는 isamchk가 인덱스
를 검색하는 순서대로 테이블의 인덱스를 보여준다. 인덱스는 1번부터 번호가 매겨진다.
-a, --analyze
테이블에서 키의 분포를 분석. 나중에 테이블에서 레코드를 가져올 때 조인의 성능을 향
상시킨다.
15. mysql ODBC 지원


mysql은 MyODBC 프로그램을 통해 ODBC에 대한 지원을 제공한다.

15.1 MyODBC 를 지원하는 운영체제

MyODBC 는 윈도우95와 NT에서 32비트 ODBC(2.50) 레벨 0 드라이버이다. 우리는 누군가가 윈
도우 3.x 에 이 프로그램을 포팅해주길 바란다.
(** 당근, 저는 능력안됨 **)


15.2 MyODBC에 문제가 있는 경우

ODBC는 액세스, Admndemo.exe, C++-빌더, Centura Team Developer (formerly Gupta SQL/Win
dows), 콜드퓨전(솔라리스용), 크리스탈 레포트, 델파이, 엑셀, iHTML, FileMaker Pro, 폭
스프로, 노츠 Notes 4.5/4.6, SBSS, perl DBD-ODBC, 파라독스, 파워빌더, VC++, 비주얼 베
이직에서 테스팅되었다.

MyODBC 에서 잘 작동하는 다른 애플리케이션이 있으면 myodbc@tcx.se 에 메일을 보내주세
요~ (** 이정도는 해 주어야 서로서로 좋겠지용**)

어려움에 부딪치면, ODBC 매니저에서의 로그 파일과 MyODBC 로그에 대해서 알고 싶다. 이런
파일이 있으면 문제를 조금이나마 줄이는데 도움이 될 것이다.

MyODBC log 파일을 얻으려면 MyODBC 연결/설정 화면의 'Trace MyODBC' 옵션에 체크를 한다.
로그는 `c:\myodbc.log' 에 기록될 것이다. 이 옵션이 제대로 작동하려면 MYSQL2.DLL 이 아
니라 MYSQL.DLL 을 사용해야 한다는 것을 기억하자!


15.3 MyODBC 와 잘 작동하는 프로그램

대부분의 프로그램은 myodbc 와 잘 작동한다. 그렇지만 아래의 각 목록에 있는 것은 우리가
직접 테스팅하였거나 다른 사람들이 제대로 작동한다고 확증해 준 것이다::

ㅇ액세스
액세스와는 잘 작동한다:
- 테이블에서 프라이머리 키를 지정해야 한다.
- 업데이트가 되길 원하는 모든 테이블에 timestamp를 가지고 있어야 한다.
- double float 필드만을 사용해야 한다. single floats 와 비교를 하면 실패한다.
- mysql에 연결할 때 'Return matching rows' 옵션 필드에 체크를 하자.
- NT에서의 액세스는 BLOB 컬럼을 OLE OBJECTS 로 보고한다. 대신 MEMO 컬럼을 가
지길 원하면 ALTER TABLE 을 이용해 컬럼을 TEXT 로 바꾸자.

ㅇ 엑셀
잘 작동한다 몇가지 팁이 있다:

dates 에서 문제가 있으면 CONCAT() 함수를 사용하여 string 으로서 select 를 사용하자.
예를 들면:

select CONCAT(rise_time), CONCAT(set_time) from sunrise_sunset;


문자열로서 값을 가져오며 엑셀97에서 time 값이 제대로 인식될 것이다.

이 예제에서 CONCAT()의 목적은 ODBC가 컬럼을 "string type"으로 생각하도록 속이는 것이
다. CONCAT() 가 없으면, ODBC는 컬럼을 time 타입으로 인식하며 엑셀은 이것을 이해하는데
실패한다.

이것은 엑셀의 버그라는 것을 기억하자. 엑셀은 자동적으로 문자열(string)을 time으로 변
환한다. 소스가 텍스트 파일이라면 잘 될 것이다. 그렇지만 소스가 각 컬럼의 정확한 타입
을 보고하는 ODBC 연결이라면 분명히 어리석은 짓이다.

ㅇ odbcadmin
ODBC 테스트 프로그램.


ㅇ 델파이
DBE 3.2 나 이후 버전을 사용해야 한다. mysql에 연결할 때 'Don't optimize column width'
옵션 필드에 체크를 한다.

물론, 여기에는 myodbc 를 위한 ODBC 목록과 BDE 목록을 세팅하기 위해 잠재적으로 유용한
델파이 코드가 있다. (BDE 목록은 델파이 슈퍼 페이지에서 공개로 받을 수 있는 BDE Alias
데이터를 필요로 한다) : (Thanks to Bryan Brunton bryan@flesherfab.com for this)

fReg:= TRegistry.Create;
fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
fReg.WriteString('Database', 'Documents');
fReg.WriteString('Description', ' ');
fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
fReg.WriteString('Flag', '1');
fReg.WriteString('Password', ");
fReg.WriteString('Port', ' ');
fReg.WriteString('Server', 'xmark');
fReg.WriteString('User', 'winuser');
fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
fReg.WriteString('DocumentsFab', 'MySQL');
fReg.CloseKey;
fReg.Free;

Memo1.Lines.Add('DATABASE NAME=');
Memo1.Lines.Add('USER NAME=');
Memo1.Lines.Add('ODBC DSN=DocumentsFab');
Memo1.Lines.Add('OPEN MODE=READ/WRITE');
Memo1.Lines.Add('BATCH COUNT=200');
Memo1.Lines.Add('LANGDRIVER=');
Memo1.Lines.Add('MAX ROWS=-1');
Memo1.Lines.Add('SCHEMA CACHE DIR=');
Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
Memo1.Lines.Add('SQLQRYMODE=');
Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
Memo1.Lines.Add('ENABLE BCD=FALSE');
Memo1.Lines.Add('ROWSET SIZE=20');
Memo1.Lines.Add('BLOBS TO CACHE=64');
Memo1.Lines.Add('BLOB SIZE=32');

AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);


ㅇ C++빌더
BDE 3.0과 테스팅을 했다. 유일하게 알려진 문제는 테이블 스키마를 변경할 대로 질의 필드
가 업데이트되지 않는다. 그런데 BDE는 문제는 아닌 것 같지만 index PRIMARY 에서만 프라
이머리 키를 인식하지 못하는 것으로 보인다.
Tested with BDE 3.0. The only known problem is that when the table schema changes, q
uery fields are not updated. BDE however does not seem to recognize primary keys, onl
y the index PRIMARY, though this has not been a problem.


ㅇ 비주얼 베이직
테이블을 업데이트 가능하게 하려면 테이블의 프라이머리 키를 정의해야 한다.
(** 이 부분은 제가 출력한 ps 파일에는 없는데 웹사이트에는 있네요... **)
{{}}


15.4 ODBC 관리자 프로그렘 설정 방법

윈도우 95에서 서버의 이름을 지정하는 것에는 세가지 방법이 있다:

- 서버의 IP 주소 사용.
-'lmhosts' 파일에 다음의 정보 추가:
ip hostname
예를 들면
194.216.84.21 my
- DNS를 사용하여 PC를 설정

"ODBC setup" 을 채우는 예제:

Windows DSN name: taejun
Description: This is my love database
MySql Database: love
Server: 194.216.84.21
User: taejun
Password: my_password
Port:

윈도우즈 DSN 이름 필드의 값은 윈도우즈 ODBC 셋업에서 유일한 값이다.

ODBC 셋업 화면에서 서버, 유저, 패스워드, 포드 필드에 값을 지정할 필요는 없다. 그러나
지정을 해두면 그 값이 연결을 시도할 때 기본값으로 사용된다. 그때마다 값을 바꿀 수 있
다.

포트 번호가 주어지지 않으면, 기본 포트(3306)이 사용된다.


15.5 ODBC에서 AUTO_INCREMENT 컬럼의 값 가져오기

일반적인 문제는 INSERT 에서 어떻게 자동으로 생성되는 ID 값을 가져올 수 있느냐이다. OD
BC에서 다음과 같이 할 수 있다. (auto 가 AUTO_INCREMENT 필드라고 가정):

INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();

또는, 다른 테이블에 ID를 입력한다면 다음과 같이 할 수 있다:

INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');

다른 ODBC 애플리케이션(최소한 델파이와 액세스)에서 유용하게 사용하기 위해 다음의 질의
를 새롭게 입력된 열을 찾는데 사용할 수 있다:

SELECT * FROM tbl_name WHERE auto IS NULL;
17. 일반적인 문제 해결 방법

17. 1. 데이터베이스 복사(복제?)

데이터베이스를 복사하는 가장 일반적인 방법은 업데이트 로그를 이용하는 것이다. 9.2 [Th
e update log] 참고. 이 경우 마스터로 작동하는 데이터베이스 하나(데이터가 변경된 곳)와
슬레이브로 작동하는 다른 하나의 데이터베이스가 필요하다. 슬레이브를 업데이트하려면 단
지 mysql < update_log을 하면 된다. 슬레이드 데이터베이스에 맞는 호스트, 유저, 패스워
드 옵션을 지정한다. 그리고 입력값으로 마스터 데이터베이스의 업데이트 로그를 사용한다.

테이블에서 삭제한 것이 없다면, 마지막으로 복사를 한 후 (마지막으로 복사한 시간을 비
교) 테이블에서 입력되거나 변경된 열을 찾아내기 위해 TIMESTAMP 컬럼을 사용할 수 있고
미러링되는 데이터베이스에 변경된 자료만 복사를 한다.

업데이트 로그(for deletes)와 timestamps(on both sides)를 같이 사용하여 두가지 방법으
로 업데이트하는 시스템을 만들 수 있다. 그러나 이런 경우 두가지 ends(?)에서 변경된 동
일한 데이터에서 충돌을 관리할 수 있어야 한다. 아마도 어떤 것이 업데이트되었는지 결정
하기 위해 예전 버전을 유지하고 싶을 것이다.

It is possible to make a two-way updating system using both the update log (for delet
es) and timestamps (on both sides). But in that case you must be able to handle confl
icts when the same data have been changed in both ends. You probably want to keep the
old version to help with deciding what has been updated.

이 경우 복사(복제)는 SQL문으로 이루어지기 때문에, 데이터베이스를 업데이트하는 문장에
서 다음의 함수를 사용해서는 안된다; 여기에서는 원본 데이터베이스와 동일한 값을 반환하
지 않을 수 있다:

DATABASE()
GET_LOCK() and RELEASE_LOCK()
RAND()
USER(), SYSTEM_USER() or SESSION_USER()
VERSION()

timestamp는 필요한 경우에 미러되는 곳으로 보내기지 때문에 모든 time 함수는 안전하게
사용할 수 있다. LAST_INSERT_ID() 또한 안전하게 사용할 수 있다.

All time functions are safe to use, as the timestamp is sent to the mirror if needed.
LAST_INSERT_ID() is also safe to use.


17.2 데이터베이스 백업

mysql 테이블은 파일로 저장되기 때문에 백업하기가 쉽다. 일관된 백업 작업을 위해
관련된 테이블에 LOCK TABLES를 실행하자. 7.23 [LOCK TABLES/UNLOCK TABLES synta
x]를 참고. 단지 읽기 락만이 필요하다; 데이터베이스 디렉토리의 파일 복사본을 만드
는 동안에도 다른 스레드에서는 테이블에 질의를 계속 할 수 있다. SQL 레벨의 백업을
하고자 한다면 SELECT INTO OUTFILE을 사용할 수 있다.

데이터베이스를 백업하는 다른 방법은 mysqldump 프로그램을 사용하는 것이다:

데이터베이스에 대한 풀 백업 실행:

shell> mysqldump --tab=/path/to/some/dir --lock-tables --opt

서버에서 업데이트를 하지 않는한 간단하게 모든 테이블 파일(`*.frm', `*.ISD' , `*.
ISM' 파일)을 복사할 수 있다. mysqld가 실행되고 있으면 멈추어야 한다. 그러고나서
--log-update 옵션으로 다시 시작하자. ''hostname.n'의 형식을 가진 로그 파일이 생
성될 것이다. n은 mysqladmin refresh, mysqladmin flush-logs, the FLUSH LOGS 문,
또는 서버를 재시작할때마다 증가하는 숫자이다. 이렇게 생긴 로그 파일을 이용해 mys
qldump를 수행하고 나서 데이터베이스에 변화된 내용을 복사(복제)하는데 필요한 정보
를 얻을 수 있다.

복원하고자 한다면, 먼저 isamchk -r을 사용해 테이블을 복구하자. 모든 경우 99.9%가 제대
로 수행된다. isamchk가 실패하면 다음의 과정대로 따르자:


기존의 mysqldump 백업을 복원한다.
업데이트 로그에서 업데이트를 다시 수행하기 위해 다음의 명령을 실행한다:

shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql

ls는 정확한 순서대로 로그 파일을 가져오는데 사용된다.

또한 SELECT * INTO OUTFILE 'file_name' FROM tbl_name을 이용해 선택적인 백업을 할 수
있으며 레코드가 중복되는 것을 방지하기 위해 LOAD DATA INFILE 'file_name' REPLACE ...
을 이용해 복원할 수 있다. 이경우에는 테이블에서 PRIMARY 키나 UNIQUE 키가 필요하다. RE
PLACE 키워드는 새로운 레코드에서 unique 키 값이 같은 이전의 레코드가 중복되는 경우 이
전의 레코드를 새로운 레코드로 교체한다.


17.3 같은 머신에서 여러개의 mysqld 서버 실행하기
같은 머신에서 다중의 서버를 사용하길 원할 수 있다. 예를 들어, 이전의 서버를 그대
로 두고 새로운 mysql 릴리즈를 테스팅하는 경우가 있을 수 있다. 또는 다른 고객들
에게 독립적인 mysql 설치를 제공하길 원하는 인터넷 서비스 제공자일 수 있다.

다중 서버를 사용하길 원하면, 가장 쉬운 방법은 다른 TCP/IP 포트와 소켓 파일로 서버를
컴파일해서 서버에서 동일한 TCP/IP 포트나 소켓 파일을 청취하지 않도록 할 수 있다.

이미 사용하고 있는 서버가 기본 포트와 소켓 파일로 구성되어 있다고 가정해보자. 그러면
다음과 같은 명령으로 새로운 서버를 설정하자:

shell> ./configure --with-tcp-port=port_number \
--with-unix-socket=file_name \
--prefix=/usr/local/mysql-3.22.9

여기서 port_number와 file_name은 기본 포트 숫자 및 소켓 파일의 경로와는 달라야하며, -
-prefix 값은 현재 설치되어 있는 mysql과는 다른 디렉토리를 지정해야 한다.

Here port_number and file_name should be different than the default port number and s
ocket file pathname, and the --prefix value should specify an installation directory
different than the one under which the existing MySQL installation is located.

다음의 명령으로 현재 실행되고 있는 mysql 서버의 소켓과 파일을 확인할 수 있다:

shell>; mysqladmin -h hostname --port port_number variables

사용하고 있는 포트에서 실행되고 있는 mysql 서버가 있다면, 소켓 이름을 포함해 mysql의
가장 중요한 설정 변수의 목록을 알 수 있다. 다중 mysqld 서버를 시작하고 중지시키기 위
해 시스템의 초기화 스크립트(일반적으로 ''mysql.server')를 수정해야 한다.

다른 포트와 소켓으로 서버를 시작하기 위해 새로운 mysql 서버를 재컴파일할 필요는 없다.
safe_mysqld를 시작할 때 옵션으로 포트와 소켓을 지정할 수 있다:

shell>; /path/to/safe_mysqld --socket=file-name --port=file-name

동일한 데이터베이스 디렉토리에서 로그를 기록하도록 하면서 또 다른 서버를 실행하고자
한다면, safe_mysqld 에 --log 와 --log-update 를 이용해 로그 파일의 이름을 지정해 주어
야 한다. 그렇지 않으면 두 서버가 같은 로그 파일에 기록을 하려고 할 것이다.

주의 : 일반적으로 동일한 데이터베이스의 자료를 업데이트하는 두개의 서버를 사용해서는
안된다! 운영체제에서 fault-free 시스템 로킹(locking)을 지원하지 않는다면, 좋지 않은
결과를 보게 될 것이다. (** fault-free란 정확히 무엇인지 모르겠군요. 아마도 락을 거는
데 문제가 있다면 그 락을 해제하는 것으로 보입니다. **)

두번재 서버에서 다른 데이터베이스 디렉토리를 사용하기 원하면 safe_mysqld 에 --datadir
=path 옵션을 사용할 수 있다.

다른 포트에서 실행중인 mysql 서버에 접근하길 원한다면 다음의 방법을 사용할 수 있다:

ㅇ 클라이언트에서 다음의 옵션을 가지고 시작. --host 'hostname' --port=port-n
umer or [--host localhost] --socket=file-name.
ㅇ C나 펄 프로그램에서 mysql 서버에 접속할 때 포트와 소켓 인자를 준다.
ㅇ 클라이언트를 시작하기 전에 MYSQL_UNIX_PORT 와 MYSQL_TCP_PORT 환경 변수를
설정. 일반적으로 특정한 소켓이나 포트를 사용하면, 'login' 파일에 환경 변수를 설정하
자. 12.1 [Programs] 참고.
ㅇ 홈 디렉토리에서 '.my.cnf' 파일에 기본 소켓과 TCP/IP 소켓을 지정. 4.15.4
[Option files] 참고.

-http://cafe.naver.com/ssesse.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=519 펌-

'DataBase > MySQL' 카테고리의 다른 글

사용자 추가 / DB 추가  (0) 2015.11.25
MySQL 사용자 추가  (0) 2010.05.21
mysql 재시작  (0) 2010.04.24
mysql 버젼 확인  (0) 2010.04.24
innodb 와 myisam 의 차이점과 성능비교  (0) 2010.04.24