Professional Documents
Culture Documents
MySQL Korean Manual
MySQL Korean Manual
제목검색
1 MySQL 한글 매뉴얼에 대하여.. 본 매뉴얼은 오픈 소스 데이터 베이스의 대명사인 MySQL 데이터 베이스에 대한 사용 설명서로서, MySQL AB가 발행한
2 MySQL 설치 및 업그레이드 하기 “MySQL 5.0 Reference Manual”을 한국어로 번역한 것입니다.
3 사용 설명서
4 MySQL 프로그램 사용하기 MySQL DB는 속도, 안정성, 대중성에 있어서 이미 확고한 자리를 잡은 데이터 베이스 시스템입니다. MySQL AB의 한국내 공식
5 데이터 베이스 관리 골드 파트너사인 ㈜아이티 브릿지는 한국내 MySQL DB 사용자께서 MySQL DB가 가지고 있는 특징과 장단점을 보다 효과적으
6 리플리케이션 로 파악할 수 있도록 본 한글 매뉴얼을 만들었으며, 따라서 현업에 MySQL을 적용하시고자 하시는 분에게 좋은 참고가 되길 바랍
7 최적화(Optimization) 니다.
http://www.mysqlkorea.com/develop/sub_07.html2006-08-03 오후 3:14:03
:::MySQL Korea:::
제목검색
2.3.10 윈도우 명령어 라인으로 MySQL 시작하기 2.13.3. Perl DBI/DBD 인터페이스 사용상의 문제점
2.3.11 윈도우 서비스의 형태로 MySQL 시작 하기
2.3.12 설치된 MySQL 테스트 하기 이 장에서는 MySQL을 다운 로드하고 설치하는 방법에 대해 설명을 한다. 아래에서는 이러한 과정을 개략적
2.3.13 윈도우에서 MySQL 설치 문제 해결 으로 설명을 한 다음에 나중에 보다 자세한 설명을 하기로 하겠다. 여러분이 이미 설치되어 있는 버전을 새로
2.3.14 윈도우에서 MySQL 업그레이드 하기 운 버전으로 업그레이드를 할 생각이라면, Section 2.10, “MySQL 업그레이드 하기”를 참조하기 바란다.
2.3.15 윈도우에서의 MySQL과 유닉스에서의 MySQL 비교 1. 여러분이 사용하는 플랫폼을 지원하는지 검사. 모든 시스템이 MySQL을 구동 시키는데 적합
한 것은 아니라는 사실을 알아두기 바란다. Section 2.1.1, “MySQL이 지원하는 OS”을 참조할
2.4 리눅스에 MySQL 설치 하기
것.
2.5 Mac OS X에 MySQL 설치 하기
2. 설치할 배포판 선택. 대부분의 MySQL 버전은 몇가지의 배포판 포맷으로 제공된다. 여러분은
2.6 Installing MySQL on NetWare
바이너리(컴파일 이전) 프로그램 또는 소스 코드를 가지고 있는 패키지 않된(pre-packaged) 배포
2.7 유닉스와 유사한 다른 시스템에 MySQL 설치 하기
판을 선택할 수 있다. 우리는 또한 최근의 개발 단계에 있는 제품을 보고 우리가 새로운 코드에 대해
2.8 소스 배포판을 사용해서 MySQL 설치하기
테스트를 하는데에 도움을 주고자 하는 사람들을 위해 현재의 소스 트리에 접속할 수 있는 방법도 함
2.8.1 소스 배포판 설치 소개
께 제공을 한다. 어떤 버전 및 타입의 배포판을 사용할 지 결정하기 위해서는, Section 2.1.2, “설치
2.8.2 전형적인 configure 옵션들
할 MySQL 배포판 선택하기”를 참조할 것.
2.8.3 개발 단계 소스 트리를 가지고 MySQL 설치하기 3. 설치할 배포판 다운 로드하기. 다운 로드 방법에 대해서는, Section 2.1.3, “MySQL 다운 로
2.8.4 MySQL 컴파일 문제 다루기 드하기”를 참조할 것. 배포판의 집적도를 검사하기 위해서는, Section 2.1.4, “MD5 체크섬
2.8.5 MIT-pthreads 노트 (Checksums) 또는 GnuPG 를 사용해서 패키지 집적도 검사하기”의 지침을 따를 것.
2.8.6 소스 배포판을 사용해서 윈도우에 MySQL 설치하기 4. 배포판 설치하기. 바이너리 배포판으로부터 MySQL을 설치하기 위해서는, Section 2.2, “바
2.8.7 윈도우에서 MySQL 클라이언트 컴파일 하기 이너리 매포판을 사용해서 표준 MySQL 설치하기”의 지침을 따를 것. 현재의 개발 단계 소스 트리
2.9 MySQL설치 후 설정 및 테스트 에서 또는 소스 배포판을 사용해서 MySQL을 설치하기 위해서는 Section 2.8, “소스 배포판을 사
2.9.2 유닉스에서 MySQL설치후 해야 할 과정 여러분이 설치하는 과정에서 어려움을 느끼게 된다면, Section 2.12, “OS-특성 노트”를 참조하
여 특정 플랫폼에 대한 문제를 해결하기 바란다.
2.9.2.1 mysql_install_db 구동상의 문제점들
5. 설치후 필요한 설정 작업 하기. MySQL을 설치한 후에는, Section 2.9, “설치후 설정 및 테스
2.9.2.2 자동으로 MySQL 을 시작하기 및 종료하기
트”의 과정을 읽어 보기 바란다. 이 섹션에는 MySQL 서버가 올바르게 동작할 수 있게끔 만드는 방
2.9.2.3 MySQL 서버 시작하기와 문제점 해결 하기
법에 대한 중요한 정보를 포함하고 있다. 또한, 초기 MySQL 계정에 대한 보안 작업을 하는 방법도
2.9.3 초기 MySQL 계정에 보안 작업하기
설명을 하는데, 이 초기 계정들은 여러분이 패스워드를 설정하기 전까지는 패스워드를 갖고 있지 않
2.10 MySQL 업그레이드 하기
게 된다. 이 섹션은 여러분이 MySQL을 바이너리 또는 소스 배포판을 사용해서 설치했는지에 따라
2.10.1 MySQL 5.0에서 업그레이드 하기
적용이 된다.
2.10.2 MySQL 4.1에서 5.0으로 업그레이드 하기
6. 여러분이MySQL 벤치마크 스크립트를 구동 시키고자 한다면, MySQL용 Perl을 반드시 설치해
제목검색
상위메뉴리스트 ◆ 2.1. 일반 설치 사항
2.1.1 MySQL이 지원하는 OS 2.1.4. MD5 체크섬(Checksums) 또는 GnuPG 를 사용해서 패키지 검사하기
2.1.5. 설치 레이 아웃(Layouts)
2.1.2 MYSQL 설치 배포판 선택하기
2.1.2.1 설치할 MySQL 버전 선택하기
MySQL을 설치하기 전에, 여러분은 아래의 사항을 고려해야 한다:
2.1.2.2 배포판 포맷 선택하기
1. MySQL을 여러분의 머신에서 구동 시킬것인지 결정.
2.1.2.3 릴리즈는 언제 어떻게 발표 되는가
2. 설치할 배포판을 선택.
2.1.2.4 릴리즈 철학—릴리즈판에는 알려진 오류가 없다
3. 배포판을 다운 로드하고 내용물을 검증.
2.1.2.5 MySQL AB사가 컴파일한 MySQL 바이너리
이 섹션은 위의 단계를 실행하는데 필요한 정보를 제공한다. 위의 단계를 수행하고 나면, 여러분은 다음 장에서
2.1.3 MySQL 가져오기
설명하는 방식을 사용해서 각자가 선택한 배포판을 설치할 수 있게 될 것이다.
2.1.4 MD5 체크썸(Checksums) 또는 GnuPG를 사용해서 패키지
검사 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=1&scate=0&idx=562006-08-03 오후 3:16:54
:::MySQL Korea:::
제목검색
2.1.1 MySQL이 지원하는 OS 우리는GNU Autoconf를 사용하며, 따라서 MySQL은 C++컴파일러가 있고 POSIX쓰레드(thread)를 실행하는 모든 현대의 시스
템에 포팅될 수 있다.(쓰레드 지원은 서버를 위해 필요하다. 클라이언트 코드만 컴파일 한다면, C++컴퍼일러만 필요하다.) 우리
는 소프트웨어를 주로 리눅스(수세 및 레드헷), FreeBSD, 및 썬 솔라리스에서 개발하고 있다(버전 8 및 9).
MySQL은 아래와 같은 OS및 쓰레드 패키지 조합에서 성공적인 컴파일이 이루어졌다는 보고를 받고 있다. 많은 OS의 경우, 네이
티브 쓰레드(native thread)는 최신의 버전에서만 지원된다는 점을 유의하자.
● 네이티브 쓰레드와 AIX 4.x, 5.x. Section 2.12.5.3, “IBM-AIX 노트” 참조.
● 아미가(Amiga).
● MIT-pthreads 패키지와 BSDI 2.x. Section 2.12.4.4, “BSD/OS Version 2.x 노트” 참조.
● 네이티브 쓰레드와 BSDI 3.0, 3.1 및 4.x . Section 2.12.4.4, “BSD/OS Version 2.x 노트” 참조.
● 네이티브 쓰레드와 Digital Unix 4.x. Section 2.12.5.5, “Alpha-DEC-UNIX 노트(Tru64)” 참조.
● MIT-pthreads 패키지와 FreeBSD 2.x. Section 2.12.4.1, “FreeBSD 노트” 참조.
● 네이티브 쓰레드와 FreeBSD 3.x 및 4.x. Section 2.12.4.1, “FreeBSD 노트” 참조.
● 리눅스쓰레드(LinuxThread)와FreeBSD 4.x. Section 2.12.4.1, “FreeBSD 노트” 참조.
● DCE 쓰레드 또는 MIT-pthreads 패키지와 HP-UX 10.20. Section 2.12.5.1, “HP-UX Version 10.20 노트” 참조.
● 네이티브 쓰레드와 HP-UX 11.x. Section 2.12.5.2, “HP-UX Version 11.x 노트” 참조.
● Linux 2.0+ with 리눅스쓰레드(LinuxThreads) 0.7.1+와 리눅스 2.0+ 또는 다양한 CPU 아키텍처에 대한 glibc 2.0.7
+. Section 2.12.1, “Linux 노트” 참조.
● Mac OS X. Section 2.12.2, “Mac OS X 노트” 참조.
● NetBSD 1.3/1.4 Intel 및 NetBSD 1.3 Alpha (GNU판이 요구됨). Section 2.12.4.2, “NetBSD 노트” 참조.
● Novell NetWare 6.0 및 6.5. Section 2.6, “NetWare 에 MySQL설치하기” 참조.
● 네이티브 쓰레드와 OpenBSD 2.5. MIT-pthreads 패키지와 OpenBSD 2.5 이전 버전. Section 2.12.4.3, “OpenBSD
2.5 노트” 참조.
● OS/2 Warp 3, FixPack 29 및 OS/2 Warp 4, FixPack 4. Section 2.12.6, “OS/2 노트” 참조.
● FSU pthreads 패키지 최신 포트와 SCO OpenServer 5.0.X . Section 2.12.5.8, “SCO UNIX 및OpenServer 5.0.x 노
트” 참조.
● SCO Openserver 6.0.x. Section 2.12.5.9, “SCO OpenServer 6.0.x 노트”.
● SCO UnixWare 7.1.x. Section 2.12.5.10, “SCO UnixWare 7.1.x 및 OpenUNIX 8.0.0 노트” 참조.
● 네이티브 쓰레드와 SGI Irix 6.x . Section 2.12.5.7, “SGI Irix 노트” 참조.
● SPARC 및 x86상의 네이티브 쓰레드와 Solaris 2.5 및 이상 버전. Section 2.12.3, “Solaris 노트” 참조.
● MIT-pthreads 패키지와 SunOS 4.x. Section 2.12.3, “Solaris 노트” 참조.
● Tru64 Unix. Section 2.12.5.5, “Alpha-DEC-UNIX 노트(Tru64)” 참조.
● Windows 9x, Me, NT, 2000, XP, 및 Windows Server 2003. Section 2.3, “윈도우에 MySQL 설치하기” 참조.
● 쓰레드 라이브러리에 대한 일반적인 안정성. 플랫폼이 뛰어난 명성을 갖고 있지 않는다고 하면, MySQL은 다른 모든 것이
완벽하다 하더라도, 그 자체가 호출하는 쓰레드 라이브러리만큼만 안정성이 보장된다.
● 대칭 다중 프로세서(symmetric multi-processor(SMP))시스템의 장점을 살리는 커널 및 쓰레드 라이브러리의 능력. 다
른 말로 표현하면, 프로세스가 쓰레드를 생성할 때, 프로세스는 원래의 프로세스가 아닌 다른 CPU상에서 쓰레드를 구동 시
키는 것이 가능하여야 한다.
● 지나친 문맥의 없이, 자주 짧은 크리티컬한 범위에서 뮤텍스(mutex)를 얻고 공개하기 위한 커널 및 쓰레드 라이브러리의
능력. 만약 pthread_mutex_lock() 의 실행이 너무 불안해서 CPU에 여분의 시간이 없게 된다면, 이것은 MySQL에 심각
한 문제를 야기한다. 만일 이 문제를 제대로 다루지 않으면, 추가로 CPU를 장착한다 하더라도 MySQL은 느려지게 된다.
● 일반적인 파일 시스템(filesystem)의 안정성 및 성능.
● 만일 여러분의 테이블이 크다면, 성능은 파일 시스템이 큰 파일을 어떻게 효과적을 처리하는지에 따라 전적으로 의존하게
된다.
● MySQL AB사에는 플랫폼에 대한 전문적인 견해가 있음. 만약 여러분이 자신의 플랫폼을 잘 알고 있다면, 우리는 그 플랫
폼에 대해 최적화를 할 수 있고 컴파일 시간을 확정해 줄 수 있다. 우리는 또한 MySQL에 여러분의 시스템을 최적화 시키
는 것에 대한 조언도 제공하여 준다.
● 우리는 내부적으로 유사한 구성 환경에 대해 대단히 많은 테스트를 진행하였다.
이전의 표준에 근거하여, 이 시점에서 MySQL을 구동하기에 가장 적합한 플랫폼은 수세 리눅스 2.4 또는 2.6커널을 사용하는
x86, ReiserFS (또는 유사한 리눅스 배포판) 및 솔라리스(2.7-9)와 스팍(SPARC)이다. FreeBSD 는 세번째로 잘 동작하는 것
이지만, 우리는 진정으로 쓰레드 라이브러리가 개선된 후에는 제일 잘 돌아가는 플랫폼의 범주에 속하기를 원한다. 우리는 또한, 아
직은 동일한 안정성과 성능을 제공하지는 않지만, 현재 MySQL이 컴파일되고 구동되는 모든 다른 플랫폼이 이러한 최상위 범주에
속하기를 희망한다. 이것은 우리의 입장에서는 MySQL이 의존하는OS 및 라이브러리 컴퍼넌트 개발자와의 부단한 협력이 필요한
것이다. 만일 여러분이 이러한 컴퍼넌트 중 하나를 개선하는데 관심이 있고, 이러한 요소를 개발하는데 영향력을 미칠 수 있는 입장
에 있다면, 그리고 MySQL을 보다 효과적으로 구동시키는데 있어서 보다 많은 정보를 필요로 한다면, MySQL internals 메일링 리
스트에 이메일을 보내주길 바란다. Section 1.7.1, “MySQL 메일링 리스트” 참조.
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=1&scate=2&idx=582006-08-03 오후 3:17:34
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기 여러분이 가장 처음으로 결정해야 할 것은 제품(가장 안정적임)을 사용할 것인지 또는 개발 릴리즈판을 사용할 것인지를 결
2.1. 일반 설치 사항 정하는 것이다. MySQL의 개발 과정에는, 여러 개의 릴리즈 시리즈가 공존하는데, 각각의 시리즈는 완성도가 서로 다른 단계
우리는 계속 오류를 해결해야 하고 여러가지 다른 해결도 진행해야 하기 때문에 완벽한 코드의 동결에 대해서는 믿지 않고 있
다. “다소 확정된”이라는 표현을 사용해서, 우리는 현재의 안정화된 제품내에 어떤것도 영향을 받지 않는 미미한 것들은 추
가할 수도 있다. 물론, 이전 시리즈에 관련된 오류 해결(bugfixes)은 이후 버전에서 계속 진행된다.
일반적으로, 여러분이 처음으로 MySQL을 시작하거나 또는 아직 바이너리 배포판이 깔려 있지 않은 시스템에 이것을 설치하
고자 할 경우에는, 우리는 안정적인 제품을 먼저 사용하기를 권장한다. 현재, 제품으로는 MySQL 5.0이 있다. 모든 MySQL
릴리즈는, 비록 개발 단계 시리즈라 하더라도, MySQL벤치 마크와 함께 검사 되며, 출시되기 전에 광범위한 테스트를 거치게
된다.
만일 이전의 오래된 시스템을 구동하고 있으며 시스템의 중단 없이(non-seamless) 새로이 업그레이드를 하고자 한다면, 여
러분은 현재 사용하고 있는 동일 릴리즈 시리즈의 최신 버전을 업그레이드 해야 한다(버전 숫자의 맨 마지막 숫자가 최신 버
전을 말함). 우리는 해당 버전의 “안정적인” 변경에 관련된 부분만 관련하여 치명적인 오류만을 수정한다.
만일 현재 제품화된 릴리즈에는 포함되지 않은 기능들을 사용하고자 한다면, 개발 단계에 있는 시리즈를 사용하면 된다. 개발
단계의 시리즈는 제품화된 시리즈보다는 안정적이지 못하다는 점을 유의한다.
만일 모든 패치(patches)와 오류 해결이 포함된 가장 최신의 소스를 사용하고자 한다면, 여러분은 우리의 비트키퍼
(BitKeeper) 저장소에 있는 것 중의 하나를 사용하면 된다. 여기에 있는 것은 아직 발표(release)된 것은 아니지만, 향후에
발표될 릴리즈 시리즈의 코드를 미리 검토할 수는 있을 것이다.
MySQL의 명명 계획(naming scheme)은 세 개의 숫자와 하나의 접미사로 이루어 진다; 예를 들면, mysql-5.0.12-beta.
릴리즈 내부에 포함된 숫자들은 다음과 같이 해석된다:
● 처음 숫자(5)는 주요 버전을 의미하며 파일의 포멧을 나타낸다. 모든 MySQL 5 릴리즈는 동일한 파일 포맷을 갖는
다.
● 두 번째 숫자(0)는 릴리즈 레벨이다. 주요 버전 번호와 함께 사용되면 릴리즈 시리즈 번호가 된다.
● 세 번째 숫자(12)는 릴리즈 시리즈에 있는 버전 번호이다. 이것은 새로운 버전이 출시될 때마다 더해진다. 일반적으
로 여러분은 최신의 릴리즈 버전을 사용하고자 할 것이다.
각각의 미약한 업데이트의 경우, 버전 문자열의 마지막 숫자가 증가한다. 중요한 새로운 기능이 추가되거나 또는 이전 버전과
다소 호환성이 떨어지게 되면, 두 번째 번호가 증가한다. 파일 포맷이 변경될 경우에는, 첫 번째 번호가 증가한다.
릴리즈 이름은 또한 발표되는 버전의 안정성을 나타내는 접미사를 포함한다. 하나의 시리즈안에 있는 릴리즈는 접미사의 셋
을 통해 얼마나 안정화를 이루고 있는지 나타낸다. 사용 가능한 접미사로는:
● 알파(alpha) 는 아직 전체적으로 테스트를 진행하지 않은 새로운 기능이 포함되었음을 나타낸다. 알려진 오류는 뉴
스 섹션에 서류로 정리 된다. Appendix D, MySQL Change History 를 참조할 것. 대부분의 알파 릴리즈는 새로운
명령어와 확장 기능을 구현한다. 주요 코드 변경이 포함될 수 있는 실제 개발 과정은 알파 릴리즈에서 이루어 진다. 하
지만, 우리는 이 릴리즈를 발표하기 전에 테스트를 진행한다.
● 베타(beta) 는 기능- 완성(feature-complete)이 이루어진 릴리즈를 의미하며 모든 새로운 코드는 테스트를 마쳤음
을 의미한다. 주요 기능들은 새롭게 추가되지는 않는다. 여기에는 알려진 치명적인 오류는 없다. 적어도 한달 동안에
는 치명적인 오류가 보고되지 않고 이전에 구현시킨 기능들을 신뢰하지 못하게 할 정도의 새로운 기능을 추가할 계획
모든 API, 외부적으로 보여지는 구조, 그리고 SQL명령문에 대한 컬럼들은 향후의 베타 버전, 릴리즈 예정, 또는 제
품화 릴리즈에서는 변경되지 않는다.
MySQL의 모든 릴리즈는 우리의 표준 테스트와 벤치마크를 거침으로서 사용하기에 상대적으로 안정적이라는 것을 검증하게
된다. 표준 테스트는 이전에 발견된 모든 오류를 검사하도록 계속 확장 되어지기 때문에, 테스트 슈트(suite)는 보다 효과적
인 상태를 유지하게 된다.
● 내부 테스트 슈트
● MySQL 벤치마크 슈트
이 슈트는 컬럼 쿼리의 범위를 테스트한다. 이것은 또한 최신의 최적화 배치(batch)가 실제로 코드를 보다 빠르게 진
행시키는지에 대해서도 검사를 한다. Section 7.1.4, “MySQL 벤치마크 슈트”를 참조할 것.
● crash-me 테스트
이 테스트는 데이터 베이스가 지원하는 기능이 무엇이며 그 기능의 능력 제약 사항은 무엇인지를 판단한다.
Section 7.1.4, “MySQL 벤치마크 슈트”를 참조할 것.
제목검색
2. MySQL 설치 및 업그레이드 하기 설치할 MySQL의 버전을 선택한 후에는, 여러분은 바이너리 배포판을 사용할 지 아니면 소스 배포판을 사용할 지를 결정해
2.1. 일반 설치 사항 야 한다. 대부분의 경우, 여러분의 플랫폼에 해당하는 것이 있다면, 여러분은 주로 바이너리 배포판을 사용할 것이다. 바이너
2.1.2 MYSQL 설치 배포판 선택하기 리 배포판은, 리눅스에 대한 RPM 파일 또는 Mac OS X를 위한 DMG 패키지와 같이, 많은 플랫폼에 대해 네이티브(native)
2.1.2.1 설치할 MySQL 버전 선택하기 포맷으로 사용할 수 있다. 배포판은 또한 집 아카이브(Zip archive) 또는 압축된 tar 파일의 형태로 사용 가능하다.
확장된 MySQL 바이너리 배포판은 -max 접미사로 구분되며 mysqld-max 와 같은 옵션으로 구성된다.
Section 5.3, “mysqld-max 확장된 MySQL 서버”를 참조할 것.
RPM 배포판의 경우, 만일 MySQL-Max RPM을 사용하고자 한다면, 여러분은 우선 표준 MySQL-server RPM
을 설치하여야 한다.
제목검색
2. MySQL 설치 및 업그레이드 하기 MySQL 은 매우 빠르게 릴리즈를 진행하며 우리는 새로운 개발자들이 다른 MySQL개발자들과 정보를 공유하기를 원한다.
2.1. 일반 설치 사항 우리는 우리가 다른 사람들이 필요로 할 수도 있는 새롭고 유용한 기능들을 가질 때마다 새로운 릴리즈를 생산하고자 노력한
● 릴리즈는 각 시리즈안에서 이루어 진다. 각 릴리즈의 경우, 버전의 최종 번호는 같은 시리즈안에 있는 이전 버전보다
하나가 많게 된다.
● 제품(안정화)릴리즈는 일년에 1-2번 출시한다. 하지만, 작은 오류가 발견되면, 오류를 해결한 릴리즈만 출시한다.
● 이전 버전에 대한 릴리즈/오류 해결은 매 4-8주 간격으로 발표한다.
● 플랫폼에 대한 바이너리 배포판의 주요 릴리즈는 우리가 진행한다. 다른 사람들이 시스템에 대한 바이너리 배포판을
만들 수는 있지만, 그리 흔한 일은 아니다.
● 우리는 작은 또는 그리 치명적이지는 않은 오류를 우리가 발견할 때마다 가능하면 빨리 수정한다. 이러한 해결은 비트
키퍼 저장소에서 찾을 수 있으며, 다음 릴리즈에 추가 되어진다.
● 릴리즈판에서 치명적인 오류가 발견될 경우에는, 우리는 가능한 한 빠른 시간에 새로운 버전에서 이를 수정하는 것이
원칙이다.(우리도 다른 업체가 하는 방식을 따르는 것이다!)
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=1&scate=2&idx=632006-08-03 오후 3:22:05
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기 우리는 많은 시간과 노력을 들여 우리의 릴리즈판이 오류가 없도록 하고 있다. 우리는 지금까지 한번도 이미 알려져 있는 치명
2.1. 일반 설치 사항 적인 반복 오류가 있는 상태로 MySQL 버전을 발표한 적이 없다.(“치명적” 오류는 일반적인 사용 상황에서 MySQL이 깨
2.1.2 MYSQL 설치 배포판 선택하기 지거나, 정상적인 쿼리에 대해 부정확한 답을 만들어 내거나, 또는 보안상의 문제가 있다는 것을 의미한다.)
● 우리는 테스트 또는 벤치마크 슈트가 실패한 바이너리에 대해서는 발표하지 않는다. 만일 문제가 소스에 있는 일반적
인 에러로 인한 것이라면, 우리는 그것을 해결하고 모든 시스템에서 다시 한번 테스트를 진행한다.
● 프로세스 정립 및 테스트는 일주일간 진행한다. 만일 우리가 이 과정 중에 치명적인 오류를 보고 받으면(예를 들면,
코어 덤프에서 발생), 우리는 이 문제를 해결하고 프로세스를 재 정립한다.
● http://dev.mysql.com/에 바이너리를 발표한 후에는, 우리는 mysql 및 announce 메일링 리스트를 통해 이 메시지
를 발표한다. Section 1.7.1, “MySQL 메일링 리스트”를 참조할 것. 이 발표 메시지는 릴리즈에서 일어난 모든 변
경 사항과 알게 된 모든 문제를 포함한다. 릴리즈 노트에 있는 알려진 문제들 섹션은 릴리즈를 사용할 때에만 필요한
것이다.
● 우리의 사용자에게 빠른 시간에 MySQL의 새로운 기능들을 알려 주기 위해, 우리는 새로운 버전을 매 4-8주 동안 만
들기 위해 노력한다. 소스 코드 스냅 샷은 매일 생성되며 이것은 http://downloads.mysql.com/snapshots.php 에
서 볼 수 있다.
● 만일, 우리의 노력에도 불구하고, 릴리즈판이 발표된 후에 특정 플랫폼에서 치명적인 문제를 발생시키는 어떠한 오류
가 보고 되면, 우리는 이것을 해결한 후 그 플랫폼에 해당하는 새로운 릴리즈를 만든다.
● 안정화된 릴리즈를 만들기 위한 우리의 트랙 레코드는 매우 좋다. 최근의 150개의 릴리즈의 경우, 우리는 이중에서
10개 미만의 오류를 새롭게 만들었다. 이 중에 세가지는, 우리가 오랜 시간 동안 트랙 다운했던 구축 시스템중에 하나
에서 오류 glibc 라이브러리를 만든 오류였다.
제목검색
2. MySQL 설치 및 업그레이드 하기 MySQL AB사의 서비스 차원에서, 우리는 우리가 보유하고 있는 시스템 또는 MySQL AB사를 지원하는 사용자가 보유한 시스템
2.1. 일반 설치 사항 에서 컴파일한 바이너리 배포판을 제공하고 있다.
이러한 바이너리들은 다음의 컴파일러와 옵션들과 함께 구성되어진다. 이 정보는 모든 바이너리 tar파일 배포판의 스크립트 bin/
mysqlbug 내부에 있는 변수 COMP_ENV_INFO 및 CONFIGURE_LINE 에서 얻을 수도 있다.
아래의 configure 명령어 중에 어떤 것에 대해서 보다 많은 옵티말(optimal) 옵션를 원하는 사람이라면 원하는 것을 MySQL
internals 메일링 리스트에 이메일을 보내시면 얻을 수 있다. Section 1.7.1, “MySQL 메일링 리스트”를 참조 할 것.
만약에 MySQL의 디버그 버전을 컴파일 하고자 한다면, 여러분은 다음의 configure 명령어에 --with-debug 또는 --with-
debug=full 를 추가해야 하고 -fomit-frame-pointer 옵션은 모두 삭제해야 한다.
• --with-extra-charsets=complex --enable-thread-safe-client
• --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
● Linux 2.4.x x86 with icc (Intel C++ Compiler 8.1 or later releases):
• --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data
• --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex
• --disable-shared --with-client-ldflags=-all-static
● Linux 2.4.xx Intel Itanium 2 with ecc (Intel C++ Itanium Compiler 7.0):
• --with-extra-charsets=complex --enable-thread-safe-client
• --enable-local-infile
● Linux 2.4.xx Intel Itanium with ecc (Intel C++ Itanium Compiler 7.0):
• --prefix=/usr/local/mysql --with-extra-charsets=complex
• --enable-thread-safe-client --enable-local-infile
● Linux 2.4.xx alpha with ccc (Compaq C V6.2-505 / Compaq C++ V6.3-006):
• --with-extra-charsets=complex --enable-thread-safe-client
• --enable-local-infile --with-mysqld-ldflags=-non_shared
• --with-client-ldflags=-non_shared --disable-shared
• --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin
• --with-extra-charsets=complex --enable-thread-safe-client
• --with-innodb
• --prefix=/usr/local/mysql --with-extra-charsets=complex
• --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
• --with-extra-charsets=complex --enable-thread-safe-client
• --enable-local-infile --disable-shared
• --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin
• --with-extra-charsets=complex --enable-thread-safe-client
• --with-extra-charsets=complex --enable-thread-safe-client
• --with-named-curses-libs=-lcurses --disable-shared
• --with-extra-charsets=complex --enable-thread-safe-client
• --enable-local-infile --with-named-z-libs=no
• --with-named-curses-libs=-lcurses --disable-shared
• --with-extra-charsets=complex --enable-thread-safe-client
• --disable-shared
• --with-extra-charsets=complex --enable-thread-safe-client
● IBM AIX 4.3.3 ppc with xlC_r (IBM Visual Age C/C++ 6.0):
제목검색
2.1.3 MySQL 가져오기 downloads/mirrors.html를 보면 알 수 있다. 여러분은 또한 미러 사이트 예정인 것에 대한 정보 및 정보가 제대로 업데이트 되지
않고 있는 미러 사이트에 대해서 어떻게 보고를 해야 하는지에 대한 정보도 알아볼 수 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=1&scate=3&idx=662006-08-03 오후 3:26:11
:::MySQL Korea:::
제목검색
2.1.4 MD5 체크썸(Checksums) 또는 GnuPG를 사용해서 패키지 검 2.1.4.3. Signature Checking Using RPM
사 하기
2.1.4.3 RPM을 사용한 서명 체크 지가 손상되지 않았는지를 검사해야 한다. MySQL AB사는 세가지 검사 방법을 제공한다:
● MD5 체크썸(checksums)
● GNU 프라이버시 지침서인 GnuPG 를 사용한 암호화 서명
● RPM 패키지에 대해서는, 내장되어 있는RPM 집적도 검증 메커니즘
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=1&scate=4&idx=672006-08-03 오후 3:26:18
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.1. 일반 설치 사항 MySQL을 다운 로드한 후, 여러분은 MySQL다운 로드 페이지에서 제공하는 것 MD5체크썸 중에 하나를 가지고 검증을 해야 한
2.1.4 MD5 체크썸(Checksums) 또는 GnuPG를 다. 각 패키지는 개별 체크썸을 가지고 있으며 여러분은 아래의 명령어로 이것을 검증할 수 있으며, package_name 은 여러분이 다
사용해서 패키지 검사 하기 운 로드한 패키지의 이름이 된다:
aaab65abbec64d5e907dcd41b8699945 mysql-standard-5.0.19-linux-i686.tar.gz
여러분은 결과 체크썸(16진법 숫자열)이 다운 로드한 패키지의 하단에 표시되어 있는 것과 일치 하는지 확인해야 한다.
Note: 아카이브 내부에 있는 파일들을 검사하는 것이 아니라 아카이브 파일 (예를 들면, .zip 또는 .tar.gz 파일)의 체크 썸을 검사
하는 것이다.
모든 OS가 md5sum 명령어를 지원하는 것은 아니라는 것을 유의 한다. 어떤 OS는 단순히md5만을 호출하지만, 다른 것은 아무것
도 지원하지 않는 것도 있다. 리눅스의 경우, 이것은 GNU Text Utilities 패키지의 일 부분에 있으며, 이것은 다양한 플랫폼에서 사
용 가능 하다. 여러분은 소스 코드를 http://www.gnu.org/software/textutils/ 에서도 다운 로드할 수 있다. 만일 OpenSSL 이 설
치 되어 있다면, 여러분은 openssl md5 package_name 명령어를 대신 사용할 수 있다. md5 명령어 라인 유틸리티의 윈도우 실행
은 http://www.fourmilab.ch/md5/에서 얻을 수 있다. winMd5Sum 는 그래픽 기반의 MD5 검사 툴로서, http://www.nullriver.
com/index/products/winmd5sum에서 얻을 수 있다.
제목검색
2. MySQL 설치 및 업그레이드 하기 패키지의 인증 및 집적도를 검사하는 다른 방법능 암호 서명을 사용하는 것이다. 이 방법은 MD5 체크썸 검사보다는 신뢰도가 높으
2.1. 일반 설치 사항 나, 보다 많은 작업을 해야 한다.
2.1.4.1 MD5 체크썸 검증 맨(Phil Zimmermann )이 사용한 유명한 Pretty Good Privacy (PGP)에 대한 오픈 소스 진영의 대안 방법이다. GnuPG 에 대한
2.1.4.2 GnuPG를 사용한 서명 검사 보다 자세한 정보는 http://www.gnupg.org/을 참조하면 된다. 여기에는 다운 로드 방법 및 설치 방법에 대해서도 설명을 하고 있
다. 대부분의 리눅스 배포판은 이 패키지를 디폴트로 해서 배포되고 있다. http://www.openpgp.org/ 도 함께 참조 바람.
2.1.4.3 RPM을 사용한 서명 체크
특정 패키지에 대한 서명 검증을 하기 위해서는, 우선 MySQL AB사의 공중(public) GPG 구축 키가 필요하게 되는데, 이것은
http://www.keyserver.net/에서 다운로드할 수 있다. 여러분이 다운 로드해야 할 키는 build@mysql.com 라는 이름의 것이다.
다른 방법으로는, 여러분은 아래의 문장에서 직접 키를 복사해서 사용할 수가 있을 것이다:
Key ID:
Fingerprint: A4A9 4068 76FC BD3C 4567 70C8 8C71 8D3B 5072 E1F5
mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3
RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ
fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3
BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW
hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV
K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE
kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI
QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep
rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q7TXlTUUwgUGFj
a2FnZSBzaWduaW5nIGtleSAod3d3Lm15c3FsLmNvbSkgPGJ1aWxkQG15c3FsLmNv
bT6IXQQTEQIAHQUCPj6jDAUJCWYBgAULBwoDBAMVAwIDFgIBAheAAAoJEIxxjTtQ
cuH1cY4AnilUwTXn8MatQOiG0a/bPxrvK/gCAJ4oinSNZRYTnblChwFaazt7PF3q
zIhMBBMRAgAMBQI+PqPRBYMJZgC7AAoJEElQ4SqycpHyJOEAn1mxHijft00bKXvu
cSo/pECUmppiAJ41M9MRVj5VcdH/KN/KjRtW6tHFPYhMBBMRAgAMBQI+QoIDBYMJ
YiKJAAoJELb1zU3GuiQ/lpEAoIhpp6BozKI8p6eaabzF5MlJH58pAKCu/ROofK8J
Eg2aLos+5zEYrB/LsrkCDQQ+PqMdEAgA7+GJfxbMdY4wslPnjH9rF4N2qfWsEN/l
xaZoJYc3a6M02WCnHl6ahT2/tBK2w1QI4YFteR47gCvtgb6O1JHffOo2HfLmRDRi
Rjd1DTCHqeyX7CHhcghj/dNRlW2Z0l5QFEcmV9U0Vhp3aFfWC4Ujfs3LU+hkAWzE
7zaD5cH9J7yv/6xuZVw411x0h4UqsTcWMu0iM1BzELqX1DY7LwoPEb/O9Rkbf4fm
Le11EzIaCa4PqARXQZc4dhSinMt6K3X4BrRsKTfozBu74F47D8Ilbf5vSYHbuE5p
/1oIDznkg/p8kW+3FxuWrycciqFTcNz215yyX39LXFnlLzKUb/F5GwADBQf+Lwqq
a8CGrRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1ZaSaf
anFvwFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGoTbOW
I39EcyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev42Lmu
QT5NdKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkKHt92
6s/ymfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUOetdZ
Whe70YGNPw1yjWJT1IhMBBgRAgAMBQI+PqMdBQkJZgGAAAoJEIxxjTtQcuH17p4A
n3r1QpVC9yhnW2cSAjq+kr72GX0eAJ4295kl6NxYEuFApmr1+0uUq/SlsQ==
=YJkx
이 구축 키를 여러분 개인의 공중 GPG 키링에(keyring) 넣기 위해서는, gpg –import를 사용한다. 예를 들면, 여러분이 키를
mysql_pubkey.asc라는 파일에 저장을 하였다면, 입력 명령어는 다음과 같이 보일 것이다:
공중 구축 키를 다운로드 하고 입력을 한후에, 여러분이 원하는 배포판 패키지와 그에 상응하는 서명을 다운로드 한다. 서명 파일
은 배포판의 이름과 동일한 이름을 가지고 확장자는.asc 가 된다. 예를 들면:
두개의 파일이 동일한 디렉토리에 저장되어야 한다는 것을 명심하여야 하며, 그 다음에는 아래의 명령어를 사용해서 배포판 파일
의 서명을 검사하도록 한다:
예제:
gpg: Signature made Tue 12 Jul 2005 23:35:41 EST using DSA key ID 5072E1F5
gpg: Good signature from "MySQL Package signing key (www.mysql.com) <build@mysql.com>"
Good signature 메시지는 모든 것이 제대로 되어 있다는 것을 의미한다. 여러분은 insecure memory 경고문에 대해서는 전혀 신
경을 쓰지 않아도 된다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.1. 일반 설치 사항 RPM 패키지의 경우, 개별 서명이 존재하지 않는다. RPM 패키지는 내부에 GPG 서명과 MD5 체크썸을 갖고 있다. 여러분은 아래
Note: 여러분이 RPM 4.1를 사용하고 이것이 (GPG) NOT OK (MISSING KEYS: GPG#5072e1f5)의 결과를 내보내면, 설사 여
러분이 MySQL 공중 구축 키(public build key)를 여러분 개인의GPG 키링(keyring)에 넣어 놓았다 하더라도, 여러분은 그 키를
RPM 키링(keyring)에 먼저 가져올 필요가 있다. RPM 4.1은 더 이상 여러분 개인의GPG 키링(또는 GPG 자체)를 사용하지 않는
다. 반대로, 그것은 시스템 확장 어플리케이션이고 사용자의 GPG공중 키링은 사용자 관련 파일이기 때문에 자신의 키링 자체를 유
지한다. MySQL 공중 키를 RPM 키링에 가져오기 위해서는, 우선 Section 2.1.4.2, “Signature Checking Using GnuPG”에서
키를 얻어야 한다. 그 다음에rpm --import 를 사용해서 키를 가져온다. 예를 들면, 만일 mysql_pubkey.asc 라는 이름의 파일에
공중 키를 저장하고 있다면, 이것을 다음의 명령어를 사용해서 가져온다:
제목검색
상위메뉴리스트 ◆ 2.1.5. 설치 레이 아웃
2. MySQL 설치 및 업그레이드 하기
2.1. 일반 설치 사항 이 섹션에서는 MySQL AB사가 제공하는 바이너리 또는 소스 배포판을 설치할 때 생성되는 디렉토리의 디폴트 레이 아웃에 대해
2.1.5 설치 레이 아웃 설명하기로 한다. 다른 벤더가 제공하는 배포판에 대해서는 우리가 여기에서 제공하는 레이 아웃과 다소 차이가 있을 것이다.
윈도우상의 MySQL 5.0의 경우, 디폴트 설치 디렉토리는 C:₩Program Files₩MySQL₩MySQL Server 5.0이 된다. (어떤 윈도
우 사용자는 MySQL이 이전에 사용했던 디폴트 디렉토리인 C:₩mysql에 설치하는 것을 선호할 수도 있는데, 여기에 설치하여도
서브 디렉토리의 레이 아웃은 동일한 형태를 갖게 된다.) 설치 디렉토리는 아래와 같은 서브 디렉토리를 갖는다:
Docs Documentation
lib Libraries
/usr/share/doc/packages Documentation
/usr/lib/mysql Libraries
/usr/share/sql-bench Benchmarks
유닉스의 경우, tar 파일 바이너리 배포판은 여러분이 선택한 곳(일반적으로는 /usr/local/mysql)에 패키지를 풀면서 설치되고 그
위치에 다음의 디렉토리를 생성한다:
lib Libraries
scripts mysql_install_db
sql-bench Benchmarks
소스 배포판은 여러분이 설정을 구성하고 컴파일을 한 후에 설치가 된다. 디폴트로는, 설치 단계는 파일을 /usr/local에 설치하며,
서브 디렉토리는 다음과 같다:
lib/mysql Libraries
설치 디렉토리 안에서, 소스 설치의 레이 아웃은 아래의 방법에서 바이너리 설치와는 다르게 나타난다:
제목검색
상위메뉴리스트 ◆
2.2. 바이너리 배포판을 사용해서 표준 MySQL 설치하기
2. MySQL 설치 및 업그레이드 하기
Section 2.1, “일반 설치 사항”를 참조 하면, 어떤 바이너리 배포판이 사용 가능하며 그것을 어떻게 다운 로드할 수 있
는지에 대한 보다 많은 정보를 찾을 수 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=2&scate=0&idx=722006-08-03 오후 3:28:19
:::MySQL Korea:::
제목검색
2.3.2 자동 설치기를 사용한 MySQL 설치 2.3.5. 노인스톨 집 아카이브(Noinstall Zip Archive)로부터 MySQL 설치 하기
2.3.6. 설치 아카이브 추출
2.3.3 MySQL 설치 마법사 사용 하기
2.3.7. 옵션 파일 생성
2.3.3.1 설치 마법사 소개
2.3.8. MySQL 서버 타입 선택하기
2.3.3.2 MySQL설치 마법사 다운 로드 및 시작 하기
2.3.9. 처음으로 서버 시작하기
2.3.3.3 설치 타입 선택 하기
2.3.10. 윈도우 명령어 라인에서 MySQL 시작하기
2.3.3.4 커스텀 설치 다이어로그
2.3.11. 윈도우 서비스 형태로 MySQL 시작하기
2.3.3.5 확인(Confirmation) 다이어로그(Dialog)
2.3.12. MySQL 설치 검사 하기
2.3.3.6 MySQL 설치 마법사에 의한 변경 사항
2.3.13. 윈도우에서 MySQL 설치 트러블 슈팅(Troubleshooting)
2.3.3.7 설치 마법사를 사용한 MySQL 업그레이드 2.3.14. 윈도우에서 MySQL 업그레이드 하기
2.3.4 구성(Cinfiguration) 마법사 사용 하기 2.3.15. 유닉스상의 MySQL과 윈도우상의 MySQL 비교하기
2.3.4.1 구성 마법사 소개
2.3.4.2 MySQL 구성 마법사 시작 하기 MySQL의 네이티브 윈도우 배포판은 버전3.21에서부터 MySQL AB사가 제공하고 있으며 매일 매일 다운 로드
2.3.4.3 관리 옵션 선택하기 횟수가 늘어나고 있다. 이 섹션은 윈도우에서 MySQL을 설치하는 과정을 설명하기로 한다.
2.3.4.4 구성 타입 선택 하기 Note: 이미 MySQL4.1.5 이전 버전이 설치된 시스템을 업그레이드 하고자 한다면, 여러분은 Section 2.3.14,
2.3.4.6 데이터 베이스 사용량 다이어로그 윈도우에서 MySQL 을 구동하기 위해서는, 아래의 사항이 필요하게 된다:
2.3.4.9 네트워킹 및 스트릭트(strict) 모드 옵션 다이어로그 윈도우 NT-기반 OS(NT, 2000, XP, 2003)는 MySQL을 서버로 동작하게끔 한다. 윈도우 NT-기반
2.3.4.10 문자 셋 다이어로그 OS의 사용을 적극 권장한다. Section 2.3.11, “윈도우 서비스 형태로 MySQL 시작하기”를 참조할
2.3.10 윈도우 명령어 라인으로 MySQL 시작하기 Section 23.1, “MySQL Connector/ODBC”를 참조할 것.
2.3.11 윈도우 서비스의 형태로 MySQL 시작 하기 ● 4GB보다 큰 테이블 크기를 필요로 한다면, NTFS또는 새로운 파일 시스템에 MySQL을 설치해야 한다.
2.3.12 설치된 MySQL 테스트 하기 테이블 생성시 MAX_ROWS AVG_ROW_LENGTH 를 사용하는 것을 잊지 말기 바란다.
Section 13.1.5, “CREATE TABLE 신텍스”를 참조할 것.
2.3.13 윈도우에서 MySQL 설치 문제 해결
2.3.14 윈도우에서 MySQL 업그레이드 하기
윈도우용 MySQL은 여러가지 배포판 형식으로 사용 가능하다:
2.3.15 윈도우에서의 MySQL과 유닉스에서의 MySQL 비교
아래의 섹션에서는 바이너리 배포판을 사용한 MySQL 설치 방법을 설명한다. 설치기가 없는 설치 패키지의 사용
은, Section 2.3.5, “노인스톨(Noinstall) 집 아카이브로부터 MySQL설치 하기”에서 설명하는 과정을 따라 진
행하면 된다. 소스 배포판을 사용한 설치는, Section 2.8.6, “소스 배포판으로 윈도우에 MySQL 설치 하기”를
참조하기 바란다.
윈도우용 MySQL배포판은 http://dev.mysql.com/downloads/에서 다운로드 받을 수 있다. Section 2.1.3,
“MySQL 가져 오기”를 참조할 것.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL 5.0의 경우, 윈도우에 MySQL을 설치할 때 세 가지의 설치 패키지를 선택할 수 있다:
2.3.1 설치 패키지 선택 하기
● The Essentials Package: 이 패키지는mysql-essential-5.0.19-win32.msi 와 비슷한 파일 이름을 갖고 있으며 윈도우
에 MySQL을 설치하는데 필요한 최소의 파일들을 갖고 있고, 구성 마법사를 갖고 있다. 이 패키지에는 임베디드 서버 또
는 벤치마크 슈트와 같은 선택적인 요소들은 없다.
● The Complete Package: 이 패키지는 mysql-5.0.19-win32.zip 와 비슷한 파일 이름을 갖고 있으며, 구성 마법사를 포
함해서 윈도우에 MySQL을 설치하는데 필요한 모든 파일들을 갖고 있다. 이 패키지에는 임베디드 서버 및 벤치마크 슈트
등이 포함되어 있다.
● The Noinstall Archive: 이 패키지는 mysql-noinstall-5.0.19-win32.zip 과 유사한 파일 이름을 가지며 구성 마법사
를 제외한 모든 설치 파일들이 포함된다. 이 패키지는 자동 설치기가 포함되지 않으며, 따라서 설치 및 시스템 구성을 수동
으로 해야 한다.
대부분의 사용자에게는 Essentials package를 권장한다. 여기에는 윈도우 설치기와 함께 사용할 수 있는 .msi 파일이 제공된다.
Complete 및 Noinstall 배포판은 집(Zip)아카이브 형태로 패키지되어 있다. 이것들을 사용하기 위해서는, .zip 파일을 해제할 수
있는 툴이 있어야 한다.
어떤 설치 패키지를 선택하는지에 따라 여러분은 서로 다른 설치 과정을 따라야 한다. Essentials 또는 Complete 패키지를 선택하
였다면, Section 2.3.2, “자동 설치기를 사용한 MySQL설치”를 참조 하기 바라며, Noinstall아카이브의 경우에는,
Section 2.3.5, “노인스톨 집 아카이브(Noinstall Zip Archive)를 사용한 MySQL 설치”를 참조하기 바란다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=1&idx=742006-08-03 오후 3:29:21
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 새로운 MySQL 사용자는 윈도우상에서 MySQL 설치 마법사와 구성 마법사를 사용해서 MySQL을 설치 할 수 있다. 이러한 것들
2.3.2 자동 설치기를 사용한 MySQL 설치 은 처음 MySQL을 설치하는 사용자가 손쉽게 설치를 진행할 수 있도록 디자인되어 있다.
MySQL 설치 마법사 및 구성 마법사는 Essentials 및 Complete 설치 패키지에 들어 있다. 이것들은 대부분의 표준 MySQL설치
시 권장되는 것들이다. 싱글 서버 호스트에 MySQL의 다중 인스턴스(instances)를 설치하고자 하는 사용자 및 서버의 설정을 전
체적으로 제어하고자 하는 고급 사용자의 경우는 예외로 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=2&idx=752006-08-03 오후 3:29:26
:::MySQL Korea:::
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=3&idx=762006-08-03 오후 3:29:30
:::MySQL Korea:::
제목검색
2.3.3.1. 설치 마법사 소개
상위메뉴리스트 ◆
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL 설치 마법사는 마이크로 소프트를 위한 최신의 설치기 기법을 사용하는 MySQL서버를 위한 설치기이다. MySQL 설치
2.3.3 MySQL 설치 마법사 사용 하기 마법사는, 구성 마법사와 조합을 이루어서, 사용자가 설치후 즉시 사용을 할 준비가 되어 있는 MySQL 서버를 설치하고 구성을
마이크로소프트 윈도우 설치 엔진은 윈도우 XP 버전의 릴리즈와 함께 개선되었다; 이전 버전의 윈도우를 사용하는 설치기에서
최신 버전의 윈도우 설치기 엔진으로 업그레이드하기 위한 보다 많은 정보는 this Microsoft Knowledge Base article 를 참조하
기 바란다.
부가적으로, 마이크로소프트는 최근에 WiX (Windows Installer XML) 툴킷을 출시하였다. 이것은 마이크로소프트가 최초로 진
행하는 최초의 오픈 소스 프로젝트이다. 이것은 오픈 소스 프로젝트이기 때문에, 그리고 이를 통해서 스크립트를 사용하는 기법
에 보다 유연성을 확보할 수 있기 때문에, 우리는 WiX로 전환을 하고 있다.
MySQL 설치 마법사를 개선하는 것은 여러분과 같은 사용자의 지원과 피드백에 의존한다. 만일 여러분에게는 중요한 기능들 중
일부가 MySQL 설치 마법사에 빠져 있는 것을 발견하면, 또는 버그를 발견할 경우에는, Section 1.8, “오류 또는 문제점 보고 하
기”에서 주어지는 방법을 통해 우리에게 내용을 보내주기 바란다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL 설치 패키지는 http://dev.mysql.com/downloads/에서 다운 로드할 수 있다. 다운 로드하는 패키지가 집(Zip)아카이브
2.3.3.1 설치 마법사 소개
마법사를 사작하는 과정은 여러분이 다운 로드한 설치 패키지의 컨텐츠에 달려 있다. 만일 다운 로드한 것에 setup.exe 파일이
2.3.3.2 MySQL설치 마법사 다운 로드 및 시작 하기
있다면, 이것을 더블 클릭해서 설치를 시작하면 된다. 만일 .msi 파일이 있으면, 이것을 더블 클릭하면 된다.
2.3.3.3 설치 타입 선택 하기
2.3.3.4 커스텀 설치 다이어로그
2.3.3.5 확인(Confirmation) 다이어로그(Dialog)
2.3.3.6 MySQL 설치 마법사에 의한 변경 사항
2.3.3.7 설치 마법사를 사용한 MySQL 업그레이드
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=3&idx=782006-08-03 오후 3:30:07
:::MySQL Korea:::
제목검색
2.3.3.3. 설치 타입 선택 하기
상위메뉴리스트 ◆
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 사용할 수 있는 설치 타입은 세 가지가 있다: Typical, Complete, 및 Custom.
만일Typical 또는Complete 설치 타입을 선택하고 다음 버튼을 누르게 되면, 확인 화면으로 이동이 되고 지금 선택한 것이 확실
한지 다시 한번 확인을 한 후 설치가 진행된다. Custom 타입을 선택하고 다음 버튼을 누르면, 커스텀 설치 다이어로그 화면으로
이동한다. 이 과정은 Section 2.3.3.4, “커스텀 설치 다이어로그”에서 설명한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=3&idx=792006-08-03 오후 3:30:09
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 만약에 MySQL설치 마법사가 설치하는 경로나 특정 요소를 변경하고자 한다면, Custom 설치 타입을 선택한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=3&idx=802006-08-03 오후 3:30:11
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 일단 설치 타입과 설치 요소를 선택적으로 선택을 하고 나면, 확인 다이어로그 창으로 이동을 한다. 여기에서 여러분이 선택한 설
2.3.3.1 설치 마법사 소개
여러분이 구성한 내용에 대해 확인을 마치고 나면, 설치 버튼을 누른다. MySQL을 설치하지 않은 상태에서 설치 마법사를 끝내려
2.3.3.2 MySQL설치 마법사 다운 로드 및 시작 하기
면, 취소(Cancel)버튼을 누르면 된다.
2.3.3.3 설치 타입 선택 하기
2.3.3.4 커스텀 설치 다이어로그
설치가 완료된 후, 여러분은 MySQL웹 사이트에 등록을 할 수 있는 옵션을 볼 수 있다. 여기에 등록을 하면 여러분은 forums.
2.3.3.5 확인(Confirmation) 다이어로그(Dialog)
mysql.com에 있는 MySQL포럼에 등록 되어지며, 아울러 bugs.mysql.com 에 오류 레포트를 보고할 수 있고 또한 우리의 뉴스
2.3.3.6 MySQL 설치 마법사에 의한 변경 사항 레터를 정기적으로 구독할 수 있게 된다. 설치기에서 볼 수 있는 마지막 화면에서 여러분은 설치 정보를 요약해서 볼 수 있으며 구
2.3.3.7 설치 마법사를 사용한 MySQL 업그레이드 성 마법사를 시작할 수 있는 옵션을 볼 수 있는데, 이것을 가지고 여러분은 설정 파일을 생성하고, MySQL서비스를 설치하고, 그
리고 보안 설정을 할 수 있게 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=3&idx=812006-08-03 오후 3:30:14
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 일단 설치 버튼을 누르면, MySQL 설치 마법사는 설치 과정을 시작하고 여러분 시스템을 아래에서 설명하는 것처럼 변경을 하게
2.3.3.1 설치 마법사 소개
등록에 대한 변경 사항
2.3.3.2 MySQL설치 마법사 다운 로드 및 시작 하기
2.3.3.3 설치 타입 선택 하기
MySQL 설치 마법사는 전형적인 설치 상황에서 하나의 윈도우 등록 키를 생성하는데, 이 키는 HKEY_LOCAL_MACHINE
2.3.3.4 커스텀 설치 다이어로그
₩SOFTWARE₩MySQL AB에 존재한다.
2.3.3.5 확인(Confirmation) 다이어로그(Dialog)
2.3.3.6 MySQL 설치 마법사에 의한 변경 사항 MySQL 설치 마법사는 설치되는 서버의 메인 버전 뒤에, 예를 들면 MySQL Server 5.0과 같은, 이름이 붙는 키를 하나 생성한
2.3.3.7 설치 마법사를 사용한 MySQL 업그레이드 다. 이것은 두개의 문자열 값을 갖는데, Location 및 Version이 된다. Location 문자열은 설치 디렉토리에 대한 경로를 갖는다.
디폴트 설치에서는 이것은 C:₩Program Files₩MySQL₩MySQL Server 5.0₩값을 갖는다. Version 문자열은 릴리즈 숫자
를 갖는다. 예를 들면, MySQL Server 5.0.19의 설치에서는, 키는 5.0.19의 값을 갖는다.
이러한 등록 키들은 MySQL서버의 설치 위치를 알려주는 외부 툴을 지원하는데 사용되며, 이것을 사용하면 MySQL서버의 경로
를 찾기 위해 하드디스크를 모두 검색할 필요가 없어지게 된다. 그리고 만약에 여러분이 MySQL 을 noinstall 집(Zip)아카이브
를 사용해서 설치하면, 등록 키는 생성되지 않는다.
시작 메뉴에 대한 변경 사항
MySQL 설치 마법사는 메이저 MySQL버전 다음에 이름을 붙인 공통 MySQL 메뉴 아래에 윈도우 시작 메뉴의 새로운 목록을 생
성한다. 예를 들면, 여러분이 MySQL 5.0을 설치 한다면, MySQL 설치 마법사는 시작 메뉴안에 MySQL 서버 5.0섹션을 만들게
된다.
● MySQL 명령어 라인 클라이언트: 이것은 mysql 명령어 라인에 대한 단축 키(shortcut)이며 root 사용자로서 접속하도
록 구성된다. 여러분이 접속될 때 root 사용자 패스워드를 묻는 프롬프트가 나타난다.
● MySQL 서버 인스턴스 구성 마법사: 이것은 MySQL설정을 위한 단축키이다. 이 키를 사용해서 새롭게 설치된 서버를 설
정할 수 있으며, 또는 존재하는 서버를 재구성할 수 있다.
● MySQL 문서: 이것은 MySQL서버 설치 디렉토리에 로컬로 저장되어 있는 MySQL서버 문서와 연결하는 링크이다. 이
옵션은 MySQL을 Essential 설치 패키지를 사용하는 MySQL 설치의 경우에는 사용할 수 없다.
파일 시스템에 대한 변경 사항
디폴트 MySQL 설치 마법사를 사용하면 MySQL5.0서버는 C:₩Program Files₩MySQL₩MySQL Server 5.0에 설치되고
Program Files 은 어플리케이션이 디폴트로 설치되는 위치이며, MySQL서버의 메이저 버전은 5.0 이 된다. 이곳은 MySQL서버
를 설치하는 권장 위치이며, 이전 버전의 위치인 C:₩mysql에서 변경된 곳이다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL 설치 마법사는 MSI의 업그레이드 기능을 사용해서 서버를 자동으로 업그레이드할 수 있게 한다. 이 기능을 통해 여러분
2.3.3 MySQL 설치 마법사 사용 하기 은 이전에 설치해 놓은 버전을 수동으로 삭제하지 않고 새로운 버전으로 업그레이드 할 수 있게 된다. 설치기는 자동으로 중단
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=3&idx=832006-08-03 오후 3:30:20
:::MySQL Korea:::
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=842006-08-03 오후 3:30:40
:::MySQL Korea:::
제목검색
2.3.4.1. 구성 마법사 소개
상위메뉴리스트 ◆
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL구성 마법사는 윈도우에서 여러분의 서버를 자동으로 구성하는데 도움을 준다. MySQL구성 마법사는 여러분에
2.3.4 구성(Cinfiguration) 마법사 사용 하기 게 여러 가지 질문을 한 후 여러분의 대답을 my.ini 파일을 만들어 내는 템플릿에 적용함으로서 커스템(custom) my.ini
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=852006-08-03 오후 3:30:48
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL 구성 마법사는 전형적으로 MySQL설치 마법사를 종료한 후에 시작할 수 있다. 또한, 여러분은 윈도우 시작 매뉴
2.3.4 구성(Cinfiguration) 마법사 사용 하기 의 MySQL섹션에 있는 MySQL서버 인스턴스 마법사를 클릭해서 구동시킬 수도 있다.
2.3.4.1 구성 마법사 소개
다른 방법으로는, MySQL설치 패키지에서 bin 디렉토리를 찾은 다음 MySQLInstanceConfig.exe 파일을 직접 실행할
2.3.4.2 MySQL 구성 마법사 시작 하기
수도 있다.
2.3.4.3 관리 옵션 선택하기
2.3.4.4 구성 타입 선택 하기
2.3.4.5 서버 타입 다이어로그
2.3.4.6 데이터 베이스 사용량 다이어로그
2.3.4.7 InnoDB 테이블 스페이스 다이어로그
2.3.4.8 동시 접속 다이어로그
2.3.4.9 네트워킹 및 스트릭트(strict) 모드 옵션 다이어로그
2.3.4.10 문자 셋 다이어로그
2.3.4.11 서비스 옵션 다이어로그
2.3.4.12 보안 옵션 다이어로그
2.3.4.13 확인 다이어로그
2.3.4.14 my.ini 파일의 위치
2.3.4.15 my.ini 파일 편집 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=862006-08-03 오후 3:30:51
:::MySQL Korea:::
제목검색
2.3.4.3. 관리 옵션 선택하기
상위메뉴리스트 ◆
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 만약에 MySQL 구성 마법사가 현재 있는 my.ini 를 검색하면, 여러분은 자신의 현재 서버를 재구성하거나, 또는 my.ini
2.3.4 구성(Cinfiguration) 마법사 사용 하기 파일을 제거하고 MySQL서비스를 정지 및 삭제함으로써 서버 인스턴스를 삭제하는 옵션을 갖게 된다.
2.3.4.1 구성 마법사 소개
현재의 서버를 재 구성하기 위해서는, 재 구성 인스턴스(Re-configure Instance)옵션을 선택한 후 다음(Next)버튼을
2.3.4.2 MySQL 구성 마법사 시작 하기
누른다. 현재 있는 my.ini 파일은 mytimestamp.ini.bak로 재 명명되며, timestamp 은 현재 있었던 my.ini 파일이 생성
2.3.4.3 관리 옵션 선택하기
된 날짜와 시간이 된다. 현재의 서버 인스턴스를 제거하기 위해서는, 인스턴스 옵션 제거 버튼을 선택하고 다음 버튼을 누
2.3.4.4 구성 타입 선택 하기
르면 된다.
2.3.4.5 서버 타입 다이어로그
2.3.4.6 데이터 베이스 사용량 다이어로그 인스턴스 제거 옵션을 선택하게 되면, 확인 윈도우로 이동한다. 실행 버튼을 누른다. MySQL 구성 마법사는 MySQL 서
2.3.4.7 InnoDB 테이블 스페이스 다이어로그 비스를 종료하고 이릉 제거한 다음, my.ini 파일을 삭제한다. 서버 설치와 서버의data 폴더는 삭제되지 않는다.
2.3.4.8 동시 접속 다이어로그
2.3.4.9 네트워킹 및 스트릭트(strict) 모드 옵션 다이어로그 재 구성 인스턴스 옵션을 선택하면, 여러분이 구성하고자 원하는 설정 타입을 선택할 수 있는 구성 타입 다이어로그 화면
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=872006-08-03 오후 3:30:55
:::MySQL Korea:::
제목검색
2.3.4.4. 구성 타입 선택 하기
상위메뉴리스트 ◆
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 새로운 MySQL설치를 위해 MySQL구성 마법사를 시작할 때, 또는 기존의 설치에 대해 재구성 인스턴스 옵션을 선택할
2.3.4.1 구성 마법사 소개
사용 가능한 구성 타입은 두 가지가 있다: 상세 구성 및 표준 구성. 표준 구성 옵션은 서버 구성에 대해 많은 선택을 하지
2.3.4.2 MySQL 구성 마법사 시작 하기
않고 빠른 시간에 MySQL을 설치하고자 하는 새로운 사용자를 위한 것이다. 상세 구성 옵션은 서버 구성에 대해 보다 많
2.3.4.3 관리 옵션 선택하기
은 제어를 하고자 하는 고급 사용자를 위한 것이다.
2.3.4.4 구성 타입 선택 하기
2.3.4.5 서버 타입 다이어로그
만약에 여러분이 새롭게 MySQL을 사용하고 단일-사용자 개발 장비에 설치를 하고자 한다면, 표준 구성이 적합할 것이
2.3.4.6 데이터 베이스 사용량 다이어로그 다. 표준 구성 옵션은 MySQL 마법사가 서비스 옵션 및 보안 옵션을 제외한 모든 구성을 자동으로 설정하게끔 한다.
2.3.4.7 InnoDB 테이블 스페이스 다이어로그
2.3.4.8 동시 접속 다이어로그 표준 구성은 현재 MySQL이 설치되어 있는 시스템과는 일치하지 않는 옵션을 설정할 수도 있다. 만약에 이미 존재하는
2.3.4.9 네트워킹 및 스트릭트(strict) 모드 옵션 다이어로그 MySQL설치 시스템에 대해 설치를 다시 하고자 한다면, 상세 구성을 권장한다.
2.3.4.10 문자 셋 다이어로그
표준 구성을 완료하기 위해서는, Section 2.3.4.11, “서비스 옵션 다이어로그”, 및 Section 2.3.4.12, “보안 옵션 다
2.3.4.11 서비스 옵션 다이어로그
이어로그”에서 서비스 옵션과 보안 옵션을 각각 참조하기 바란다.
2.3.4.12 보안 옵션 다이어로그
2.3.4.13 확인 다이어로그
2.3.4.14 my.ini 파일의 위치
2.3.4.15 my.ini 파일 편집 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=882006-08-03 오후 3:30:58
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기 선택할 수 있는 서버 타입은 세 가지가 있다. 여러분이 선택하는 서버 타입은 MySQL구성 마법사가 메모리,
2.3. 윈도우에 MySQL설치 하기 디스크, 및 프로세서 사용량을 구성할 때 영향을 미친다.
2.3.4 구성(Cinfiguration) 마법사 사용 하기
● Developer Machine: 개인적으로만 사용 하고자 하는 전형적인 데스크 탑 웍크스테이션에
2.3.4.1 구성 마법사 소개
MySQL을 설치할 때 이 옵션을 선택한다. 다른 많은 데스크 탑 어플리케이션이 운영된다는 점을
2.3.4.2 MySQL 구성 마법사 시작 하기
가정한다. MySQL서버는 최소 시스템 자원을 사용하도록 구성된다.
2.3.4.3 관리 옵션 선택하기
● Server Machine: MySQL이 FTP, email, 그리고 웹 서버와 같은 다른 서버 어플리케이션과 함께
2.3.4.4 구성 타입 선택 하기
운영되는 서버를 위한 선택 옵션이다. MySQL서버는 적정한 시스템 자원을 사용하도록 구성된다.
2.3.4.5 서버 타입 다이어로그 ● Dedicated MySQL Server Machine: 이 옵션은 서버 장비가 MySQL만 전용으로 실행하는 용도
2.3.4.6 데이터 베이스 사용량 다이어로그 의 옵션이다. 다른 어떠한 어플리케이션도 같이 운영되지 않는다는 가정을 한다. MySQL서버는 모
2.3.4.7 InnoDB 테이블 스페이스 다이어로그 든 가능한 서버 자원을 사용하도록 구성된다.
2.3.4.8 동시 접속 다이어로그
2.3.4.9 네트워킹 및 스트릭트(strict) 모드 옵션 다이어로그
2.3.4.10 문자 셋 다이어로그
2.3.4.11 서비스 옵션 다이어로그
2.3.4.12 보안 옵션 다이어로그
2.3.4.13 확인 다이어로그
2.3.4.14 my.ini 파일의 위치
2.3.4.15 my.ini 파일 편집 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=892006-08-03 오후 3:31:04
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 데이터 베이스 사용량 다이어로그는 MySQL테이블을 생성할 때 사용을 예상할 수 있는 스토리지 엔진을 표시한다. 여러
2.3.4 구성(Cinfiguration) 마법사 사용 하기 분이 선택한 옵션은 InnoDB스토리지 엔진을 사용할 수 있는지 그리고 서버 자원의 몇 퍼센트를 InnoDB에서 사용할 수
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=902006-08-03 오후 3:31:06
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 어떤 사용자는 InnoDB 테이블 스페이스 파일을 MySQL서버 디렉토리가 아닌 다른 곳에 놓고 싶어할 수도 있다. 테이블
2.3.4 구성(Cinfiguration) 마법사 사용 하기 스페이스 파일을 별도의 위치에 놓는 것은, 시스템이 고부하 이거나 또는 고성능 스토리지 장치, 예를 들면 RAID스토리
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=912006-08-03 오후 3:31:11
:::MySQL Korea:::
제목검색
2.3.4.8. 동시 접속 다이어로그
상위메뉴리스트 ◆
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 서버 자원이 고갈되는 상황을 피하기 위해서는, MySQL에 동시에 접속하는 숫자를 제한하는 것이 중요하다. 동시 접속
2.3.4 구성(Cinfiguration) 마법사 사용 하기 다이어로그는 여러분이 서버의 예상 사용량을 선택할 수 있게 하며, 이에 따른 동시 접속의 한계를 설정할 수 있게 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=922006-08-03 오후 3:31:13
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 네트워킹 옵션 다이어로그는 TCP/IP네트워킹을 활성화 또는 비활성화 시킬 수 있으며 MySQL서버에 접속하는데 사용
2.3.4.1 구성 마법사 소개
TCP/IP 네트워킹은 디폴트로 활성화된다. TCP/IP 네트워킹은 비활성화 시키기 위해서는, uncheck the box next to
2.3.4.2 MySQL 구성 마법사 시작 하기
the Enable TCP/IP 네트워킹 옵션 활성화 박스를 해제시키면 된다.
2.3.4.3 관리 옵션 선택하기
2.3.4.4 구성 타입 선택 하기
Port 3306은 디폴트로 사용된다. MySQL을 접속하는데 사용되는 포트를 변경하기 위해서는, 드롭 다운 박스에서 새 포
2.3.4.5 서버 타입 다이어로그
트 번호를 선택하거나 또는 드롭 박스에 직접 새 포트 번호를 입력하면 된다. 여러분이 선택한 포트 번호가 사용 중 이라
2.3.4.6 데이터 베이스 사용량 다이어로그 면, 포트 번호를 확인하라는 프롬프트가 생긴다.
2.3.4.7 InnoDB 테이블 스페이스 다이어로그
2.3.4.8 동시 접속 다이어로그 서버 SQL모드를 스트릭트(strict) 모드로 활성화 또는 비활성 시킨다. 스트릭트(strict) 모드 활성화(디폴트)는 MySQL
2.3.4.9 네트워킹 및 스트릭트(strict) 모드 옵션 다이어로그 을 다른 데이터 베이스 관리 시스템보다 더욱 돋보이게 한다. 만약에 여러분이 어플리케이션을 MySQL의 이전 버전의
2.3.4.10 문자 셋 다이어로그 “이해할 수 있는(forgiving)” 상황에서 구동한다면, 그 어플리케이션을 수정하든지 아니면 스트릭트(strict) 모드를 비
2.3.4.11 서비스 옵션 다이어로그 활성화 시켜라. 스트릭트(strict) 모드에 대한 보다 자세한 정보는, Section 5.2.5, “서버 SQL 모드”를 참조 하기 바
2.3.4.12 보안 옵션 다이어로그 람.
2.3.4.13 확인 다이어로그
2.3.4.14 my.ini 파일의 위치
2.3.4.15 my.ini 파일 편집 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=932006-08-03 오후 3:31:15
:::MySQL Korea:::
제목검색
2.3.4.10. 문자 셋 다이어로그
상위메뉴리스트 ◆
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL서버는 다중 문자 셋을 지원하며 모든 테이블, 컬럼, 및 데이터 베이스에 중복 사용 하지 않는 한 디폴트 문자 셋
2.3.4 구성(Cinfiguration) 마법사 사용 하기 이 적용 되도록 설정하는 것이 가능하다. 문자 셋 다이어로그를 사용해서 MySQL서버의 디폴트 문자 셋을 변경할 수 있
2.3.4.1 구성 마법사 소개 다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=942006-08-03 오후 3:31:17
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 윈도우 NT기반 플랫폼에서, MySQL서버는 윈도우 서비스로서 설치될 수 있다. 이렇게 설치할 경우, MySQL서버는 시스
2.3.4 구성(Cinfiguration) 마법사 사용 하기 템이 시작(startup)되는 동안 자동으로 설치를 시작할 수 있게 되며, 윈도우의 서비스가 실패할 경우에도 자동으로 재 구
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=952006-08-03 오후 3:31:18
:::MySQL Korea:::
제목검색
2.3.4.12. 보안 옵션 다이어로그
상위메뉴리스트 ◆
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL서버에 대해 root 패스워드를 설정할 것을 강력하게 권장하며, 또한 MySQL구성 마법사는 이것을 디폴트로 요구
2.3.4 구성(Cinfiguration) 마법사 사용 하기 한다. 만일 루트 패스워드를 설정하고 싶지 않을 경우에는, 보안 설정 옵션 수정 박스를 해제하면 된다.
2.3.4.1 구성 마법사 소개
루트 패스 워드를 설정하기 위해서는, 새로운 루트 패스 워드 및 확인 박스안에 원하는 패스 워드를 입력하시면 된다. 만
2.3.4.2 MySQL 구성 마법사 시작 하기
일 현재의 서버를 재 구성할 경우에는, 현재의 루트 패스 워드를 패스 워드 입력 박스에 입력하면 된다.
2.3.4.3 관리 옵션 선택하기
2.3.4.4 구성 타입 선택 하기
네트워크를 통해 루트로 로그인 하는 것을 막기 위해서는, 로컬호스트 옵션를 통해서만 루트에 접속하는 박스를 설정하
2.3.4.5 서버 타입 다이어로그
면 된다. 이를 통해 여러분의 루트 계정은 보다 안전을 확보하게 된다.
2.3.4.6 데이터 베이스 사용량 다이어로그
2.3.4.7 InnoDB 테이블 스페이스 다이어로그 익명의 사용자 계정을 생성하기 위해서는, 익명 사용자 계정 옵션 생성 박스를 설정하면 된다. 익명 계정 생성은 서버의
2.3.4.8 동시 접속 다이어로그 보안성을 약화 시키며 로그인 및 승인상의 문제를 일으키게 된다. 이러한 이유로, 이에 대해서는 권장하지 않는다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=962006-08-03 오후 3:31:20
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기 MySQL 구성 마법사의 마지막 다이어로그는 확인 다이어로그이다. 서버 구성을 진행하기 위해서, Execute
2.3. 윈도우에 MySQL설치 하기 버튼을 누른다. 이전의 다이어로그로 복귀하기 위해서는, Back 버튼을 누른다. 서버를 구성하지 않고 구성 마
2.3.4 구성(Cinfiguration) 마법사 사용 하기 법사를 빠져 나오기 위해서는, Cancel 버튼을 누른다.
2.3.4.1 구성 마법사 소개
Execute 버튼을 누르면, MySQL 구성 마법사는 화면에 진행되는 프로세스의 상태를 보여주면서 서버 구성
2.3.4.2 MySQL 구성 마법사 시작 하기
을 진행한다.
2.3.4.3 관리 옵션 선택하기
2.3.4.4 구성 타입 선택 하기 MySQL 구성 마법사는 우선 MySQL AB사의 개발자 및 엔지니어가 제공하는 템플릿을 사용해서 여러분이
2.3.4.5 서버 타입 다이어로그 선택한 구성 파일 옵션을 검사한다. 이 템플릿은 my-template.ini 이며 서버 설치 디렉토리에 위치한다.
2.3.4.6 데이터 베이스 사용량 다이어로그
2.3.4.7 InnoDB 테이블 스페이스 다이어로그 그 다음에, MySQL구성 마법사는 여러분의 옵션을 my.ini 파일에 쓰기 시작한다. my.ini 파일의 최종 위치
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=972006-08-03 오후 3:31:22
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기 MySQL 구성 마법사는 MySQL서버용 설치 디렉토리에 my.ini 을 저장한다. 이것을 가지고 특정 서버 인스
2.3. 윈도우에 MySQL설치 하기 턴스에 관련된 구성 파일을 지원하다.
2.3.4 구성(Cinfiguration) 마법사 사용 하기
MySQL서버가 my.ini 파일이 있는 위치를 정확히 알고 있는지 확인하기 위해서는, 이와 비슷한 인수가 서비
2.3.4.1 구성 마법사 소개
스 설치의 항목으로 MySQL에 전달된다: --defaults-file="C:₩Program Files₩MySQL₩MySQL
2.3.4.2 MySQL 구성 마법사 시작 하기
Server 5.0₩my.ini". 여기에서, C:₩Program Files₩MySQL₩MySQL Server 5.0 은 MySQL서버에 대
2.3.4.3 관리 옵션 선택하기
한 설치 경로로 변경된다.
2.3.4.4 구성 타입 선택 하기
2.3.4.5 서버 타입 다이어로그 --defaults-file 옵션은 MySQL서버가 구동될 때 구성 옵션에 대한 지정된 파일을 읽도록 지시한다.
2.3.4.6 데이터 베이스 사용량 다이어로그
2.3.4.7 InnoDB 테이블 스페이스 다이어로그
2.3.4.8 동시 접속 다이어로그
2.3.4.9 네트워킹 및 스트릭트(strict) 모드 옵션 다이어로그
2.3.4.10 문자 셋 다이어로그
2.3.4.11 서비스 옵션 다이어로그
2.3.4.12 보안 옵션 다이어로그
2.3.4.13 확인 다이어로그
2.3.4.14 my.ini 파일의 위치
2.3.4.15 my.ini 파일 편집 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=982006-08-03 오후 3:31:26
:::MySQL Korea:::
제목검색
2.3.4.15. my.ini 파일 편집 하기
상위메뉴리스트 ◆
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 my.ini 파일을 수정하기 위해서는, 텍스트 편집기를 사용해서 이것을 열고 필요한 변경을 한다. 여러분은 또한 MySQL
2.3.4 구성(Cinfiguration) 마법사 사용 하기 Administrator 유틸리티를 사용해서 서버의 구성을 수정할 수도 있다.
2.3.4.1 구성 마법사 소개
mysql 및 mysqldump 명령어 라인 클라이언트와 같은 MySQL클라이언트 및 유틸리티는 서버 설치 디렉토리에 있는
2.3.4.2 MySQL 구성 마법사 시작 하기
my.ini 파일을 수정할 수 없다. 클라이언트 및 유틸리티를 구성하기 위해서는, C:₩WINDOWS or C:₩WINNT 디렉토
2.3.4.3 관리 옵션 선택하기
리(윈도우 버전에 따라 다를 수 있음)에 새로운 my.ini 파일을 생성한다.
2.3.4.4 구성 타입 선택 하기
2.3.4.5 서버 타입 다이어로그
2.3.4.6 데이터 베이스 사용량 다이어로그
2.3.4.7 InnoDB 테이블 스페이스 다이어로그
2.3.4.8 동시 접속 다이어로그
2.3.4.9 네트워킹 및 스트릭트(strict) 모드 옵션 다이어로그
2.3.4.10 문자 셋 다이어로그
2.3.4.11 서비스 옵션 다이어로그
2.3.4.12 보안 옵션 다이어로그
2.3.4.13 확인 다이어로그
2.3.4.14 my.ini 파일의 위치
2.3.4.15 my.ini 파일 편집 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=4&idx=992006-08-03 오후 3:31:30
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 Noinstall 패키지를 가지고 설치를 하는 사용자는, 이 섹션에서 설명하는 방법을 가지고 수동으로 MySQL을
2.3.5 노인스톨(Noinstall) 집(Zip) 아카이브로 부터 MySQL 설치 하기 설치할 수 있다. 집 아카이브를 가지고 설치하는 과정은 아래와 같다:
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=5&idx=1002006-08-03 오후 3:32:03
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL을 수동으로 설치하기 위해서는, 아래의 순서를 따라 한다:
2.3.6 설치 아카이브 풀기
1. 이전 버전에서 업그레이드를 한다면, 업그레이드를 시작하기 전에 Section 2.3.14, “윈도우에서MySQL 업그레이
드 하기”를 먼저 참조하기 바란다.
2. 윈도우 NT, 2000, XP 또는 윈도우 서버2003과 같은 NT기반 OS를 사용한다면, 관리자 권한이 있는 사용자로 로그
인 하여야 한다.
3. 설치 위치를 선택한다. 전통적으로는, MySQL서버는 C:₩mysql에 설치 된다. MySQL 설치 마법사는 MySQL을 C:
₩Program Files₩MySQL에 설치한다. 만약에 여러분이C:₩mysql에 설치하지 않는다면, 구동 시점 또는 옵션 파일에
서 설치 디렉토리의 경로를 지정해야 한다. Section 2.3.7, “옵션 파일 생성하기”를 참조.
4. Zip 아카이브 툴을 사용해서 원하는 위치에 아카이브를 푼다. 어떤 툴들은 여러분이 선택한 설치 위치 안에 있는 폴
더에 아카이브를 풀기도 한다. 이렇게 풀릴 경우에는, 서브 폴더의 내용물을 여러분이 선택한 설치 위치로 이동시키면 된
다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=3&scate=6&idx=1012006-08-03 오후 3:32:14
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기 여러분이 서버를 구동할 때 스타트업 옵션을 지정하고자 한다면, 명령어 라인에서 옵션들을 나타내거나 또는 옵션 파
2.3. 윈도우에 MySQL설치 하기 일에 표시해 두면 된다. 서버가 실행될 때마다 옵션이 실행되도록 하기 위해서는, MySQL구성을 지정하는 옵션 파일
MySQL서버는 윈도우에서 시작할 때, 두 가지 파일안에 있는 옵션들을 찾는다: 윈도우 디렉토리에 있는 my.ini 파일,
및 C:₩my.cnf 파일. 전형적으로 윈도우 디렉토리는 C:₩WINDOWS 또는 C:₩WINNT와 유사한 이름을 갖고 있다.
여러분은 아래의 명령어를 사용해서 WINDIR 환경 변수로부터 정확한 위치를 알아볼 수 있다:
MySQL은 my.ini 파일에 있는 첫 번째 옵션을 찾는다. 하지만, 혼란을 피하기 위해서는, 여러분은 한가지 파일만 사용
하는 것이 최선이다. 여러분 PC가 C:의 부팅 드라이브가 아닌 부팅 로더를 사용한다면, 여러분이 선택할 옵션은 단지
my.ini 파일을 사용하는 것이다. 어떤 옵션 파일을 선택하든지, 이 파일은 텍스트 파일이어야 한다.
여러분은 또한 MySQL배포판에 포함되어 있는 예제용 옵션 파일을 사용할 수도 있다. Look in your install
directory for files such as my-small.cnf, my-medium.cnf, my-large.cnf, 및 my-huge.cnf와 같은 파일용 설
치 디렉토리를 검토해 보면, 기본 구성 파일용으로 사용할 수 있는 적당한 위치를 찾아서 재명명하거나 복사할 수 있
다.
노트 패드와 같은 어떠한 텍스트 편집기를 사용해서도 옵션 파일을 생성 및 수정할 수 있다. 예를 들면, 만약 MySQL
이 E:₩mysql 에 설치되고데이터 디렉토리가 E:₩mydata₩data에 있다면, 여러분은 basedir 및 datadir 파라미터
[mysqld]
basedir=E:/mysql
datadir=E:/mydata/data
윈도우 경로는 백슬레쉬가 아닌 슬레쉬를 사용해서 옵션 파일에서 지정된다는 점을 유의한다. 백슬레쉬를 사용할 경
우에는, 이것을 두번 반복 사용해야 한다:
[mysqld]
basedir=E:₩₩mysql
datadir=E:₩₩mydata₩₩data
윈도우에서, MySQL 설치기는 데이터 디렉토리를 여러분이 MySQL을 설치하는 디렉토리 아래에 직접 위치 시킨다.
만약에 다른 위치에 데이터 디렉토리를 위치하고자 한다면, 데이터 디렉토리에 있는 모든 내용물을 복사해서 새로운
위치로 옮겨 놓아야 한다. 예를 들면, 만약에 MySQL이 C:₩Program Files₩MySQL₩MySQL Server 5.0에 설치
되었다면, 데이터 디렉토리는 디폴트로 C:₩Program Files₩MySQL₩MySQL Server 5.0₩data에 있게 된다. 만
약에 E:₩mydata 를 대신 데이터 디렉토리로 사용하고자 한다면, 두 가지의 일을 해야 한다:
2. 여러분이 서버를 매번 실행할 때마다 --datadir 옵션을 사용해서 새로운 디렉토리의 위치를 지정한다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 아래의 테이블은 MySQL5.0에서 윈도우가 사용할 수 있는 서버들을 보여준다:
mysqld-nt 네임드 파이프에 대한 지원 기능이 있는 윈도우 NT, 2000, 및 XP를 위한 최적화된 바이너리.
이전의 모든 바이너리는 현재의 인텔 프로세서를 위해 최적화 되어 있으나, 인텔의 i386-class 또는 보다 고성능의 프로세서에서
동작되어야 한다.
모든 윈도우MySQL 5.0 서버는 데이터 베이스 디렉토리의 심볼릭 링크를 지원하고 있다.
MySQL은 모든 윈도우 플랫폼의 TCP/IP를 지원한다. mysqld-nt 및 mysql-max-nt 서버는 윈도우 NT, 2000, XP, 및 2003상
의 네임드 파이프를 지원한다. 하지만, 디폴트는 플랫폼에는 상관 없이 TCP/IP를 사용하는 것이다. (네임드 파이프는 많은 윈도우
구성에서 TCP/IP보다 속도가 느리다.)
● 네임드 파이프는 여러분이 서버를 --enable-named-pipe 옵션과 함께 시작할 때에만 활성화 된다. 어떤 사용자들은 네
임드 파이프를 사용할 때 MySQL서버가 셧 다운되는 경험을 하였기 때문에 이 옵션을 사용하는 것은 신중하게 할 필요가
있다.
● 네임드 파이프 연결은 mysqld-nt 또는 mysqld-max-nt 서버에 의해서만 가능하며, 또한 서버가 네임드 파이프를 지원
하는 윈도우 버전(NT, 2000, XP, 2003)에서 구동될 때에만 사용 가능하다.
● 이러한 서버들은 TCP/IP가 설치된 경우에만 윈도우 98 또는 Me에서 구동 되어 진다.
● 이러한 서버들은 윈도우95에서는 구동되지 않는다.
Note: 이 매뉴얼에 있는 대부분의 예제들은 mysqld 을 서버의 이름으로 사용한다. 만약에 다른 서버를 사용하고자 한다면, 예를 들
면mysqld-nt와 같이, 예제에서 보여 주는 것 같은 명령어에서 적당히 대신할 이름을 사용한다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 이 섹션에서는 MySQL서버를 시작하는 것에 대해 일반적인 내용을 설명하기로 한다. 이후의 섹션에서는 명령어 라인 또는 윈도우
2.3.9 처음으로 서버를 시작 하기 서비스로서 MySQL을 시작하기 위한 방법에 대해 보다 자세한 정보를 보여 주기로 한다.
여기에서는 여러분이 노인스톨 버전을 사용해서 설치할 경우, 또는 GUI툴을 사용하지 않고 수동으로 MySQL을 구성하고 테스트
할 경우를 먼저 다루기로 한다.
이 섹션에 있는 예제들은 MySQL이 C:₩Program Files₩MySQL₩MySQL Server 5.0의 디폴트 위치에 설치되어 있다는 가정
을 한다. 여러분이 MySQL을 다른 곳에 설치 하였다면 예제에서 보여주는 경로 이름을 조정 하기 바란다.
윈도우 NT, 2000, XP, or 2003와 같은 NT기반 OS상에서는, 클라이언트는 두 가지 옵션을 갖는다. 이 OS들은 TCP/IP를 사용
하거나, 또는 서버가 네임드 파이프 연결을 지원할 경우 네임드 파이프를 사용한다. 윈도우 NT 4에서 TCP/IP를 함께 사용하게 한
다면, 여러분은 서비스 팩3(또는 이후 버전)을 설치 하여야 한다.
윈도우 95, 98, 또는Me에서는, MySQL클라이언트는 항상 TCP/IP를 사용해서 서버에 접속한다. (이것은 네트워크상에 있는 모
든 장비가 여러분의 MySQL서버에 접속이 가능하게 한다.) 이러한 이유 때문에, 여러분은 MySQL을 시작하기 전에 여러분 시스템
상에 TCP/IP가 지원되도록 해야 한다. 여러분의 윈도우 CD에서 TCP/IP를 찾을 수 있을 것이다.
테스트는 콘솔 윈도우(또는 “도스 윈도우’)에 있는 명령어 프롬프트로 하는 것이 제일 좋다. 이 방법으로 여러분은 윈도우에 서
버가 상태 메시지를 나타내도록 할 수 있다. 여러분의 구성에 어떤 문제가 있다면, 이 메시지를 통해 여러분은 보다 쉽게 문제를 알
수 있게 되며 문제를 수정할 수 있게 된다.
서버가 시동 절차를 마치게 되면, 여러분은 이것과 비슷한 것을 보게 되는데, 이것들은 서버가 지금 클라이언트와 연결될 준비가 되
어 있음을 나타내는 것이다:
서버는 계속해서 진행되는 진단 결과를 화면에 보여 준다. 여러분은 새로운 윈도우를 열어서 클라이언트 프로그램을 구동시킬 수
있다.
만약에 여러분이 --console 옵션을 생략하면, 서버는 데이터 디렉토리에 에 있는 에러 로그에 진단 결과를 쓰게 된다(C:
₩Program Files₩MySQL₩MySQL Server 5.0₩data, 디폴트의 경우). 에러 로그는 .err 확장자가 있는 파일이다.
Note: MySQL그랜트 테이블에 있는 계정들은 초기에는 패스워드가 없다. 서버를 구동한 후에, 여러분은 이 계정들에 대한 패스워
드를 설정하야 한다. Section 2.9, “설치후 설정 및 테스트”를 참조할 것.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 MySQL서버는 명령어 라인에서 수동으로 시작할 수 있다. 이것은 모든 윈도우 버전에서 가능하다.
NT기반 윈도우가 아닌 경우에는, OS는 백그라운드에서 mysqld 를 고동 시킨다. 즉, 서버가 구동된 후, 여러분은 또 다른 명령어
프롬프트를 보게 된다. 만약에 이러한 방식으로 윈도우 NT, 2000, XP, 또는 2003에서 서버를 시작하면, 서버는 전면
(foreground)에서 실행되고 서버를 종료하지 않으면 어떤 명령어 프롬프트로 나타나지 않는다. 이러한 이유로 인해, 여러분은 서
버가 구동되는 동안 또 다른 윈도우를 열고 여기에서 클라이언트 프로그램을 구동 시켜야 한다.
Note: MySQL root 사용자 계정이 패스워드가 있다면, 여러분은 mysqladmin 을 -p 옵션과 함께 호출하고 프롬프트가 나오면 패
스워드를 입력한다.
이 명령어는 MySQL 관리자 유틸리티인 mysqladmin 를 호출해서 서버에 연결하고 셧 다운을 하게끔 한다. 이 명령은, MySQL그
랜트 테이블에 있는 디폴트 관리자 계정인, MySQL root 사용자로서 실행된다. MySQL그랜트 테이블에 있는 사용자는 전적으로
윈도우에 있는 로그인 사용자와는 독립적으로 운영된다는 것을 알아 두기 바란다.
만약에 mysqld 이 실행되지 않으면, 에러 로그를 분석해서 문제의 원인이 무엇인지를 파악한다. 에러 로그는 C:₩Program Files
₩MySQL₩MySQL Server 5.0₩data 디렉토리에 있다. 이것은 접미어 .err를 갖고 있는 파일이다. 여러분은 또한 서버를
mysqld –console로 시작할 수 있다; 이 경우, 여러분은 문제를 해결하는데 도움이 되는 여러 유용한 정보를 얻을 수 있을 것이
다.
마지막 옵션은 –standalone 및 --debug 옵션을 가지고 mysqld를 실행하는 것이다. 이 경우, mysqld은 mysqld 이 구동되지 않
으면 그 이유를 저장하는 로그 파일 C:₩mysqld.trace 을 작성한다. Section E.1.2, “Trace Files 생성”을 참조 할 것.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 NT 계열(Windows NT, 2000, XP, 2003)의 OS의 경우, MySQL을 실행하는 권장 방법은 MySQL을 윈도우 서비스의 형태로 설
2.3.11 윈도우 서비스의 형태로 MySQL 시작 하기 치하는 것이며, 이렇게 함으로서 윈도우가 시작되고 종료될 때 자동으로 MySQL도 구동되고 종료하게 된다. 서비스의 형태로 설치
된 MySQL서버는 NET명령어를 사용해서 명령어 라인에서 제어할 수 있으며, 또는 그래픽 서비스 유틸리티를 사용할 수도 있다.
서비스 유틸리티(윈도우 서비스 컨트롤 메니저(Service Control Manager) )는 윈도우 제어 판넬에서 찾을 수 있다(윈도우 200,
XP, 및 서버 2003에는 관리자 툴 밑에 있음). 충돌을 피하기 위해, 명령어 라인에서 서버 설치 또는 제거를 실행하는 동안에는 서
비스 유틸리티를 닫아 두기를 권장한다.
윈도우 서비스 형태로 MySQL을 설치하기 전에, 우선 만일 서버가 실행되고 있다면 아래의 명령어로 우선 현재의 서버를 중지 시
켜야 한다:
Note: 만약에 MySQL root 사용자 계정이 패스워드가 있다면, -p옵션을 가지고 mysqladmin 를 호출한 다음 패스워드를 입력하
면 된다.
이 명령어는 MySQL 관리자 유틸리티인 mysqladmin 를 호출해서 서버에 연결하고 셧 다운을 하게끔 한다. 이 명령은, MySQL그
랜트 테이블에 있는 디폴트 관리자 계정인, MySQL root 사용자로서 실행된다. MySQL그랜트 테이블에 있는 사용자는 전적으로
윈도우에 있는 로그인 사용자와는 독립적으로 운영된다는 것을 알아 두기 바란다.
MySQL 프로그램을 보다 쉽게 호출하기 위해서, MySQL bin 디렉토리의 경로 이름을 윈도우 시스템 PATH 환경 변수에 추가할
수 있다:
● 윈도우 데스크 탑에서, 내 컴퓨터 아이콘 위에서 오른쪽 마우스를 클릭한 다음, 속성(Properties)을 선택한다.
● 다음에 시스템 속성에서 고급 탭을 선택한 후, Environment Variables 버튼을 누른다.
● 시스템 변수에서, 경로를 선택한 다음, Edit 버튼을 누른다. 시스템 변수 편집 다이어로그가 나오게 된다.
● 변수 값이 있는 텍스트 끝에 커서를 오게 한다. (End 를 사용해서 커서가 텍스트의 맨 마지막에 가게 하도록 한다.) 그 다
음, MySQL bin 디렉토리의 전체 경로 이름을 입력한다(예를 들면, C:₩Program Files₩MySQL₩MySQL Server 5.0
₩bin). 여기에는 이 필드에 있는 값들과 경로를 구분하는 세미콜론(semicolon)이 있다는 것을 유의한다. 이 다이어로그
를 닫고, 모든 열려 있는 다이어로그 창이 닫힐 때까지 OK 버튼을 누른다. 이제 여러분은 도스 프롬프트에서, 경로를 별도
로 지정하지 않고서도, 시스템에 있는 실행 가능한 모든 MySQL 프로그램을 호출할 수 있게 된다. 여기에는 서버, mysql
클라이언트, 그리고 mysqladmin 및 mysqldump과 같은 모든 MySQL명령어-라인 유틸리티도 포함된다.
여러 개의 MySQL 서버를 동일한 시스템에서 구동하고 있다면, 여러분은 MySQL bin 디렉토리를 윈도우 PATH 에 추가
할 수 없다.
Warning: 시스템 PATH를 수동으로 편집할 때에는 각별한 주의를 해야 한다; 현재의 PATH값 중에 일부분이라도 부주의로 삭제
또는 수정을 할 경우에는 전체 시스템이 오 작동을 하거나 또는 시스템을 사용할 수 없게 될 수도 있다.
● 여러분은 --install 옵션이 붙는 서비스 이름을 지정할 수 있다. 디폴트 서비스 이름은 MySQL이다.
● 서비스 이름이 주어지면, 단일 옵션을 붙일 수 있다. 편의를 위해, 이것은 --defaults-file=file_name 가 되고 서버가 구
동될 때 읽게 되는 옵션에서 옵션 파일의 이름을 지정하게 한다.
● MySQL 5.0.1 버전 까지는, 서비스 이름 다음에 --local-service 옵션을 지정할 수 있다. 이것은 서버가 제한적인 시스
템 권한을 갖고 있는 LocalService 윈도우 계정을 사용해서 구동되도록 한다. 이 계정은 윈도우XP 또는 그 후의 버전에서
만 사용 가능하다. --defaults-file 및 --local-service 는 모두 서비스 이름 다음에 사용되며, 어떤 순서로도 사용 가능
하다.
윈도우 서비스의 형태로 설치되는 MySQL서버의 경우, 다음의 규정이 서버가 사용하는 서비스의 이름 및 옵션 파일을 결정한다:
● 만약 서비스-설치 명령어가 --install 옵션 다음에 어떠한 서비스 이름이나 디폴트 서비스 이름(MySQL)을 지정하지 않
는다면, 서버는 MySQL 서비스 이름과 표준 옵션 파일에 있는 [mysqld] 그룹에서 읽기 옵션을 가져와서 사용하게 된다.
● 만약에 MySQL 대신에 특정 서비스 이름을 --install 과 함께 사용하면, 서버는 지정한 서비스 이름을 사용한다. 서버는
동일한 이름을 갖고 있는 그룹에서 서비스 형태로 옵션을 읽어 오고, 표준 옵션 파일에서 옵션을 읽어온다.
● 만약에 서비스-설치 명령어가 서비스 이름 다음에 --defaults-file 옵션을 지정한다면, 서버는 네임드 파일의
[mysqld] 그룹에서만 옵션을 읽어오고 표준 옵션 파일을 무시한다.
여기에서 보면, 디폴트 서비스 이름(MySQL)이 --install 다음에 나온다. 만약에 아무런 --defaults-file 이 주어지지 않는다
면, 이 명령어는 서버가 표준 옵션 파일에서 [mysqld] 그룹을 읽도록 한다. 하지만, --defaults-file 옵션이 존재하기 때문에, 서
버는 [mysqld] 옵션 그룹과 네임드 파일에서만 옵션을 읽어 온다.
여러분은 또한 MySQL을 구동하기 전에 윈도우 서비스 유틸리티에 시작(Start) 파라미터로 옵션을 지정할 수도 있다.
MySQL서버가 서비스 형태로 설치되면, 윈도우는 윈도우가 시작될 때마다 서비스를 자동으로 실행한다. 이 서비스는 또한 서비스
유틸리티, 또는 NET START MySQL 명령어를 가지고도 실행할 수 있다. NET 명령어는 대소 무자를 구분하지 않는다.
서비스로 구동될 때, mysqld 은 콘솔 윈도우를 접속하지 못하며, 따라서 아무런 메시지도 볼 수 없다. 만약에 mysqld 이 실행되지
않으면, 문제를 분석하기 위해서 에러 로그를 검사하도록 한다. 에러 로그는 MySQL데이터 디렉토리에 있다 (예를 들면, C:
₩Program Files₩MySQL₩MySQL Server 5.0₩data). 이 파일은 .err 접미사를 갖고 있다.
서비스 형태로 MySQL서버가 설치될 때, 그리고 이 서비스가 구동될 때, 윈도우가 셧 다운 되게 되면 자동으로 이 서비스도 종료된
다. 서버는 서비스 유틸리티, NET STOP MySQL 명령어, mysqladmin shutdown 명령어를 사용해서 수동으로도 종료시킬 수 있
다.
여러분은 시스템이 부팅될 때 자동으로 서비스가 실행되는 것을 원하지 않을 경우, 수동 서비스 형태로 서버에 설치할 수 있는 옵션
을 가질 수 있다. 이렇게 하기 위해서는, --install 옵션이 아닌 --install-manual 옵션을 사용한다:
서비스 형태로 설치된 서버를 제거하기 위해서는, 우선 서버가 구동된다면, NET STOP MYSQL를 사용해서 서버를 종료하게 한
다음, --remove 옵션을 사용해서 서버를 삭제 한다:
mysqld 이 서비스 형태로 구동되지 않는다면, 여러분은 명령어 라인에서 이것을 실행 시킬 수 있다. 이 방법에 대해서는,
Section 2.3.10, “윈도우 명령어 라인에서 MySQL 시작 하기”를 참조하기 바람.
만약에 설치하는데 어떤 문제가 있다면, Section 2.3.13, “윈도우에서의 MySQL 설치 문제 해결”를 참조하기 바란다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 여러분은 아래의 명령어 중에 하나를 사용해서 MySQL 서버가 제대로 동작하는지를 검사할 수 있다:
만약에 mysqld가 클라이언트 프로그램에서의 TCP/IP접속이 느리게 나타나면, 아마도 여러분의 DNS에 문제가 있는 것이다. 이
와 같은 경우, mysqld을 --skip-name-resolve 옵션과 함께 구동을 시키고 MySQL 그랜트 테이블의 Host 컬럼에 있는 IP 번
호와 localhost만을 사용하기 바란다.
여러분은 --pipe 또는 --protocol=PIPE 옵션을 지정 하거나 또는 호스트 이름으로 . (period)를 지정 함으로써 MySQL 클라
이언트가 TCP/IP가 아닌 네임드 파이프 접속을 사용하도록 만들 수가 있다. 디폴트 파이프 이름을 사용하고 싶지 않을 경우에는,
--socket 옵션을 사용한다.
여러분이 root 계정에 패스워드를 설정하였거나, 익명 사용자 계정을 삭제하였거나, 또는 새로운 계정을 생성하였다면, MySQL 서
버에 접속을 하기 위해서는 위에 있는 명령어와 함께 -u and -p 옵션을 같이 사용해야 한다. Section 5.8.4, “MySQL 서버에 접
속하기”를 참조할 것.
Mysqlshow에 대한 보다 자세한 정보는, Section 8.13, “mysqlshow — 데이터 베이스, 테이블, 그리고 컬럼 정보를 디스플레이
하기”를 참조할 것.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.3. 윈도우에 MySQL설치 하기 처음으로 MySQL을 설치하고 구동할 때, 여러분은 아마도 여러 가지 에러를 접하게 될 것이다. 이 섹션에서는 이러한 문제를 진단
여러분이 에러를 바로 잡기 위해 사용할 수 있는 첫 자료는 에러 로그이다. MySQL 서버는 에러 로그를 사용해서 서버 구동에 문
제를 일으키는 관련 에러를 기록한다. 에러 로그는 여러분의 my.ini 에서 지정하는 데이터 디렉토리 안에 있다. 디폴트 디렉토리의
위치는 C:₩Program Files₩MySQL₩MySQL Server 5.0₩data이다. Section 5.12.1, “에러 로그”를 참조할 것.
가능한 에러에 관련된 또 다른 정보는 MySQL서비스 시작될 때 콘솔에서 보여지는 메시지이다. MySQL서버를 서비스의 형태로
시작하는 것과 관련된 에러 메시지를 보기 위해서는 mysqld 을 서비스의 형태로 설치한 후 NET START mysql 명령어를 사용한
다. Section 2.3.11, “윈도우 서비스 형태로 MySQL설치하기”를 참조할 것.
● 만약에 MySQL서버가 mysql 권한 데이터 베이스 또는 다른 크리티컬한 파일을 찾지 못한다면, 아래의 에러 메시지가 나타
난다:
• Fatal error: Can't open privilege tables: Table 'mysql.host' doesn't exist
이러한 메시지는 MySQL의 기본 또는 데이터 디렉토리가 디폴트 디렉토리가 아닌 곳에 설치 되었을 경우에 종종 발생한
다 (C:₩Program Files₩MySQL₩MySQL Server 5.0 및 C:₩Program Files₩MySQL₩MySQL Server 5.0
₩data, 각각 해당).
이러한 경우는 MySQL이 새로운 위치에 업그레이드 또는 설치는 되지만, 구성 파일이 새로운 위치를 반영하지 않을 경우
에 발생할 수도 있다. 또한, 구형 구성 파일과 새로운 구성 파일이 서로 충돌을 일으킬 경우에도 발생한다. MySQL을 업그
레이들 할 때에는 반드시 구형 구성 파일을 삭제하거나 다른 이름으로 저장을 해 두어야 한다는 점을 유의한다.
만약에 MySQL을 C:₩Program Files₩MySQL₩MySQL Server 5.0가 아닌 다른 곳에 설치를 했다면, 여러분은
MySQL이 구성(my.ini)파일을 통해 이 위치를 인지하게끔 해야 한다. my.ini 파일은 여러분의 윈도우 디렉토리에 두어
야 하는데, 일반적으로는C:₩WINDOWS 또는 C:₩WINNT가 된다. 명령어 플롬프트에서 아래의 명령어를 입력해서
WINDIR 환경 변수의 값으로부터 정확한 위치를 알아낼 수 있다:
노트 패드와 같은 텍스트 편집기를 가지로 옵션 파일을 작성 및 수정할 수 있을 것이다. 예를 들면, MySQL이 E:₩mysql
에 설치되었고 데이터 디렉토리가 D:₩MySQLdata라면, 여러분은 옵션 파일을 생성하고 [mysqld] 섹션이 basedir 과
datadir 파라미터의 값을 지정하도록 설정할 수 있다:
[mysqld]
basedir=E:/mysql
datadir=D:/MySQLdata
윈도우 파라미터는 옵션 파일에서 백슬레쉬가 아닌 슬레쉬를 사용해서 경로를 지정한다는 점을 유의하자. 백슬레쉬를 사
용하고자 하면, 두번 연속 사용한다:
[mysqld]
datadir=D:₩₩MySQLdata
MySQL구성 파일에 있는 datadir 의 값을 변경하고자 한다면, 여러분은 반드시 서버를 재 구동하기 전에 기존의 데이터
디렉토리에 있는 모든 내용물을 옮겨 놓아야 한다. Section 2.3.7, “옵션 파일 생성 하기”를 참조할 것.
이것은 구성 마법사가 서비스 설치를 시도하고 동일한 이름을 가진 기존의 서비스를 찾을 경우에 발생한다.
이 문제를 해결하는 한 가지 방법은 구성 마법사를 사용할 때 서비스 이름을 mysql이 아닌 다른 이름을 사용하는 것이다.
이것은 새로운 서비스가 정확히 설치 되도록 하게 해 주지만, 대신에 이전의 서비스를 남기게 된다. 비록 이렇게 하는 것
이 시스템에는 무해할 지라도, 더 이상 사용하지 않는 이전의 서비스는 삭제하는 것이 더욱 바람직하다.
구형 mysql 서비스를 영원히 삭제하기 위해서는, 명령어 라인에서 관리자 권한이 있는 사용자로서 아래의 명령어를 실행
한다:
만약에 여러분이 사용하는 윈도우 버전에서 sc를 사용할 수 없다면, delsrv 유틸리티를 http://www.microsoft.com/
windows2000/techinfo/reskit/tools/existing/delsrv-o.asp 에서 다운 로드 받고 delsrv mysql 신텍스를 사용한다.
제목검색
2. MySQL 설치 및 업그레이드 하기 이 섹션에서는 여러분이 윈도우에서 MySQL을 업그레이드 할 때 진행해야 하는 과정들을 설명한다.
2.3. 윈도우에 MySQL설치 하기
2.3.14 윈도우에서 MySQL 업그레이드 하기 1. Section 2.10, “MySQL 업그레이드 하기”를 참고 한다.
2. 업그레이드를 수행하기 전에는 항상 현재의 MySQL을 백업 한다. Section 5.10.1, “데이터 베이스 백업하기”를
참조.
3. http://dev.mysql.com/downloads/에서 최신의 MySQL 윈도우용 배포판을 다운 로드한다.
4. 업그레이드를 하기 전에는 반드시 서버를 종료한다. 만약에 서버가 서비스 형태로 설치되어 있다면, 아래의 명령어
를 사용해서 서비스를 멈추게 한다:
Note: 만약에 MySQL의 root 사용자 계정이 패스워드가 있다면, mysqladmin을 -p 옵션과 함께 구동시켜서 패스
워드를 입력한다.
6. 4.1.5. 이전 버전에서 5.0으로 업그레이드를 할 때, 또는 Zip 아카이브에서 설치한 MySQL 버전을 MySQL 설치 마
법사로 설치하는 버전으로 업그레이드를 할 경우에는, 여러분은 반드시 수동으로 이전의 설치 버전과 서비스를 제거해야
한다.
MySQL 서비스를 제거하기 위해서는, 아래의 명령어를 사용한다:
만약에 현재의 서비스를 제거하지 않으면, MySQL 설치 마법사는 새로운 MySQL 서비스를제대로 설치하지 못할 수도 있
다.
7. 여러분이 설치 마법사를 사용한다면, Section 2.3.3, “MySQL 설치 마법사 사용하기”에 설명되어 있는 마법사를
사용한다.
8. Zip 아카이브에서 MySQL을 설치한다면, 아카이브를 추출한다. 여러분은 현재 설치되어 있는 위치에 덮어 쓰기를
할 수도 있고(일반적으로는 C:₩mysql), 또는 다른 디렉토리에 설치할 수도 있다(예를 들면, C:₩mysql4). 현재 위치에
덮어 쓰기를 하길 권장한다.
9. MySQL 서버가 윈도우 서비스 형태로 동작되었고 이 과정 초기에 서비스를 삭제했다면, 서비스를 재 설치한다.
(Section 2.3.11, “윈도우 서비스 형태로 MySQL 시작하기”를 참조.)
10. 서버를 재 구동한다. 예를 들면, MySQL 서버가 윈도우 서비스 형태로 구동한다면 NET START MySQL를 사용하
고, 그렇지 않은 경우에는, mysqld을 직접 호출한다.
11. 에러가 발생하면, Section 2.3.13, “윈도우에서 MySQL 설치 문제 해결”을 참조할 것.
제목검색
2. MySQL 설치 및 업그레이드 하기 윈도우용 MySQL은 매우 안정하다는 것이 검증되어 있다. MySQl의 윈도우 버전은 이에 대응하는 유닉스 버전과 동일한 기능을
2.3. 윈도우에 MySQL설치 하기 갖고 있지만, 아래의 내용은 예외이다:
Windows 95는 가가 쓰레드를 생성하는 데 있어서 메인 메모리의 200바이트 정도를 소모(leak)한다. MySQL에서 각각
의 연결은 새로운 쓰레드를 생성하고, 따라서 서버가 많은 수의 연결을 처리하는 경우에는 윈도우 95에서는 오랜 시간 동
안 mysqld 을 구동할 수 없게 된다! 새로운 윈도우 버전은 이러한 버그를 수정하였다.
● 제한된 포트 수
윈도우는 클라이언트를 위해 약 4,000개의 포트를 사용할 수 있으며, 또한 한 포트에서 연결이 종료된 후에는, 그 포트를
다시 사용할 수 있을 때까지는 2에서 4분 정도가 걸리게 된다. 이 같은 경우에, 클라이언트가 서버와 매우 빈번하게 연결
및 해제를 하게 되면, 종료된 포트를 다시 사용하기 전에 모든 포트가 사용될 가능성이 생기게 된다. 만일 이러한 일이 발
생하면, MySQL 서버는 구동을 되더라도 무응답 상태가 되게 된다. 플랫폼에 있는 다른 어플리케이션도 포트를 사용하기
때문에, 이와 같은 경우 MySQL이 사용할 수 있는 포트는 매우 적은 수가 된다는 점을 알아두기 바란다.
http://support.microsoft.com/default.aspx?scid=kb;en-us;196271를 참조하여 이 문제에 관련된 보다 많은 정보
를 얻기 바란다.
● 동시 읽기
MySQL은 INSERT 와 SELECT를 섞어 사용하기 위해서 pread() 및 pwrite() 시스템 호출을 사용한다. 현재의 버전까
지는, 우리는 mutexes를사용해서 pread() 과 pwrite()를 모방(emulate)하고 있다. 우리는 향후에 가상의 인터페이스
를 가지고 파일 레벨 인터페이스를 대신하고자 하고 있으며, 이렇게 되면 우리는 윈도우 NT, 2000, 및 XP에서 보다 빠른
속도로 readfile()/writefile()를 실행할 수 있을 것이다. 현재까지는 MySQL5.0이 사용할 수 있는 오픈 파일의 숫자를
2,048개로 제한 하는데, 이것은 유닉스에서와 같이 많은 수의 쓰레드를 윈도우 NT, 2000, XP, 및 2003에서는 구동할
수 없음을 의미한다.
MySQL은 각각의 연결에서 블록킹 읽기를 사용한다. 네임드 파이프 연결이 활성화 될 경우에 다음의 동작이 실행된다:
● ALTER TABLE
여러분이 ALTER TABLE 명령문을 실행 시키는 동안, 테이블은 다른 쓰레드에의해 잠기게(locked) 된다. 윈도우에서는
필연적으로 이러한 일이 발생하고, 여러분은 다른 쓰레드가 사용중에 있는 파일을 삭제할 수 없게 된다. 향후에, 이 문제
를 해결하도록 할 것이다.
● DROP TABLE
MERGE 테이블이 사용하는 테이블상에서 DROP TABLE작업은 MERGE 핸들러가 MySQL의 최상위 계층으로부터 테이
블 매핑을 숨기기 때문에 윈도우에서는 작동되지 않는다. 윈도우는 열려 있는 파일을 드롭핑하는 것을 수용하지 않기 때문
에, 여러분은 우선 모든 MERGE 테이블을 꺼내거나 또는 테이블을 드롭하기 전에 MERGE 테이블을 드롭해야만 한다.
● DROP DATABASE
윈도우 95에서는, 테스크 관리자 또는 셧 다운 유틸리티를 가지고 강제로 MySQL을 종료할 수 없다. mysqladmin
shutdown를 사용해야만 한다.
● Case-insensitive names
윈도우에서는 파일 이름은 대소 문자를 구분하지 않으며, 따라서 윈도우상의 MySQL데이터 베이스 및 테이블 역시 대소
문자를 구분하지 않는다. 단, 데이터 베이스와 테이블 이름은 명령문에서 지정하는 대소 문자와는 똑 같이 사용해야 한다.
Section 9.2.2, “Identifier Case Sensitivity”를 참조할 것.
윈도우에서는 경로 이름을 ‘₩’ 문자로 구분하는데, MySQL에서는 이 문자를 종료 문자로도 사용한다. 만약에 여러분
이 LOAD DATA INFILE 또는SELECT ... INTO OUTFILE를 사용한다면, ‘/’ 문자를 가진 파일 이름을 사용하기
바란다:
파이프는 윈도우 명령어 라인에서 정확히(reliably) 동작하지 않는다. 만약에 파이프가 문자 ^Z / CHAR(24)를 포함하고
있다면, 윈도우는 이것이 파일의 끝이고 프로그램을 종료하라는 의미로 받아 들인다.
이것은 주로 여러분이 아래와 같이 바이너리를 적용하고자 할 때 문제를 일으킨다:
만약에 로그를 적용하는데 문제가 있고 이 문제가 ^Z / CHAR(24) 문자때문이라고 의심이 되면, 아래와 같이 다른 방법
을 사용하기 바란다:
만약에 MySQL이 여러분의 호스트 이름을 정확하게 풀지 못하면, 여러분이 MySQL클라이언트 프로그램을 구동시켜서
동일 머신의 서버에 연결하고자 할 때 아래와 같은 에러를 보게 된다:
to database 'mysql'
127.0.0.1 localhost
다음에는 윈도우에서 MySQl을 개선하는데 있어서 여러분들이 도움이 필요한 문제를 열거하겠다:
시키기 위한 매크로.
제목검색
1. MySQL 한글 매뉴얼에 대하여.. 본 매뉴얼은 오픈 소스 데이터 베이스의 대명사인 MySQL 데이터 베이스에 대한 사용 설명서로서, MySQL AB가 발행한
1 MySQL 한글 매뉴얼에 대하여.. “MySQL 5.0 Reference Manual”을 한국어로 번역한 것입니다.
MySQL DB는 속도, 안정성, 대중성에 있어서 이미 확고한 자리를 잡은 데이터 베이스 시스템입니다. MySQL AB의 한국내 공식
골드 파트너사인 ㈜아이티 브릿지는 한국내 MySQL DB 사용자께서 MySQL DB가 가지고 있는 특징과 장단점을 보다 효과적으
로 파악할 수 있도록 본 한글 매뉴얼을 만들었으며, 따라서 현업에 MySQL을 적용하시고자 하시는 분에게 좋은 참고가 되길 바랍
니다.
본 매뉴얼은 “MySQL 5.0 Reference Manual”의 내용을 1:1로 번역을 한 것이며, 따라서 모든 목차는 원본과 일치합니다. 영
문 원본을 참조하시고자 하는 분들을 위해서, 본 사이트에서는 영문 원본 매뉴얼도 함께 제공을 하고 있습니다.
(참고하시는 중에 잘못된 부분을 발견하실 경우에는, 우리 회사에 연락을 주시기 바랍니다.)
- 저작권 공지-
본 한글 매뉴얼의 소유권은 ㈜아이티 브릿지에 있으며, 우리 회사의 사전 허가 없이 무단 복제를 하거나, 다른 웹사이트에 게재하는 것을 금지하오
니 많은 협조를 부탁 드립니다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=1&mcate=0&scate=0&idx=15072006-08-03 오후 3:36:36
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기 리눅스에 MySQL을 설치하는데 있어서 권장할 수 있는 방법은 RPM패키지를 사용하는 것이다. MySQL RPM들은 현재 수세 리눅
2.4. 리눅스에 MySQL 설치 하기 스7.3 시스템에서 구축되어 있느나, rpm 과 glibc 의 사용을 지원하는 대부분의 리눅스에서도 동작할 수 있다. RPM 패키지는
2.4 리눅스에 MySQL 설치 하기 Section 2.1.3, “MySQL 다운 로드 하기”에서 참조하기 바란다.
MySQL AB사는 특정 플랫폼 관련 RPM들을 제공한다; 플랫폼 관련 RPM과 일반 RPM의 차이는, 플랫폼 관련 RPM은 특정 플랫
폼에 구축이 되고 동적으로 해당 플랫폼에 연결되도록 의도된 것인 반면에 일반 RPM은 리눅스쓰레드(LinusThread)를 갖고 정적
(statically)으로 연결되는 것이다.
Note: MySQL의 RPM 배포판은 종종 다른 벤더에서도 제공하고 있다. 이러한 것들은 MySQL AB사가 제공하는 것들과 기능 및
내용물에서 다소 차이가 있을 수 있으며, 이 설명서에서 제공하는 방법으로 설치할 수 없을 수도 있다는 점을 알기 바란다. 대신에
제품을 제공하는 벤더의 설명서를 따르기 바란다.
RPM파일에 문제가 있다면(예를 들면, Sorry, the host 'xxxx' could not be looked up과 같은 에러가 있다면),
Section 2.12.1.2, “리눅스 바이너리 배포판 노트”를 참조하기 바란다.
대부분의 경우, MySQL의 표준 기능 설치는 MySQL-server 및 MySQL-client만 설치하면 된다. 다른 패키지들은 표준 설치에
서는 필요 없는 것들이다. MySQL의 다른 부가적인 기능을 갖고 있는MySQL-Max 서버를 설치하기 위해서는, MySQL-Max
RPM을 설치해야 한다. 하지만, 이것들은 반드시 MySQL-server RPM 을 설치한 다음에 진행해야 한다. Section 5.3,
“MySQL 서버의 mysqld-max 확장 버전”를 참조할 것.
MySQL패키지를 설치하고자 할 때 의존적 실패(dependency failure)가 발생하면(예를 들어, error: removing these packages
would break dependencies: libmysqlclient.so.10 is needed by ...), 여러분은 MySQL-shared-compat 패키지도 설치해야
하는데, 여기에는 이전 버전과(backward)의 호화성을 위한 공유 라이브러가 들어 있다(MysQL4.0을 위한 libmysqlclient.so.12
및 3.23을 위한 libmysqlclient.so.10).
몇몇 리눅스 배포판들은 아직까지도 MySQL 3.23과 함께 제공되며 이것들은 일반적으로 디스크 공간을 절약하기 위해 어플리케
이션들과 동적으로 연결되어 있다. 별도의 패키지에 이러한 공유 라이브러리들이 있는 경우에는 (예를 들면, MySQL-shared), 설
치된 패키지는 그대로 놓아 두고 MySQL서버와 클라이언트 패키지를 업그레이드 하는 것으로도 충분하다(이것들은 정적으로 링
크가 되어 있으며 공유 라이브러리들에는 의존하지 않는다). MySQL서버(예를 들면, 레드헷 리눅스)와 같이 동일한 패키지에 공
유 라이브러리들을 갖고 있는 배포판의 경우, 여러분은 우리가 제공하는 3.23 MySQL-shared RPM을 사용하거나, 또는
● MySQL-server-VERSION.i386.rpm
MySQL 서버. 여러분은 다른 머신에서 동작하는 MySQL서버에만 연결되길 원하지 않는다면 이것이 필요하게 된다. 노
트: 서버 RPM 파일은 4.0.10 버전 이전에는 MySQL-VERSION.i386.rpm 이라고 불리었다. 즉, 여기에는 –server를
붙이지 않았다.
● MySQL-Max-VERSION.i386.rpm
MySQL-Max 서버. 이 서버는 MySQL-server RPM에서는 제공하지 않는 부가적인 기능들이 포함되어 있다. 우선
MySQL-server RPM 를 먼저 설치해야 하는데, MySQL-Max RPM 이 이것에 의존하기 때문이다.
● MySQL-client-VERSION.i386.rpm
● MySQL-bench-VERSION.i386.rpm
● MySQL-devel-VERSION.i386.rpm
● MySQL-shared-VERSION.i386.rpm
● MySQL-shared-compat-VERSION.i386.rpm
이 패키지는 MySQL 3.23 및 MySQL 4.0에 모두 필요한 공유 라이브러리들을 갖고 있다. 만약에 여러분이 MySQL3.23
에 대비해서 동적으로 링크되어 있는 어플리케이션을 갖고 있지만, 라이브러리의 의존성의 해치지 않는 상태에서 4.0버전
으로 업그레이드를 하고자 할 경우에 MySQL-shared 대신에 이 패키지를 설치 한다. 이 패키지는 MySQL4.0.13이후 버
전에서 사용 가능하다.
● MySQL-embedded-VERSION.i386.rpm
● MySQL-VERSION.src.rpm
여기에는 이전의 모든 패키지에 대한 소스 코드가 포함되어 있다. 다른 구조(예를 들면, Alpha 또는 SPARC)상에서 RPM
을 재 구성할 수 있게 한다.
RPM 패키지(예를 들면, MySQL-server RPM)에 들어 있는 모든 파일을 보기 위해서는, 아래와 같은 명령어를 구동시킨다:
shell> rpm -qpl MySQL-server-VERSION.i386.rpm
표준 최소 설치를 실행하기 위해서는, 서버와 클라이언트의 RPM을 설치한다:
shell> rpm -i MySQL-server-VERSION.i386.rpm
shell> rpm -i MySQL-client-VERSION.i386.rpm
클라이언트 프로그램만 설치할 경우에는, 단지 클라이언트 RPM만 설치한다:
shell> rpm -i MySQL-client-VERSION.i386.rpm
RPM은 이것을 설치하기 전에 패키지의 신뢰도와 집적도를 검증할 수 있는 기능을 제공한다. 이러한 기능에 대해 보다 자세히 알아
보고자 한다면, Section 2.1.4, “MD5 체크 썸(Checksums) 또는 GnuPG를 사용해서 패키지 집적도를 검사하기”를 참조할 것
서버 RPM은 데이터를 /var/lib/mysql 밑에 놓는다. RPM는 또한 mysql 이름의 사용자가 MySQL서버를 구동시키기 위해 사용할
수 있는 로그인 계정을 생성하며(존재하지 않는다면), 부팅시 자동으로 서버를 구동시키기 위해 /etc/init.d/ 안에 적당한 엔트리들
을 생성한다.(이것은 만약에 여러분이 이전에 설치를 했고 시작 스크립트를 변경시켰다면, 여러분은 스크립트를 복사해 두어서 새
로운 RPM을 설치할 때 잃어 버리는 것을 대비할 수 있다는 것을 의미한다.) MySQL이 시스템 구동시 자동으로 구동되게 하는 방
법에 대해 보다 많은 정보를 원한다면 Section 2.9.2.2, “Starting and Stopping MySQL Automatically”를 참조하기 바란다.
만약에 /etc/init.d (직접적으로 또는 심링크(symlink)를 통해)에 있는 초기화 스크립트를 지원하지 않는 구형 리눅스 배포판에
MySQL RPM을 설치하고자 한다면, 여러분의 초기화 스크립트가 실제로 설치되어 있는 장소를 가리키는 심볼릭 링크를 생성해야
한다. 예를 들면, 만약에 그 위치가 /etc/rc.d/init.d라면, RPM을 설치하기 전에 그 위치를 가리키는 심볼릭 링크로서 /etc/init.d 를
제목검색
2. MySQL 설치 및 업그레이드 하기 여러분은 Mac OS X 10.2.x (“Jaguar”) 또는 이후 버전에 바이너리 타볼(tarball)배포판 대신에 PKG버전에 있는 Mac OS X바
2.5. Mac OS X에 MySQL 설치 하기 이너리 패키지를 사용해서 MySQL을 설치할 수 있다. 이 패키지는 Mac OS X (for example, 10.1.x) 보다 구형 버전은 지원하지
2.5 Mac OS X에 MySQL 설치 하기 않음을 알아 두기 바란다.
이 패키지는 파인더에서 여러분이 맨 처음 더블 클릭해서 마운트해야 하는 아이콘인 디스크 이미지(.dmg) 파일 안에 들어 있다.
그 다음에는 이미지를 마운트해서 내용물을 화면에 보이게 한다.
MySQL 다운 로드 하기 위해서는, Section 2.1.3, “MySQL 다운 로드 하기”를 참조할 것.
Note: 설치 작업을 진행하기 전에, 반드시 모든 MySQL서버 인스턴스를 MySQL관리자 어플리케이션(Mac OS X 서버에서) 또는
명령어 라인에서 mysqladmin shutdown를 실행시켜서 셧다운 시켜야 한다.
MySQL PKG 파일을 실제로 설치 하기 위해서는, 패키지 아이콘을 더블 클릭한다. 이것은 Mac OS X 패키지 설치기를 구동시키
게 되며, MySQ이 설치되는 동안 여러분을 도와줄 것이다.
Mac OS X 패키지 설치기에 있는 버그 때문에, 여러분은 목적(destination )디스크 선택 다이어로그에서 아래와 같은 에러 메시지
를 볼 수도 있을 것이다:
You cannot install this software on this disk. (null)
에러가 발생하게 되면, Go Back 버튼을 눌러서 이전 페이지로 복귀한다. 그 다음에 Continue 버튼을 다시 한번 눌러서 목적 디스
크 선택을 다시 한번 하게 되면 목적 디스크를 올바르게 선택할 수 있게 될 것이다. 우리는 이 버그를 애플사에 통보를 하였으며 지
금 이 문제를 애플사가 검토하고 있는 상황이다.
MySQL의 Mac OS X PKG 는 패키지 자체를 /usr/local/mysql-VERSION 에 설치하고 심볼릭 링크를 설치하는데, /usr/local/
mysql, 이것은 새로운 위치를 가리키게 된다. 만약에 /usr/local/mysql 라는 디렉토리가 존재한다면, 이것은 /usr/local/mysql.
bak 라는 이름으로 우선 변경된다. 또한, 설치기는 mysql_install_db 를 실행시켜서 mysql 데이터 베이스내에 그랜트 테이블을 생
성한다.
설치 레이 아웃은 tar 파일 배포판의 레이 아웃과 비슷한 형태가 된다; 모든 MySQL 바이너리들은 /usr/local/mysql/bin 디렉토리
에 위치하게 된다. MySQL 소켓 파일은 디폴트로 /tmp/mysql.sock의 형태로 만들어 진다. Section 2.1.5, “설치 레이 아웃”을
참조할 것.
MySQL 설치는 mysql 이라는 Mac OS X 사용자 계정을 요구한다. 이 이름을 갖는 사용자 계정은 Mac OS X 10.2이후 버전에서
10.2-10.2.2 3.23.51
10.2.3-10.2.6 3.23.53
10.3 4.0.14
10.3.2 4.0.16
10.4.0 4.1.10a
이 매뉴얼 섹션은 공식적인 MySQL Mac OS X PKG의 설치만을 다루고 있다. MySQL설치에 관련된 애플사의 도움말을 읽기 바
란다: “Help View”어플리케이션을 구동 시킨후, “Mac OS X Server”도움말을 선택, “MySQL,”관련 부분을 찾은 다음에
“Installing MySQL.”이라는 항목을 읽기 바란다.
Mac OS X서버에 사전 설치(pre-installed)된 MySQL버전에 대해서는, 특히 MySQL의 버전이 4.0보다 이전 버전이라면,
mysqld_safe 을 구동하는 대신에 safe_mysqld 를 사용해서 mysqld 을 동작시켜야 한다는 점을 알기 바란다.
만약에 여러분이 예전에 http://www.entropy.ch 에서 얻은 Mac OS X를 위한 Marc Liyanage's MySQL 패키지를 사용하였다
면, 거기에서 설명하는 바이너리 설치 레이아웃을 사용해서 패키지를 업데이트 시킬 수 있을 것이다.
만약에 Marc's 3.23.xx 버전 또는 MySQL의 Mac OS X 서버 버전으로부터 공식 MySQL PKG로 업그레이드를 하고자 한다면,
여러분은 존재하는 MySQL권한 테이블을 현재의 포멧으로 변환할 필요가 있는데, 그 이유는 몇가지 새로운 보안 권한이 추가 되었
기 때문이다. Section 5.6, “mysql_fix_privilege_tables — MySQL 시스템 테이블 업그레이드”를 참조할 것.
시스템 시작 시점에 MySQL을 자동으로 구동시키고자 한다면, 여러분은 MySQL스타트업 항목(Startup item)도 함께 설치를 해
야 한다. 이것은 별개의 패키지 형태로 Mac OS X설치 디스크 이미지에 있다. 간단히 MySQLStartupItem.pkg 아이콘을 더블 클
릭한 후에 설치 가이드를 따라서 설치를 진행하면 된다.
스타트업 아이템은 오직 한번만 설치하면 된다는 점을 알아두자! 나중에 MySQL패키지를 업그레이드할 때마다 계속 설치할 필요
가 없다.
MySQL스타트업 아이템은 /Library/StartupItems/MySQLCOM안에 설치된다.( MySQL 4.1.2 이전 버전에서는, /Library/
StartupItems/MySQL에 설치 되었으나Mac OS X가 설치하는 MySQL스타트업 아이템과 서로 충돌을 일으켰다.) 스타트업 아이
템 설치는 변수 MYSQLCOM=-YES- 를 시스템 구성 파일인 /etc/hostconfig에 추가 한다. MySQL스타트업의 자동 실행을 비
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=6&scate=0&idx=1292006-08-03 오후 3:40:45
:::MySQL Korea:::
제목검색
유사한
다른 시 ● 배포판의 압축을 풀기 위한 GNU gunzip.
스템에 ● 제대로 동작하는tar. GNU tar 이 많이 알려져 있음. 어떤 OS에는 문제점을 갖고 있다고 알려져 있는 tar가 포함되어 있기도 하다. 예를 들면, Mac OS X tar 및 Sun tar는긴 파일 이름
MySQL 의 처리에 문제를 갖고 있다고 알려져 있다. Mac OS X의 경우, OS안에 있는 gnutar 프로그램을 사용할 수 있을 것이다. 기능이 떨어지는tar를 갖고 있는 다른 OS의 경우, 우선 GNU
설치 하
tar를 설치하기 바란다.
기
2.7 유닉스 만약에 어떠한 문제가 있다고 생각으로 하고 버그 레포트를 제출하고자 한다면, Section 1.8, “버그 또는 문제점 레포트 하기”의 지침을 따라 하시기 바란다.
와 유사
MySQL바이너리 배포판을 설치하고 사용하기 위해 가장 먼저 실행해야 할 명령어들은 아래와 같다:
한 다른
shell> groupadd mysql
시스템
에 shell> useradd -g mysql mysql
처음의 명령어는 파일의 소유 속성을 root 사용자로 변경시킨다. 두번째 명령어는 데이터 디렉토리의 소유 속성를 mysql 사용자로 변경 시킨다. 세번째 명령어는 그룹의 속성을
mysql 그룹으로 변경시킨다.
18. 여러분이 시스템을 부팅할 때 자동으로 MySQL을 시작하고자 한다면, support-files/mysql.server 를 여러분의 시스템 스타트업 파일이 있는 디렉토리고 복사하면 된다. 보다
자세한 정보는 support-files/mysql.server 스크립트 자체에서 찾을 수 있으며 또한 Section 2.9.2.2, “자동으로 MySQL시작 및 종료하기”에서도 찾을 수 있다.
19. DBI 및 DBD::mysql 펄(Perl) 모듈을 설치하였다면, 여러분은 bin/mysql_setpermission 스크립트를 사용해서 새로운 계정을 설정할 수 있게 된다. 보다 자세한 정보는
Section 2.13, “Perl 설치 노트”를 참조하기 바란다.
20. 만약에 mysqlaccess 를 사용하길 원하고 MySQL배포판을 표준 위치가 아닌 곳에 설치하고자 한다면, mysqlaccess 이 mysql 클라이언트를 찾는 위치를 변경해야 한다. bin/
mysqlaccess
제목검색
는 버그가 있다. 여러분이gcc 2.7.x만 갖고 있다면, gcc를 업그레이드하여 MySQL을 컴파일 할 수 있도록 해주어
야 한다. gcc 2.8.1도 역시 특정 플랫폼에서 문제가 있는 것으로 알려져 있는데, 플랫폼에 새로운 컴파일러가 있다
면 이것을 사용하는 것을 피해야 한다.
● 잘 만들어진 make 프로그램. GNU make 는 항상 권장할 만한 것이며 때에 따라서는 필수적으로 필요한 프로그램
이다. 만약에 문제가 있다면, GNU make 3.75 또는 이후 버전을 권장한다.
-fno-exceptions 옵션을 구동시킬 수 있는 최신의 gcc 버전 컴파일러를 사용하고 있다면, 이 옵션을 사용하는 것이 매우
중요하다. 그렇지 않으면, 바이너리를 컴파일하면서 랜덤하게 크래쉬가 발생할 수도 있다. 우리는 또한 -felide-
constructors 과 -fno-rtti 를 -fno-exceptions와 함께 사용하기를 권장한다. 의심스러울 경우에는, 아래의 것을 실행
해 본다:
CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors ₩
-fno-exceptions -fno-rtti" ./configure ₩
--prefix=/usr/local/mysql --enable-assembler ₩
--with-mysqld-ldflags=-all-static
대부분의 시스템에서, 이것은 여러분에게 빠르고 안정적인 바이너리를 제공해 준다.
만일에 문제가 있거나 버그에 대해 레포트를 하고자 하는 경우에는, in Section 1.8, “버그 및 문제점 레포트 하기”의 지
침을 따라서 해주길 바란다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.8. 소스 배포판을 사용해서 MySQL 설치하 소스 배포판을 설치하기 위해 기본적으로 실행한 명령어는 다음과 같다:
기
shell> cd mysql-VERSION
shell> make
shell> cd /usr/local/mysql
이것은 여러분이 설치할 수 있는 바이너리 RPM을 만들어 준다. 구형 RPM 버전의 경우, rpmbuild 를 rpm 대신에 사용할 수 있을
것이다.
Note: 이 과정에서는 MySQL 계정을 위한 패스워드 설정을 하지 않는다. 이 과정을 마친 후에, Section 2.9, “설치후 설정 및 테
스트”의 설명을 참고하여 MySQL설치후의 설정 및 테스트 과정을 진행한다.
이 명령어들은 mysql 그룹과 mysql 사용자를 추가하게 한다. useradd 및 groupadd 에 대한 신택스는 유닉스 버전에 따
라 약간의 차이가 있을 수 있거나, 또는 adduser 및 addgroup 처럼 사용하는 이름이 차이가 있을 수 있다.
여러분은 mysql 대신에 다른 이름으로 사용자와 그룹을 부르고 싶을 수도 있을 것이다. 만약 그렇게 하고자 한다면, 아래
의 단계에서 적당한 다른 이름을 선택하면 된다.
4. 배포판을 풀어 넣고 싶은 디렉토리를 선택한 다음 그곳으로 이동한다.
5. Section 2.1.3, “MySQL 다운 로드하기”의 지침대로 MySQL배포판을 다운 로드한다.
6. 현재의 디렉토리에 배포판을 풀어 놓는다:
9. shell> cd mysql-VERSION
여러분은 현재 여기 최상위 디렉토리에서 MySQL을 설치하고 구성해야 한다는 것을 명심하기 바란다. 다른 디렉토리에서
는 MySQL을 설치할 수 없다.
10. 릴리즈를 구성하고 모든 것을 컴파일 한다:
configure를 구동시킬 때, 여러분은 다른 옵션을 지정할 수도 있다. 사용 가능한 옵션 리스트는 ./configure --help 를
통해 볼 수 있다. Section 2.8.2, “전형적인 configure 옵션들”을 참조하면 보다 유용한 옵션들을 알 수 있게 된다.
configure 실행이 실패하고 MySQL메일링 리스트를 통해 도움을 받고자 할 경우에는, config.log 에서 여러분이 문제가
있다고 생각하는 라인을 복사해서 같이 보내주기 바란다. 또한, 이때 configure의 결과중에 맨 마지막에 있는 라인들도 함
께 보내주기 바란다. 버그 레포트를 보내기 위해서는, Section 1.8, “버그 또는 문제점 레포트 하기”에서 설명하는 방법
을 따르기 바란다.
컴파일에 실패할 경우, Section 2.8.4, “MySQL 컴파일 문제 다루기”에서 도움을 얻기 바란다.
13. 배포판 설치:
면:
루트 권한으로 명령어를 실행한다면, 위에서 본 것처럼 --user 옵션을 사용해야 한다. 옵션의 값은 여러분이 서버를 구동
시키기 위해 처음 단계에서 생성했던 로그인 계정 이름이 되어야 한다. 그 계정을 사용해서 로그인한 상태라면, --user
옵션을 생략해도 된다.
MySQL그랜트 테이블 생성을 위해 mysql_install_db 를 사용한 후에는, 수동으로 서버를 재 구동시킨다. 이것을 실행하
기 위한 mysqld_safe 명령어는 나중에 설명하기로 한다.
19. 프로그램 바이너리의 소유권(ownership)을 root 로 변경하고 데이터 디렉토리의 소유권을 mysqld 을 구동시키고
있는 사용자로 변경한다. 여러분이 설치 디렉토리(/usr/local/mysql)에 있다면, 명령어는 다음과 같을 것이다:
처음의 명령어는 파일의 소유 속성을 root 사용자로 변경시킨다. 두번째 명령어는 데이터 디렉토리의 소유 속성를
mysql 사용자로 변경 시킨다. 세번째 명령어는 그룹의 속성을 mysql 그룹으로 변경시킨다.
23. 여러분이 시스템을 부팅할 때 자동으로 MySQL을 시작하고자 한다면, support-files/mysql.server 를 여러분의 시
스템 스타트업 파일이 있는 디렉토리고 복사하면 된다. 보다 자세한 정보는 support-files/mysql.server 스크립트 자체
에서 찾을 수 있으며 또한 Section 2.9.2.2, “자동으로 MySQL시작 및 종료하기”에서도 찾을 수 있다.
24. DBI 및 DBD::mysql 펄(Perl) 모듈을 설치하였다면, 여러분은 bin/mysql_setpermission 스크립트를 사용해서 새
로운 계정을 설정할 수 있게 된다. 보다 자세한 정보는 Section 2.13, “Perl 설치 노트”를 참조하기 바란다.
모든 것을 풀어놓고 설치를 한후에는, 설치한 배포판을 시험해 보아야 한다. MySQL서버를 시작하기 위해, 아래의 명령어를 사용
한다:
만약에 명령어가 곧장 실패를 하고 mysqld ended가 화면에 나오게 되면, 여러분은 데이터 디렉토리에 있는 host_name.err 파일
에서 문제에 대한 정보를 얻을 수 있을 것이다.
mysqld_safe 에 대한 보다 자세한 정보는 Section 5.4.1, “mysqld_safe — MySQL 서버 스타트업 스크립트”에 있다.
Note: MySQL그랜트 테이프블에 있는 계정들은 초기에는 패스워드를 갖고 있지 않다. 서버를 구동시킨 후에는, Section 2.9,
“MySQL 설치후 설정 및 테스트”에서 설명하는 방식으로 각 계정에 대한 패스워드를 설정해야 한다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.8. 소스 배포판을 사용해서 MySQL 설치하 configure 스크립트는 여러분이 MySQL소스 배포판을 구성하는데 있어서 매우 효과적으로 제어할 수 있는 방법들을 제공해 준
기 다. 전형적으로는, 여러분은 configure 명령어 라인에서 옵션들을 사용해서 이러한 일을 수행할 수 있게 된다. 또한 특정 환경 변수
2.8.2 전형적인 configure 옵션들 를 사용해서 configure 에 영향을 줄 수도 있다. Appendix F, Environment Variables를 참조할 것. configure 가 지원하는 옵션
리스트는, 이 명령어를 돌려서 얻을 수 있다:
C++ 컴파일러가 없다면, mysql 은 컴파일 되지 않는다(C++을 필요로 하는 프로그램이 하나 있다). 이와 같은 경우에
는, C++컴파일러를 테스트 하는 configure 안에 있는 코드를 삭제하고 그 다음에 --without-server 를 가지고 ./
configure 를 구동시킨다. 컴파일 단계는 여전히 mysql을 구축하고자 시도할 것이지만, mysql.cc에 대한 에러는 무시할
수 있게 된다(make 가 멈춰지면, make -k 을 시도해서 에러가 발생하더라도 나머지 구축을 진행하도록 명령할 수 있
다.)
• --localstatedir=/usr/local/mysql/data
● 여러분이 유닉스를 사용하고 MySQL의 소켓 파일의 위치를 디폴트 위치(일반적으로는 /tmp 또는 /var/run 디렉토리에 있
음)가 아닌 다른 위치로 지정하고자 한다면, configure 명령어를 다음과 같이 사용한다:
• shell> ./configure ₩
• --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
소켓 파일 이름은 완벽한 경로 이름 이어야 한다. 여러분은 또한 MySQL 옵션 파일을 사용해서 서버 구동시에도 mysql.
sock의 위치를 지정할 수 있다. Section A.4.5, “How to Protect or Change the MySQL Unix Socket File”를 참조
할 것.
● 정적으로 링크된 프로그램(예를 들면, 바이너리 배포판을 만들기 위해, 보다 나은 성능을 위해, 또는 레드햇 리눅스 배포판
에 있는 몇몇 문제점들을 피하기 위해)들을 컴파일 하고자 한다면, configure 을 다음과 같이 실행한다:
• --with-mysqld-ldflags=-all-static
● gcc 를 사용하고 libg++ 또는 libstdc++ 가 설치되어 있지 않다면, configure 가 gcc 를 마치 C++ 컴파일러처럼 구동하
도록 할 수 있다:
gcc 를 C++ 컴파일러로 사용할 때, 이것은 libg++ 또는 libstdc++에 링크를 시도하지 않게 된다. 비록 여러분이 이러
한 라이브러리들을 갖고 있다고 하더라도 이렇게 동작하는 것은 매우 좋은 일이다. 이러한 라이브러리들 의 버전중에 어
떤 것들은 과거에 MySQL사용자에게 이상한 문제를 야기하곤 했었다.
아래의 리스트들은 각각 일상적으로 사용되는 컴파일러들과 환경 변수들의조합을 나타낸다.
❍ gcc 2.7.2:
❍ egcs 1.0.3a:
o -fno-exceptions -fno-rtti"
❍ gcc 2.95.2:
대부분의 경우, 여러분은 위에서 언급한 리스트의 옵션들을 사용하고 아래의 옵션들을 configure 라인에 추가함으로써 보
--prefix=/usr/local/mysql --enable-assembler ₩
--with-mysqld-ldflags=-all-static
--prefix=/usr/local/mysql --enable-assembler ₩
--with-mysqld-ldflags=-all-static
● 디폴트로는, MySQL은 latin1 (cp1252 West European) 문자 셋을 사용한다. 디폴트 셋을 변경하고자 하면, --with-
charset 옵션을 사용한다:
CHARSET 는 big5, cp1251, cp1257, czech, danish, dec8, dos, euc_kr, gb2312, gbk, german1, hebrew, hp8,
hungarian, koi8_ru, koi8_ukr, latin1, latin2, sjis, swe7, tis620, ujis, usa7, 또는 win1251ukr들 중의 하나가 될 것이
다. Section 5.11.1, “The Character Set Used for Data and Sorting”를 참조할 것.
디폴트 콜레션(collation)도 역시 지정할 수 있다. MySQL은 latin1_swedish_ci 을 디폴트로 사용하고 있다. 이것을 변경
하기 위해서는, --with-collation 옵션을 사용한다:
다.
이 옵션은 테이블의 줄을 세는데 사용하는 변수가 unsigned long을 사용하지 않고 unsigned long long 을 사용해서 저장
될 수 있도록 한다. 이렇게 함으로써 테이블이 232 (~4.295E+09)의 줄이 아닌 대략 1.844E+19 ((232)2) 정도의 줄을
가질 수 있는 것이 가능하게 된다. 이전에는, 이러한 기능을 할 수 있도록 하기 위해서는 -DBIG_TABLES를 수동으로 컴
파일러에 패스시켜야 했었다.
● 특정 OS에 속한 옵션들은 이 매뉴얼의 시스템-관련 섹션에서 찾을 수 있을 것이다. Section 2.12, “OS-관련 노트”를
참조할 것.
제목검색
2. MySQL 설치 및 업그레이드 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=8&scate=3&idx=1342006-08-03 오후 3:41:06
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기 우리의 경우, 솔라리스 또는 gcc 를 사용한 리눅스에서는 아무런 문제없이 모든 MySQL 프로그램을 컴파일 할 수 있었다. 다른 시
2.8. 소스 배포판을 사용해서 MySQL 설치하 스템의 경우, 시스템에 포함된 파일에 따라 서로 다른 경고 메시지를 접할 수도 있을 것이다. Section 2.8.5, “MIT-pthreads 노
기 트”를 참조하면, MIT-pthreads를 사용할 때 발생될 수 있는 경고에 대해 정보를 얻을 수 있을 것이다. 다른 문제에 대해서는, 아
2.8.4 MySQL 컴파일 문제 다루기 래의 리스트를 먼저 살펴 본다.
대부분의 문제에 대해서는 시스템을 재 구성함으로써 해결할 수 있다. 시스템을 재 구성할 필요가 있다면, 아래의 내용을 숙지하기
바란다:
● 만약에 configure이 한번 구동된 후에 다시 구동 한다면, 이전에 구동되었을 때 수집한 정보들을 사용할 것이다. 이 정보들
은 config.cache안에 저장되어 있다. configure 이 실행될 때, configure는 이 파일을 찾게 되고 존재한다면 여기에 포함
된 내용을 읽으며, 이 정보가 여전히 정확하다는 가정을 하게 된다. 이러한 가정은 여러분이 시스템을 재 구성할 경우에는
틀린 정보가 되는 것이다.
● Configure를 구동할 때마다, 여러분은 반드시 make 를 재 구동시켜서 다시 컴파일을 하도록 해야 한다. 하지만, 이전에 구
축한 파일에서 구형 오브젝트 파일들을 삭제하고 싶을 수도 있는데, 왜냐하면 이런 파일들이 다른 구성 옵션을 가지고 컴파
일 되었기 때문이다.
shell> rm config.cache
문제는 gcc가 인라인(inline)함수들과 함께 sql_yacc.cc를 컴파일 할 때 대용량 메모리를 요구한다는 것이다. configure
를 --with-low-memory 옵션과 함께 사용해서 실행시켜본다:
이 옵션은 여러분이 gcc를 사용할 경우에, -fno-inline를 컴파일 라인에 추가되도록 하며, 다른 것을 사용할 경우에는 -
O0 가 추가되도록 만든다. 만약에 시스템을 구동시키기에 충분한 메모리와 스왑 공간이 없다고 판단 되어 지더라도 --
with-low-memory 을 사용해 보도록 한다. 이 문제는 일반적인 하드웨어 구성의 시스템에서도 발생되는 것으로 알려져
있고, --with-low-memory옵션을 사용해서 수정할 수 있다.
● 디폴트로는, configure는 c++을 컴파일러 이름처럼 인식하며 GNU c++ 은 -lg++과 함께 링크를 한다. 여러분이 gcc
를 사용한다면, 시스템 구성시 아래와 같은 문제가 생기는 원인이 된다:
또한, 컴파일을 실행하는 동안에 g++, libg++, libstdc++등과 연관된 문제를 만날 수도 있다.
이러한 문제의 원인 중에 하나는 여러분이 g++을 갖고 있지 않거나 또는 g++은 있지만 libg++ 또는 libstdc++이 없
기 때문이다. config.log 파일을 검사해 보기 바란다. 이 파일에는 C++컴파일러가 동작되지 않는 정확한 이유가 있다.
이 문제를 해결하는 방법은, gcc를 C++컴파일러로 사용하는 것이다. 환경 변수 CXX를 "gcc -O3"로 설정해 보도록 하
자. 예를 들면:
이렇게 하면 gcc가 g++ 뿐만 아니라 C++소스 파일도 컴파일을 하지만 libg++ 또는 libstdc++에 링크는 되지 않기 때
문에 제대로 동작을 하게 된다.
이 문제를 해결하는 또 다른 방법은 g++, libg++, 및 libstdc++를 설치하는 것이다. 하지만, 여러분이 MySQL과 함께
libg++ 또는 libstdc++를 사용하는 것을 권장 하지는 않는데, 그 이유는 어떠한 성능의 효과도 주지 않으면서 mysqld의
바이너리 사이즈만 증가시키기 때문이다.
● 아래와 같은 에러 때문에 컴파일에 실패할 경우, 여러분은 make 버전을GNU make로 업그레이드 해야 한다:
또는:
또는:
● 만약에 플래그(flags)를 C 또는 C++ 컴파일러가 사용하도록 정의를 하고자 한다면, 플래그를 CFLAGS 및 CXXFLAGS
환경 변수에 추가하면 된다. 여러분은 또한 CC 와 CXX 를 사용해서 컴파일러의 이름을 이런 방식으로 지정할 수 있다. 예
를 들면:
• shell> CC=gcc
• shell> CFLAGS=-O3
• shell> CXX=gcc
• shell> CXXFLAGS=-O3
다양한 시스템에서 유용하게 사용 되어지는 플래그 정의 리스트에 대해 보다 많은 정보를 원한다면, Section 2.1.2.5,
“MySQL AB사가 컴파일한 바이너리들”을 참조하기 바란다.
● Mysqld을 컴파일 할 때 여기에 있는 것과 비슷한 에러들이 발생한다면, configure 마지막 인수 타입이 정확하게 accept
(), getsockname(), 또는 getpeername()를 찾지 못한 것이다:
이 에러를 해결 하기 위해서는, config.h 파일을 편집해야 한다(configure가 만든 파일). 아래의 사항을 살펴 본다:
이것은 여러분이 사용하는 yacc버전이 완벽한 버전이 아니라는 것을 의미한다. 여러분은 아마도 bison (yacc의 GNU버
전)을 설치해야 하고 이것을 대신에 사용해야 할 것이다.
● 데비안 리눅스(Debian Linux) 3.0에서, MySQL이 버클리DB를 지원하도록 컴파일하고자 할 경우에는, 디폴트 mawk를
사용하는 대신에 gawk를 설치해야 할 것이다.
● mysqld 또는 MySQL 클라이언트를 디버깅하고자 한다면, configure를 --with-debug 옵션과 함께 구동시키고, 그리고
재 컴파일 한 다음 클라이언트를 새로운 클라이언트 라이브러리와 링크 시킨다. Section E.2, “MySQL 클라이언트 디버
깅”을 참조할 것.
● 리눅스(예를 들면, 수세 리눅스 8.1 또는 레드헷 리눅스 7.3)에서 컴파일 하는 도중에 아래의 것 중에 하나와 비슷한 에러
가 발생한다면:
• without a cast
디폴트로는, configure 스크립트는 GNU C++컴파일러인 g++를 사용해서 인수의 정확한 숫자를 계산하게 된다. 이 테
스트는 g++이 설치되어 있지 않으면 잘못된 결과를 만들게 된다. 이 문제를 해결하는 두 가지 방법이 있다:
❍ GNU C++컴파일러인 g++를 정확히 설치 한다. 어떤 리눅스 버전에서는, gpp라는 이름으로 불리고 있다;다른 버
전의 경우는, gcc-c++.
❍ CXX 환경 변수를 gcc로 설정 함으로서 gcc를 C++ 컴파일러로 사용하도록 한다.
o export CXX="gcc"
제목검색
2. MySQL 설치 및 업그레이드 하기
2.8. 소스 배포판을 사용해서 MySQL 설치하 이 섹션에서는 MIT-pthreads를 사용하는데 있어서의 몇 가지 항목에 대해 설명을 하기로 한다.
기
2.8.5 MIT-pthreads 노트 리눅스에서는, 여러분은 MIT-pthreads를 사용하지 못한다. 대신에 리눅스쓰레드(LinuxThreads)를 구현해서 사용한다.
Section 2.12.1, “리눅스 노트”를 참조할 것.
만약에 여러분의 시스템이 네이티브(native) 쓰레드를 지원하지 않는다면, MIT-pthreads 패키지를 사용해서 MySQL을 설치해
야 한다. 여기에는 구형 FreeBSD 시스템들, SunOS 4.x, Solaris 2.4 및 이전 버전, 그리고 다른 것들이 포함되어 있다.
Section 2.1.1, “MySQL이 지원하는 OS”를 참조할 것.
MIT-pthreads는 MySQL 5.0 소스 배포판에 포함되어 있지 않다. 이 패키지가 필요할 경우에는, 이것만 별도로http://www.
mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.tar.gz에서 다운 로드 받으면 된다.
다운 로드를 받은 후에, 이 소스 아카이브를 MySQL 소스 디렉토리의 최상위 레벨에 풀어 놓는다. 이렇게 하면 새로운 이름의 서
브 디렉토리인 mit-pthreads가 생성된다.
● 대부분의 시스템의 경우, 여러분은 --with-mit-threads 옵션을 configure 과 함께 사용해서 MIT-pthreads를 사용할
수 있도록 할 수 있다:
비-소스(non-source)디렉토리 구축은 이것을 사용할 때 지원되지 않는데, 왜냐하면 우리는 이 코드를 최소한도로 수정
하기를 원하기 때문이다.
● MIT-pthreads를 사용할지 아닐지를 결정하는 것은 서버 코드를 가지고 시스템 구성을 하는 과정에서만 일어난다. 여러분
이 --without-server 옵션을 사용해서 배포판을 클라이언트 코드로만 구축한다고 한다면, 클라이언트는 MIT-
pthreads 사용되고 있는지 아닌지에 대해 알지 못하게 되며 디폴트로 유닉스 소켓 파일 커넥션만을 사용하게 된다. 어떤
시스템에서는 유닉스 소켓 파일이 MIT-pthreads의 상황 아래에서 동작을 하지 않기 때문에, 이것은 여러분이 클라이언
트 프로그램을 구동시킬 때 localhost 의 값을 사용하는 것이 아니라 -h 또는 –host의 값을 필요로 한다는 것을 의미하게
된다.
● MySQL을 MIT-pthreads를 사용해서 컴파일 할 때, 시스템 잠금은 성능의 이유로 인해 디폴트로 비활성화 된다. 여러분
은 서버가 --external-locking 옵션을 가지고 시스템 잠금을 사용할 수 있도록 할 수 있다. 이것은 하나의 동일한 데이
터 파일에 대해 두 대의 MySQL서버를 구동시키고자 할 경우에만 필요하지만, 어쨌든, 우리로서는 권장할 사항은 아니다.
● 때때로 pthread bind() 명령어는 소켓을 어떠한 에러 메시지 없이 묶는데 실패한다 (적어도 솔라이스 상에서는). 모든 커
넥션을 서버에 연결하는 데 실패하는 결과가 생긴다. 예를 들면:
● MIT-pthreads를 가지고서는, sleep() 시스템 호출은 SIGINT (break)에 인터럽트를 할 수가 없다. 이것은 여러분이
mysqladmin –sleep를 구동할 경우에는 중요한 사항이다. 여러분은 인터럽트가 발생하고 프로세스가 종료하기 전에
sleep()이 종료되기 기다려야만 한다.
● 링크가 되었을 경우, 여러분은 아래와 같은 경고 메시지를 접하게 될수도 있다(적어도 솔라리스에서는); 이런 메시지들은
무시할 수 있다:
제목검색
상위메뉴리스트 ◆
2.8.6. 소스 배포판을 사용해서 윈도우에 MySQL 설치하기
2. MySQL 설치 및 업그레이드 하기
2.8. 소스 배포판을 사용해서 MySQL 설치하기 2.8.6.1. VC++를 사용해서 MySQL구축하기 - SKIP
2.8.6 소스 배포판을 사용해서 윈도우에 MySQL 설치하기 2.8.6.2. 최신 개발 단계 소스를 가지고 윈도우 소스 패키지 만들기 - SKIP
이 설명서는 윈도우에 MSQL 5.0 소스를 가지고 바이너리를 구축하는 방법 대해 설명하고 있다. 이 설명서는 표준 배포판
또는 BitKeeper트리에서 최신 개발 소스를 사용해서 바이너리를 구축하는 방법에 대해 설명하고 있다.
Note: 여기에서 설명하는 방법은 가장 최신의 소스 배포판 또는 비트키퍼 트리에서 MySQL 소스를 다운 로드해서 윈도우
에서 테스트를 하고자 하는 사용자들만을 위한 것이다. 따라서, MySQL AB사는 여러분 스스로가 MySQL을 혼자 설치하
는 것을 권장하지 않는다. 일반적으로는, MySQL AB사가 미리 컴파일하고 윈도우에 최적화를 시켜 놓은 바이너리 배포판
을 사용하는 것이 최선의 방법이다. 바이너리 배포판 설치에 관한 내용은 Section 2.3, “윈도우에 MySQL 설치하기”에
서 찾아볼 수 있다
윈도우에 MySQL을 소스를 사용해서 설치하기 위해서는, 아래의 컴파일러와 사용 가능한 시스템 자원이 필요하게 된다:
2. 여러분 스스로 최신의 비트키퍼 개발자 트리에서 패키지를 다운로드할 수 있다. 이 방법을 사용할 경우에는,
유닉스상에서 패키지를 생성해야 하며 그 다음에 이것을 윈도우로 전송해야 한다.( 몇가지 구성 및 구축 단계에서
는 유닉스에서만 동작하는 툴을 요구하게 된다.) 따라서, 비트키퍼는 다음을 요구하게 된다:
• 유닉스 또는 리눅스와 같은 유사 유닉스가 구동되는 시스템.
• 이 시스템 설치된 비트키퍼 3.0. Section 2.8.3, “개발 단계 소스 트리로부터 설치”에서 비트키퍼
다운 로드 및 설치 방법을 참조하기 바란다.
여러분이 윈도우 소스 배포판을 사용한다면, Section 2.8.6.1, “VC++을 사용해서 MySQL 구축하기” 섹션으로 직접 이
동하기 바란다. 비트키퍼 트리에서 구축으로 하기 위해서는, Section 2.8.6.2, “최신의 개발 단계 소스에서 윈도우 소스 패
키지 생성하기”로 가기 바란다.
제목검색
상위메뉴리스트 ◆
2.8.7. 윈도우에서 MySQL 클라이언트 컴파일 하기
2. MySQL 설치 및 업그레이드 하기
2.8.7 윈도우에서 MySQL 클라이언트 컴파일 하기 여러분의 소스 파일에서는, 반드시my_global.h를 mysql.h 전에 포함(include)시켜야 한다:
#include <my_global.h>
#include <mysql.h>
my_global.h는 여러분이 윈도우에서 프로그램을 컴파일할 때 윈도위와 호환성을 유지하기 위한 여러가지의 파일들(windows.h
와 같은 파일)이 포함되어 있다.
여러분은 또한 소스 코드를 동적으로 libmysql.lib 라이브러리와 연결할 수 있는데, 이것은 필요에 따라 libmysql.dll 에 집어 넣
을 수 있거나, 또는 정적(static) mysqlclient.lib 라이브러리와 연결 시킬 수 있는 단순한 래퍼(wrapper)이다.
MySQL 클라이언트 라이브러리들은 쓰레드된(threaded) 라이브러리처럼 컴파일 되며, 따라서 여러분의 코드도 역시 멀티 쓰레
드(multi-threaded)가 되도록 컴파일해야 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=8&scate=7&idx=1382006-08-03 오후 3:41:17
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
2.9. MySQL설치 후 설정 및 테스트
2. MySQL 설치 및 업그레이드 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=9&scate=0&idx=1392006-08-03 오후 3:41:22
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.9. MySQL설치 후 설정 및 테스트 윈도우에서는, 데이터 디렉토리와 그랜트 테이블은 생성 되어도 상관이 없다. MySQL 윈도우 배포판에는 데이터 디렉토리 아래에
2.9.1 윈도우에서 MySQL설치후 해야 할 과정 있는 mysql 데이터 베이스에는 초기화되어 있는(preinitialized) 계정 셋이 그랜트 테이블과 함께 제공된다. 유닉스에서 사용하는
mysql_install_db 스크립트를 구동시킬 필요가 없다. 패스워드에 관련해서는, 만약에 MySQL을 윈도우 설치 마법사를 사용해서
설치한다면, 여러분은 아마도 이미 각 계정에 패스워드를 할당하였을 것이다. (Section 2.3.3, “MySQL 설치 마법사 사용하
기”를 참조할 것.) 그렇지 않다면, Section 2.9.3, “초기 MySQL계정에 대한 보안 작업”에서 제공하고 있는 패스워드-할당 과
정을 사용하기 바란다.
패스워드를 설정하기 전에, 여러분이 서버에 제대로 연결되고 있고 서버가 올바르게 동작하고 있는지 확인하기 위해 클라이언트 프
로그램을 그동시켜 보고 싶을 것이다. 서버가 제대로 구동되는지 확인을 한 다음에 ( Section 2.3.9, “서버를 처음으로 구동 시키
기”를 참조), 아래의 명령어를 입력하여 여러분이 서버에서 정보를 제대로 불러올 수 있는지 확인한다. 그 결과값은 아래에 있는
것과 비슷할 것이다:
C:₩> C:₩mysql₩bin₩mysqlshow
+-----------+
| Databases |
+-----------+
| mysql |
| test |
+-----------+
Database: mysql
+---------------------------+
| Tables |
+---------------------------+
| columns_priv |
| db |
| func |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| proc |
| procs_priv |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
+------+-------+------+
| host | db | user |
+------+-------+------+
|% | test% | |
+------+-------+------+
서비스가 지원되는 윈도우 버전을 구동시키고 있고 윈도우가 시작될 때 자동으로 MySQL서버가 구동되도록 만들고 싶다면,
제목검색
2.9.2.3 MySQL 서버 시작하기와 문제점 해결 하 을 하고 싶을 수도 있을 것이다. 여러분은 또한 그랜트 테이블에 패스워드를 활당해 주어야 한다.
기
유닉스에서는, 그랜트 테이블은 mysql_install_db 프로그램에 의해 설정 된다. 어떤 설치 방식에서는, 이 프로그램이 자동으로 실
행되기도 한다:
아래의 과정은 그랜트 테이블(만약에 아직 초기화를 하지 않았다면)을 초기화 시키고 그 다음에 서버를 구동시키는 방법에 대해 설
명을 하고 있다. 또한, 몇 가지 명령어를 제공해 주는데, 이 명령어들을 사용해서 여러분은 서버가 접근 가능한지 그리고 제대로 작
동을 하고 있는지에 대한 테스트를 진행할 수 있게 된다. 자동으로 서버를 구동시키고 종료시키는 것에 대한 정보는
Section 2.9.2.2, “자동으로 MySQL서버를 구동 시키기 및 종료 시키기”를 참조하기 바란다.
이 과정을 모두 마치고 서버가 구동된 후에는, mysql_install_db가 생성한 계정에 대해 패스워드를 할당애 주어야 한다. 이렇게 하
는 방법에 대해서는 Section 2.9.3, “초기 MySQL 계정에 보안 설정하기”에서 설명하기로 한다.
여기에 있는 예제에서는, 서버가 mysql 로그인 계정의 사용자 ID에서 동작을 하고 있다. 이것은 그러한 계정이 있다는 가정을 하
게 된다. 만약에 없다면 계정을 생성하거나, 또는 여러분이 서버에서 사용할 예정인 다른 존재하는 계정의 이름을 대신 사용하면 된
다.
2. shell> cd BASEDIR
mysql_install_db 스크립트는 서버의 데이터 디렉토리를 생성한다. 데이터디렉토리 안에서는, 이것은 모든 데이터 베이스
의 권한과 여러분이 MySQL을 테스트할 때 사용하는 test 데이터 베이스를 갖고 있는 mysql 데이터 베이스를 위한 디렉
토리를 만들게 된다. 이 스크립트는 또한 root 계정과 익명 사용자 계정을 위한 권한 테이블 엔트리를 생성한다. 이들에 대
한 초기 권한에 대한 상세 내용은 Section 2.9.3, “초기 MySQL 계정에 대한 보안 작업 하기”에서 제공하기로 한다. 간
략히 말해서, 이러한 권한들은 MySQL root 사용자가 어떠한 일들도 할 수 있게 해주며, 또한 누구라도 test 또는 test_
라는 이름의 데이터 베이스를 생성하거나 사용할 수 있도록 해 준다.
mysql 로그인 계정이 데이터 베이스 디렉토리 및 파일들을 소유하게 함으로써 나중에 여러분이 서버를 구동시킬 때 서버
가 이것들을 접근해서 읽고 쓸 수 있도록 해주는 것은 매우 중요한 사항이다. 이렇게 하도록 하기 위해서는, --user 옵션
은 여러분이 mysql_install_db를 구동시킬 경우에 root에서 보여준 것처럼 사용되어야 한다. 그렇지 않으면, mysql로 로
MySQL 서버는 루트가 아닌(non-root) 로그인 계정으로 구동 되어야 한다는 점이 중요하다. 이것을 확실하게 하기 위
해, --user 옵션은 여러분이 mysql_safe 을 구동한다면 시스템 root에서 볼 수 있는 형태로 사용 되어야 한다. 그렇지
않으면, 그렇지 않으면, mysql로 로그인 하는 동안 스크립트를 실행시켜야 하는데, 이럴 경우에는 --user 옵션을 명령어
에서 생략할 수 있다.
권한이 없는 사용자로서 MySQL을 구동시키는 것에 대한 보다 자세한 정보는 Section 5.7.5, “일반 사용자로 MySQL
구동 시키기”에서 다루기로 한다.
이 과정을 진행하기 전에 그랜트 테이블을 생성하는 것을 잊었다면, 여러분이 서버를 시작할 때 에러 로그 파일에서 다음
과 같은 메시지를 볼 수 있을 것이다:
mysqladmin version을 통해서 나오는 결과는 여러분이 사용하는 플랫폼과 MySQL버전에 따라 약간의 차이가 있으나,
여기에서 보여주는 것들과 매우 흡사한 형태를 띄게 된다:
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
and you are welcome to modify and redistribute it under the GPL license
Protocol version 10
만약에 mysqld_safe이 실패하면, Section 2.9.2.3, “MySQL서버 구동 시키기 및 문제 해결하기”를 참조하기 바란다.
13. 여러분이 서버에서 정보를 불러올 수 있는지 검증하기 위해 간단한 테스트를 진행한다. 결과 값은 아래와 비슷할 것
이다:
15. +-----------+
16. | Databases |
17. +-----------+
18. | mysql |
19. | test |
20. +-----------+
21.
24. +---------------------------+
25. | Tables |
26. +---------------------------+
27. | columns_priv |
28. | db |
29. | func |
30. | help_category |
31. | help_keyword |
32. | help_relation |
33. | help_topic |
34. | host |
35. | proc |
36. | procs_priv |
37. | tables_priv |
38. | time_zone |
39. | time_zone_leap_second |
40. | time_zone_name |
41. | time_zone_transition |
42. | time_zone_transition_type |
43. | user |
44. +---------------------------+
45.
47. &nbs
제목검색
2. MySQL 설치 및 업그레이드 하기
2.9. MySQL설치 후 설정 및 테스트 mysql_install_db 스크립트의 목적은 새로운 MySQL 권한 테이블을 만드는 것이다. 이것은 기존의 권한 테이블에 겹쳐 쓰기를 하
여러분은 mysql_install_db가 그랜트 테이블을 설치하는데 실패하고 아래의 메시지가 화면에 나타난 다음에 시스템이 종
료되는 것을 볼 수 있을 것이다:
mysqld ended
이것은 서버가 지금 구동중임을 나타내며, 이와 같은 경우에는 그랜트 테이블이 이미 생성되어 있을 것이다. 만약에 생성
이 되어 있다면, mysql_install_db을 구동 시킬 필요가 전혀 없는데, 왜냐하면 이것은 MySQL을 설치할 때 한번만 실행시
키면 되는 것이기 때문이다.
● Installing a second mysqld server does not work when one server is running
다중 서버 설정에 대한 자세한 정보는, Section 5.13, “동일 머신에서 다중의 MySQL서버 구동 시키기”를 참조하기 바
란다.
shell> TMPDIR=/some_tmp_dir/
shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysql.sock
여러대의 머신에 동일한 권한을 가진 MySQL를 설치하고자 한다면, GRANT 와 REVOKE 명령문을 하나의 파일에 넣고
mysql_install_db을 실행한 후에 이 파일을 mysql를 사용하는 스크립트 형태로 실행 시킨다. 예를 들면:
● 그랜트 테이블이 생성된 후에 그 테이블을 다시 생성시키는 것은 언제든지 가능하다. 여러분은 GRANT와 REVOKE를 사
용하는 방법을 배운 후에는 이렇게 하길 원할 수도 있으며 mysql_install_db를 구동 시킨 다음에 테이블의 내용을 모두 없
애고 새로 시작하는 다양한 수정을 진행할 수 있을 것이다.
그랜트 테이블을 다시 생성하기 위해서는, mysql 디렉토리에 있는 모든.frm, .MYI, 및 .MYD 파일을 없애야 한다. 그런 다음
에 mysql_install_db 스크립트를 다시 구동 시킨다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.9. MySQL설치 후 설정 및 테스트 일반적으로, 아래의 방법중에 하나를 가지고 mysqld 서버를 구동 시킬수 있다:
mysqld_safe, mysql.server 스크립트 및 Mac OS X 스타트업 아이템은 서버를 수동으로 구동시킬 수도 있으며, 또는 시스템 스
타트업 시간에 자동으로 서버를 실행시킬 수도 있다. mysql.server 및 스타트업 아이템은 또한 서버를 종료시키는데에도 사용할
수 있다.
mysql.server 스크립트를 사용해서 서버를 수동으로 시작 및 종료하기 위해서는, start 또는 stop 인수를 함께 사용해서 호출한
다:
mysql.server 는 서버를 구동하기 전에, 디렉토리를 MySQL 설치 디렉토리로 이동 하고 mysqld_safe를 호출하게 된다. 만약에
서버가 특정 사용자로서 구동되도록 하고자 한다면, 적당한 user 옵션을 /etc/my.cnf 옵션 파일의 [mysqld] 그룹에 추가한다(이
섹션 후반부에서 예를 보여줌). (여러분이 MySQL바이너리 배포판을 비 표준 위치에 설치하였다면, mysql.server를 편집할 필요
가 있을 것이다. 서버가 mysqld_safe를 구동 시키기 전에 cd 를 적당한 디렉토리안에 넣도록 서버를 수정한다. 이렇게 한다면, 여
러분이 수정한 mysql.server 버전은 나중에 업그레이드를 할 경우에 덮어 씌워지게 될 것이며, 따라서 나중에 이것을 가지고 재 설
치할 수 있도록 편집한 버전을 잘 복사해두어야 한다.)
mysql.server stop은 서버에 신호를 보내서 종료를 시킨다. 또한 여러분은 mysqladmin shutdown를 실행 시켜서 수동으로 서버
를 종료 시킬 수도 있다.
자동으로 MySQL서버를 시작 및 종료 시키기 위해서는, 여러분의 /etc/rc* 파일내 적당한 위치에 시작 및 종료 명령어를 추가해야
한다.
어떤 제조사들은 mysqld 과 같은 별도의 이름을 가진 디렉토리에 스타트업 스크립트를 설치하는 RPM 패키지를 제공하기도 한다.
mysql.server를 자동으로 설치하지 않는 소스 배포판 또는 바이너리 배포판 포맷을 사용해서 MySQL을 설치할 경우에는, 수동으
로 이것을 설치할 수 있다. 이 스크립트는 MySQL설치 디렉토리 또는 소스 트리안에 있는 support-files 디렉토리에서 찾을 수
있다.
mysql.server를 수동으로 설치하기 위해서는, 이것을 /etc/init.d 에 mysql이름을 가지고 복사를 한 다음, 이를 실행시킨다.
mysql.server 가 있는 적당한 디렉토리로 이동을 한 다음에 아래의 명령어를 실행한다:
구형의 레드헷 시스템들은 /etc/init.d가 아닌 /etc/rc.d/init.d 디렉토리를 사용하였다. 위의 명령어에서 이것을 수정한다. 다른 방
법으로는, 우선 /etc/init.d 를 /etc/rc.d/init.d를 가리키는 심볼릭 링크로 만드는 것이다:
shell> cd /etc
shell> ln -s rc.d/init.d .
스크립트를 설치한 후에는, 여러분이 사용하는 OS에 따라 시스템 스타트업 시점에 구동시켜야 하는 명령어들이 틀려지게 된다. 리
눅스에서는, chkconfig를 사용할 수 있을 것이다:
어떤 리눅스 시스템에서는, mysql 스크립트를 완벽하게 활성화 시키기 위해서 아래의 명령어가 추가로 필요할 수도 있다:
FreeBSD버전에서는, 스타트업 스크립트는 일반적으로 /usr/local/etc/rc.d/ 디렉토리 안으로 들어가게 된다. rc(8) 사용 설명서
에서는 이 디렉토리안에 있는 스크립트들은 베이스네임(basename)이 *.sh 쉘 파일이름 패턴과 일치할 경우에만 실행된다고 설명
하고 있다. 이 디렉토리안에 있는 다른 파일들 또는 디렉토리들은 무시해도 되는 것들이다. 다시 말해서, FreeBSD에서는, mysql.
server 스크립트를 /usr/local/etc/rc.d/mysql.server.sh 로 설치해서 자동 스타트업을 실행해야 한다.
mysql.server를 위한 옵션은 글로벌 /etc/my.cnf 파일에 추가할 수 있다. 전형적인 /etc/my.cnf 파일은 아래와 같이 보이게 된
다:
[mysqld]
datadir=/usr/local/mysql/var
socket=/var/tmp/mysql.sock
port=3306
user=mysql
[mysql.server]
basedir=/usr/local/mysql
mysql.server 스크립트는 다음의 옵션들을 수용한다: basedir, datadir, 및 pid-file. 만약에 이러한 옵션들이 지정이 되면, 이것들
은 반드시 옵션 파일안에 있어야 한다(명령어 라인이 아님). mysql.server가 명령어 라인에서 받아들이는 인수는 start와 stop밖
에 없다.
아래의 테이블은 서버와 스타트업 스크립트가 옵션 파일에서 읽어올 수 있는 옵션 그룹의 종류를 나타낸다:
제목검색
2. MySQL 설치 및 업그레이드 하기
2.9. MySQL설치 후 설정 및 테스트 이 섹션에서는 유닉스에서 서버를 구동 시킬 때 발생되는 문제에 대해 해결하는 방법을 제시한다. 여러분이 윈도우를 사용하고 있
2.9.2 유닉스에서 MySQL설치후 해야 할 과정 다면, Section 2.3.13, “윈도우에서 MySQL설치하는데 발생하는 문제점 해결”를 참조하기 바란다.
어떤 스토리지 엔진들은 동작을 제어하는 옵션들을 가지고 있다. 여러분은 my.cnf 파일을 생성해서 사용하고자 하는 엔진을 위한
스타트업 옵션을 지정할 수 있다. 만약에 트랜잭션 테이블((InnoDB, BDB, NDB)을 지원하는 스토리지 엔진을 사용할 예정이라
면, 서버를 구동시키기 전에 여러분이 원하는 형태로 스토리지 엔진을 구성해 두어야 한다:
스토리지 엔진은 여러분이 특별히 지정을 하지 않으면 디폴트 옵션 값을 사용하지만, 여러분이 사용 가능한 옵션의 내용을 검토하
고 디폴트 옵션이 여러분이 원하는 설치에 적합하지 않을 경우에 반드시 사용해야 할 값을 지정할 것을 권장한다.
mysqld 서버가 구동을 할 때, 이것은 위치를 데이터 디렉토리로 변경을 한다. 여기에 데이터 베이스가 있고 로그 파일을 여기에 작
데이터 디렉토리의 위치는 서버가 컴파일될 때 고정 되어진다. 그 위치는 서버가 디폴트로 데이터 디렉토리를 찾게 되는 곳이다. 만
약에 데이터 디렉토리가 다른 곳이 있다고 한다면, 서버는 올바른 동작을 하지 못하게 된다. 여러분은 mysqld을 --verbose 및
--help 옵션과 함께 사용해서 호출함으로서 디폴트 경로 설정이 무엇인지를 알아볼 수 있다.
디폴트 위치가 MySQL설치 레이 아웃과 일치하지 않으면, 여러분은 명령어 라인 또는 옵션 파일에서 mysqld 또는 mysqld_safe
에 옵션을 지정해서 우선권을 설정할 수 있다.
데이터 디렉토리의 위치를 확정적으로 지정하기 위해서는, --datadir 옵션을 사용한다. 하지만, 일반적으로는 MySQL이 설치되
어 있는 디렉토리 하부에 있는 베이스 디렉토리를 mysqld에게 알려 주고 그곳에서 데이터 디렉토리를 찾도록 하면 된다. 여러분
은 이것은 --basedir 옵션을 사용해서 진행할 수 있다.
경로 옵션 지정의 효과를 체크하기 위해, mysqld를 --verbose 과 --help 옵션을 함께 호출해 본다. 예를 들면, mysqld이 설치
되어 있는 디렉토리로 위치를 변경하고 그곳에서 아래의 명령어를 실행하고자 한다면, 서버 구동의 효과는 /usr/local의 베이스 디
렉토리와 함께 보여진다.
여러분은 –datadir와 같은 옵션도 지정할 수 있으나, --verbose 및 --help 옵션은 맨 나중에 사용해야 한다는 점을 알아두기
바란디.
일단 여러분이 경로 설정에 대해 결정을 하였다면, --verbose 와 –help 옵션이 없는 상태로 서버를 구동시켜본다.
만약에 mysqld이 현재 동작 중이라면, 여러분은 아래의 명령어를 사용해서 지금 mysqld이 사용중에 있는 경로가 어떤 것인지 알
아낼 수 있다:
또는:
Mysqld을 시작할 때 Errcode 13 (Permission denied를 의미함)이 발생한다면, 이것은 서버가 데이터 디렉토리 또는 그 컨텐츠
에 접속할 권한이 없음을 의미하는 것이다. 이와 같은 경우에는, 데이터 디렉토리 및 그 안에 있는 파일에 대한 접근 허가
(permission)를 변경시켜서 서버가 제데로 접속할 수 있도록 해야 한다. 여러분은 root의 권한으로 서버를 구동시킬 수도 있으나,
이것은 보안 문제를 야기시키기 때문에 이 방법은 피해야 한다.
유닉스에서는, 데이터 디렉토리로 위치를 변경하고 데이터 디렉토리와 그 안에 있는 파일의 소유권을 체크해서 서버가 접근할 수
있는지를 확인해야 한다. 예를 들면, 데이터 디렉토리가 /usr/local/mysql/var라면, 아래의 명령어를 사용한다:
서버가 제대로 구동되지 않으면, 에러 로그를 분석한다. 로그 파일은 데이터 디렉토리 안에 있다(전형적으로, 윈도우에서는 C:
₩Program Files₩MySQL₩MySQL Server 5.0₩data에 있고, 유닉스 바이너리 배포판은 /usr/local/mysql/data에 있으며, 그
리고 유닉스 소스 배포판은 /usr/local/var에 있다). 데이터 디렉토리에서 host_name.err 및 host_name.log 형태의 이름을 가진
파일을 찾아본다. host_name 은 서버 호스트의 이름이다. 그 다음에 이 파일의 맨 마지막 몇 줄을 검사해 본다. 유닉스에서는, tail
을 사용해서 이 라인들을 볼 수 있다:
이 에러 로그에는 서버가 제대로 구동되지 않은 이유가 적혀 있다. 예를 들면, 로그 파일에서 아래와 비슷한 내용을 볼 수 있을 것이
다:
이것은 여러분이 mysqld을 --bdb-no-recover 옵션과 함께 구동 시키지 않았다는 것을 의미하며 버클리 DB(Berkeley DB)
는 데이터 베이스를 복구하고자 시도할 때 자체의 로그 파일에 무엇인가 문제가 있다는 점을 발견했음을 알려주는 것이다. 계속 진
행을 하기 위해서는, 데이터 디렉토리에 있는 구형 버클리 DB를 다른 곳으로 이동을 시켜야 하며, 그곳에서 나중에 분석을 하면 된
다. BDB 로그 파일은 log.0000000001로 시작해서 순차적으로 명명 되어지고, 번호는 시간이 지나면서 증가하게 된다.
mysqld이BDB 테이블을 지원하면서 구동 되어지고 mysqld이 스타트업 때 코어를 덤프(dump)한다면, 이것은 BDB 복구 로그가
갖고 있는 문제점 때문이다. 이와 같은 경우에는, mysqld을 --bdb-no-recover 옵션을 가지고 시도해 본다. 이것이 도움이 된다
면, 데이터 디렉토리에서 모든 BDB 로그 파일을 삭제하고 다시 한번 mysqld을 --bdb-no-recover 옵션 없이 구동시켜 본다.
아래의 에러 로그중에 하나라도 다시 나타나면, mysqld이 사용하고자 하는 TCP/IP포트 또는 유닉스 소켓 파일을 다른 프로그램
(아마도 다른 mysqld) 이 사용하고 있음을 의미하는 것이다:
ps를 사용해서 다른 mysqld 이 현재 동작되고 있는지 확인해 본다. 만약에 있다면, mysqld 을 다시 구동 시키기 전에 서버를 셧다
운 시킨다. (만약에 다른 서버가 구동 중이라면, 그리고 다중 서버를 구동시켜야 한다면, Section 5.13, “동일 머신에서 다중
MySQL 서버를 구동 시키기”에서 그에 대한 방법을 알아보기 바란다.)
어야 한다.
여러분이 방화벽을 사용하고 있을 경우에도 서버가 포트에 접속을 하지 못하게 된다. 만약에 이러한 경우라면, 방화벽 설정을 변경
하여 포트에 접속할 수 있도록 한다.
서버는 구동 되지만 여기에 접속을 할 수 없을 경우에는, 여러분이 아래와 같이 보이는 /etc/hosts의 엔트리에 포함되어 있는지 다
시 한번 확인해 본다:
127.0.0.1 localhost
이 문제는 시스템이 동작중인 쓰레드 라이브러리가 없을 경우에만 발생되는데, 그 이유는 MySQL은 반드시 MIT-pthreads를 사
용해서 구성되어지기 때문이다.
여러분이 구동시킬 수 있는 mysqld을 가져 올 수 없다면, --debug 옵션을 사용해서 문제를 찾아보기 위한 추적 파일(trace file)
을 만들어 본다. Section E.1.2, “추적 파일(Trace Files) 생성하기”를 참조할 것.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.9. MySQL설치 후 설정 및 테스트 MySQL 설치 과정에는 그랜트 테이블을 갖는 mysql 데이터베이스를 설정하는 부분이 있다:
그랜트 테이블은 초기 MySQL 사용자 계정과 접근 권한을 정의한다. 이 계정들은 아래와 같이 설정한다:
● root 이름을 갖는 계정이 생성된다. 이것은 모든 업무를 할 수 있는 슈퍼유저(superuser) 계정이다. 초기root 계정 패스워
드는 비어 있으며, 따라서 누구라도 MySQL 서버에 root — 패스워드 없이 — 로 접속할 수 있으며 모든 권한을 갖게 된
다.
❍ 윈도우에서는, 한 개의 root 계정이 생성된다; 이 계정은 로컬 호스트에서만 접근에 허용된다. 윈도우 설치기는
MySQL을 설치할 때 옵션 사항으로 사용자가 리모트 머신에 있는 어떤 호스트로도 접속이 가능하게끔 root 계정
을 활성화 시킬 수 있다.
❍ 유닉스에서는, 로컬 호스트에서 접속하기 위해서 두 개의 root 계정이 모두 사용된다. 하나의 계정에 대해서는
localhost 의 호스트 이름을, 또는 다른 계정에 대해서는 실제 호스트 이름 또는 IP 번호를 지정함으로써 로컬 호스
트로부터 접속이 이루어져야 한다.
● 두 개의 익명 사용자 계정이 생성되고, 각자는 사용자 이름이 비어 있는 상태로 만들어 진다. 익명 사용자 계정은 패스워드
가 없으며, 따라서 누구라도 이 계정을 사용해서 MySQL서버에 접속할 수 있다.
❍ 윈도우 시스템에서는, 하나의 익명 사용자 계정이 로컬 호스트를 통해 접속이 이루어진다. 이 계정은 root 계정과
같이 모든 권한을 가지고 있다. 나머지 계정 하나는 다른 호스트로부터의 접속을 위한 것이며 test 데이터 베이스
및 test로 시작되는 다른 데이터 베이스를 위한 모든 권한을 가지고 있다.
● 만약에 익명의 사용자가 패스워드 없이 클라이언트에 접속하는 것을 막고자 한다면, 각 익명 사용자 계정에 패스워드를 할
당하거나, 또는 익명 사용자 계정을 삭제해야 한다.
● 각 MySQL root 계정에 패스워드를 할당한다.
아래에서는 초기 MySQL계정에 패스워드를 할당하는 방법에 대해 설명을 하기로 하는데, 우선 익명 사용자 계정 설정 방법을 설명
하고 다음에 root 계정에 관한 방법을 설명하기로 한다. 아래의 예제에 있는“newpwd”를 여러분이 원하는 것으로 바꾼다. 이 설
명서는 익명 사용자 계정을 삭제하는 방법에 대해서도 설명을 하는데, 이렇게 하면 익명 사용자 계정을 가지고는 절대로 서버에 접
속을 할 수 없게 된다.
여러분은 패스워드 설정을 나중에 하고 싶을 수도 있는데, 이렇게 하면 추가적인 설정 또는 테스트를 진행하는 동안 패스워드를 지
정하지 않아도 된다. 하지만, 상용 제품을 설치하고 실제 사용하기 전에는 반드시 해야 한다.
익명 사용자 계정에 패스워드를 할당하기 위해서는, root로 서버에 접속을 한 다음에 SET PASSWORD 또는 UPDATE를 실행한
다. 어느 경우에서든지, PASSWORD() 함수를 사용해서 패스워드를 암호화 하도록 한다.
두 번째 SET PASSWORD 명령문에서, host_name 을 서버 호스트 이름으로 변경한다. 이것은 user 테이블에 있는 root에 대한
non-localhost 레코드의 Host 컬럼에 지정되어 있는 이름이다. 만약에 호스트 이름이 무엇인지 모를 경우에는, SET
PASSWORD를 실행하기 전에 아래의 명령어를 입력한다:
Host 컬럼에 있는 localhost가 아니고 User 컬럼과 다른 것에서 root를 가지고 있는 레코드를 살펴본다. 그 다음에 두 번째 SET
PASSWORD에서 그 Host 값을 사용한다.
익명 사용자 계정에 패스워드를 할당하는 다른 방법은 UPDATE를 사용해서 user 테이블을 직접 수정하는 것이다. Root로 서버
에 접속을 한 다음에 UPDATE 명령문을 입력하여 적당한 user 테이블 레코드의 Password 컬럼에 값을 할당한다. 이 과정은 윈도
우와 유닉스에서 모두 동일하다. 아래의 UPDATE 명령문은 하나의 패스워드를 두 개의 익명 계정에 동시에 할당해 준다:
UPDATE를 사용해서 user 테이블에 직접 패스워드를 갱신한 다음에는, 서버가 FLUSH PRIVILEGES를 통해 그랜트 테이블을
다시 읽어 오도록 해야 한다. 그렇게 하지 않으면, 여러분이 서버를 재 구동 시키기 전까지 서버는 갱신된 내용을 알지 못하게 된
다.
DELETE 명령문은 윈도우와 유닉시에 모두 적용된다. 윈도우에서, 만약에 root 권한과 똑 같은 권한을 갖고 있는 익명 계정만 삭
제하고자 한다면, 아래를 대신 실행한다:
이 계정은 익명의 사용자가 전체 권한을 갖고 있기 때문에, 이것을 삭제하면 보안성이 개선되는 것이다..
root 계정에 패스워드를 할당하는 방법은 여러 가지가 있다. 아래에서는 세 가지 방법에 대해 보여 주기로 한다:
SET PASSWORD를 사용해서 패스워드를 할당하기 위해서는, root로 서버에 접속을 한 다음에 두개의 SET PASSWORD 명령문
을 입력한다. PASSWORD() 함수를 사용해서 패스워드를 암호화 하도록 한다.
두 번째 SET PASSWORD 명령문에서, host_name를 서버 호스트 이름으로 바꾼다. 이것은 익명 계정의 패스워드를 할당할 때 사
용한 이름과 똑 같은 이름이다.
이 명령문들은 윈도우와 유닉스에서 모두 적용 된다. 두 번째 명령에서, host_name를 서버 호스트 이름으로 바꾼다. 패스워드를 감
싸고 있는 이중 인용 부호는 항상 필요한 것은 아니지만, 패스워드가 스페이스를 가지고 있거나 또는 명령어 해석기가 특수 문자로
해석하는 문자를 포함하고 있을 때에는 반드시 사용해야 한다.
UPDATE를 사용해서 user 테이블을 직접 수정할 수도 있다. 아래의 UPDATE 명령문은 하나의 패스워드를 두 개의 root 계정 모
두에 동시에 할당한다:
패스워드를 설정한 다음에는, 서버에 접속할 때마다 패스워드를 입력해야 한다. 예를 들면, 만약에 서버를 셧다운 시키기 위해
mysqladmin를 사용하고자 한다면, 아래의 명령어를 사용해서 실행할 수 있다:
Note: 패스워드 설정 후에 root 패스워드를 잊어 버렸다면, Section A.4.1, “How to Reset the Root Password”을 참조해서
root 패스워드를 재 설정하기 바란다.
다른 계정들에 대한 설정은, GRANT 명령문을 사용하면 된다. 사용 설명은 Section 5.9.2, “새로운 계정을 MySQL에 추가 하
기”을 참조하기 바란다.
제목검색
2.10.1 MySQL 5.0에서 업그레이드 하기 일반적인 규칙에 따라서, 하나의 릴리즈 시리즈에서 다른 시리즈로 업그레이드를 할 경우에, 시리즈를 건너 띄기 보다는 바로 다
2.10.2 MySQL 4.1에서 5.0으로 업그레이드 하기 음의 시리즈로 업그레이드할 것을 권장한다. 예를 들면, 여러분이 현재 MySQL 3.23을 사용하고 있고 새로운 시리즈로 업그레
2.10.3 MySQL 데이터 베이스를 다른 머신으로 복사 이드를 하고자 한다면, u4.1 또는 5.0으로 곧장 하지 말고 4.0으로 업그레이드를 하도록 한다.
● MySQL4.1에서 5.0으로 업그레이드를 하기 전에, Section 2.10.2, “MySQL 4.1에서 5.0으로 업그레이드 하기”) 뿐
만 아니라 Appendix D, MySQL Change History도 읽기 바란다. 여기에는 MySQL5.0에 포함되어 있는 새로운 기능
들 또는 4.1과의 차이점에 대한 내용이 들어있다. 4.1 이전 버전에서 4.1 버전으로 업그레이드를 하고자 한다면, 현재
사용 버전에서부터 차례대로 업그레이들 실행해서 4.1 버전까지 진행하도록 해야 하며, 그 다음에 5.0 버전으로 업그레
이드를 실행해야 한다. 4.1 버전 또는 그 이전 버전에서 업그레이드에 대한 보다 자세한 정보는 MySQL 3.23, 4.0, 4.1
Reference Manual을 참조하기 바란다.
● 업그레이드를 하기 전에, 그랜트 테이블을 갖고 있는 mysql 데이터 베이스를 포함해서 모든 데이터 베이스를 백업 받아
두기 바란다.
● MySQL 버전중에 어떤 것은 그랜트 테이블에 새로운 권한 또는 기능들을 추가 하기 위해 그 구조를 변경시킨다. 새로
운 버전으로 업그레이드를 할 때마다, 그랜트 테이블을 갱신시켜서 해당 업그레이드 버전이 갖고 있는 새로운 기능을 항
상 그랜트 테이블이 갖고 있도록 해야 한다. Section 5.6.1, “mysql_fix_privilege_tables — 업그레이드 MySQL 시
스템 테이블”을 참조할 것.
● 윈도우에서 MySQL 서버를 구동시킨다면, Section 2.3.14, “윈도우에서 MySQL 업그레이드 하기”를 참조할 것.
● 리플리케이션을 사용하고 있다면, Section 6.6, “리플리케이션 설정 업그레이드 하기”를 참조하여 보다 자세한 정보
를 얻기 바란다.
● mysqld-max라는 이름의 서버가 포함된 MySQL-Max배포판을 전에 설치 하였고, 그리고 나중에 MySQL의 non-
Max버전으로 업그레이드를 하였다면, mysqld_safe는 여전히 예전 mysqld-max 서버를 구동시키고자 한다. 만약에
이러한 업그레이드를 한다면, 수동으로 예전 mysqld-max 서버를 삭제해서 mysqld_safe 서버가 새로운 mysqld 서버
를 실행하게끔 해주어야 한다.
동일한 MySQL릴리즈 시리즈 버전내에서 업그레이드를 한다면 MySQL포맷 파일과 데이터 파일을 서로 다른 버전간에 언제든
지 이동 시킬 수 있다. MySQL을 구동 시킬 때 문자 셋을 변경하고자 한다면, 모든 MyISAM 테이블에서 myisamchk -r -q
--set-collation=collation_name을 실행시켜야 한다. 그렇지 않으면, 인덱스를 올바르게 순서화하지 못할 수 있는데, 왜냐하
면 문자 셋 변경은 정렬 순서까지도 변경 시키기 때문이다.
여러분이 새로운 버전을 사용한 것에 대해 염려가 된다면, 새로운 버전을 설치하기 전에 예전 mysqld의 이름을 변경시켜 놓을
수 있다. 예를 들면, 여러분이 지금 MySQL 4.1.13 을 사용하고 있고 5.0.10으로 업그레이드를 하고 싶다면, 현재의 서버를
mysqld에서 mysqld-4.1.13로 변경시켜 놓는다. 그런 후에 만약에 새로운 mysqld에 예상하지 못한 문제가 생긴다면, 간단히
이것을 셧다운 시킨 다음에 예전 mysqld를 재 실행시키면 된다.
업그레이드를 한 후에, 클라이언트를 재 컴파일 하는데 있어서 문제가 발생한다면, 예를 들면 Commands out of sync 또는 예
상하지 못한 코어 덤프, 여러분이 프로그램을 컴파일할 때 아직도 예전 헤더(header) 또는 라이브러리 파일들을 사용하고 있는
것이다. 이와 같은 경우에, 우선 mysql.h 파일과 libmysqlclient.a 의 생성 날짜를 검사해서 이것들이 새로운 MySQL이 생성한
것들인지 확인을 한다. 그렇지 않다면, 프로그램을 새로운 해더와 라이브러리를 가지고 컴파일 한다..
새로운 mysqld 서버를 구동할 수 없다거나 패스워드 없이 접속하는 것이 불가능하다는 것과 같은 문제가 발생하면, 예전 설치
때 만들어진 my.cnf 파일이 있는지 확인해 본다. 이것은 --print-defaults 옵션을 사용해서 확인할 수 있다(예를 들면,
mysqld --print-defaults). 이 명령어를 실행한 후에 프로그램 이름 이외의 것이 화면에 나타난다면, 서버와 클라이언트의 실
행에 영향을 미치는 my.cnf 파일이 존재하는 것이다.
MySQL의 새로운 릴리즈를 설치할 때마다 펄(Perl) DBD::mysql 모듈을 재 설치하고 재 구축하는 것은 좋은 생각이다. PHP
mysql 확자자 및 Python MySQLdb 모듈과 같은 다른 MySQL 인터페이스에 대해서도 똑 같은 작업을 하는 것이 좋다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.10. MySQL 업그레이드 하기 5.0에서 5.0.10 또는 그 이상 버전으로 업그레이드를 할 때에는, 그랜트 테이블을 업그레이드 하는 것이 필요하다는 것을 알아두
2.10.1 MySQL 5.0에서 업그레이드 하기 기 바란다. 그렇지 않으면, 스토어드 프로시저 및 함수의 생성이 진행되지 않는다. Section 5.6.1, “mysql_fix_privilege_tables
— 업그레이드 MySQL 시스템 테이블”을 참조할 것.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=10&scate=1&idx=1472006-08-03 오후 4:05:30
:::MySQL Korea:::
제목검색
2. MySQL Note: 새로운 소프트웨어 버전으로 업그레이드를 하기 전에 데이터를 백업 받아 두는 것은 좋은 습관이다. 비록 MySQL이 최고 수준의 성능을 보장한다고 하더라도, 여러분은 스스로 데이터를
설치 및 업 백업하여 데이터의 안전을 보장해야 한다. MySQL은 5.0 이전 버전에서 5.0으로 업그레이드 하기 위해 테이블을 덤프하여 재 로드(re-load)하는 것을 권장한다.
그레이드 하
기
일반적으로, 4.1에서 5.0으로 업그레이드를 할 때 아래의 과정을 진행해야 한다:
2.10.
MySQL 업 ● 이 섹션 후반에서 보게 되는 변경 리스트(change list)에 있는 항목(items)을 검사해서 그 중에 어떤 것이 여러분의 어플리케이션에 영향을 줄 수 있는지 확인한다. 특히Incompatible
그레이드 하
change라고 되어 있는 부분을 주목한다. 이러한 것들은 예전 MySQL 버전과의 비호환성(incompatibilities)을 야기하며, 이로 인해 여러분은 업그레이드를 하기 전에 무엇인가를 해야
기
만 하게 된다.
2.10.2 MySQL
● MySQL 5.0 변경 디렉토리를 읽음으로써5.0에서 사용할 수 있는 중요한 새로운 기능들을 알아 본다. Section D.1, “Changes in release 5.0.x (Production)”를 참조할 것.
4.1에서
● 윈도우에서 MySQL 서버를 구동시킨다면, Section 2.3.14, “윈도우에서 MySQL 업그레이드 하기”를 참조할 것. 윈도우 MySQL서버중에 두 개의 이름이 변경된다는 점도 역시 알아
5.0으로
업그레 두기 바란다. Section 2.3.8, “MySQL 서버 타입 선택하기”를 참조할 것.
이드 하 ● MySQL 5.0은 스토어드 프로시저에 대한 지원을 추가 하였다. 이러한 지원은 mysql 데이터 베이스 안에 proc 테이블을 필요로 한다.
기 ● MySQL 5.0은 뷰(view)를 지원한다. 이 지원은 mysql 데이터 베이스에서 user와 db 테이블에 추가적인 권한 컬럼들을 요구하게 된다. 이러한 컬럼들을 만들기 위해서는,
Section 5.6.1, “mysql_fix_privilege_tables — 업그레이드 MySQL 시스템 테이블”에서 설명하는 방식으로 mysql_fix_privilege_tables 스크립트를 구동 시켜야 한다.
● 리플리케이션을 사용하고 있다면, Section 6.6, “리플리케이션 설정 업그레이드 하기”를 참조하여 여러분의 리플리케이션을 업그레이드 하기 바란다.
MySQL 4.1이 5.0으로 업그레이드 되면서 표준 SQL과의 호환성을 우지하기 위한 몇 가지 변화가 있다. 이런 변경은 여러분이 사용하고 있는 어플리케이션에도 영향을 미칠 것이다.
아래에서는 어플리케이션에 영향을 줄 수 있는 것들과 5.0으로 업그레이드를 할 때 주의해야 할 사항들을 설명하기로 한다.
Server Changes:
● Incompatible change: TEXT 컬럼에 있는 InnoDB 와 MyISAM 테이블을 위한 엔드-스페이스(end-space)용 인덱싱 순서가 변경 되었다. 5.0.3버전 이후에, TEXT 인덱스는 마지막
에서 스페이스-패드(space-padded)와 비교된다(마치 MySQL이 CHAR, VARCHAR 및 TEXT 필드를 정렬시키는 것처럼). TEXT 컬럼에 인덱스가 있다면, 여기에서 CHECK
TABLE을 실행해야 한다. 실행 후에 에러가 발생하면, 인덱스를 재 구축한다: InnoDB 테이블이 있다면 테이블을 덤프하고 재 로드 하거나, 또는MyISAM 테이블이 있다면 OPTIMIZE
TABLE 또는 REPAIR TABLE를 실행한다.
● Warning: Incompatible change. BINARY 컬럼에 대해서는, 패드(pad) 값과 이것을 다루는 방법이 MySQL 5.0.15이후로 변경 되었다. 현재 삽입을 위한 패드 값은 스페이스가 아니
라 0x00 이고, 그리고 선택을 위한 패드 값 스트라이핑(stripping)은 없다. 자세한 사항은, Section 11.4.2, “BINARY 와 VARBINARY 타입”을 참조할 것.
● Incompatible change: MySQL 5.0.3에서 5.0.5까지 DECIMAL 컬럼을 가지고 생성된 MyISAM 과 InnoDB 테이블은 5.0.6으로 업그레이드를 한 후에는 깨져 버린다(corrupted). 업
그레이드를 하기 전에 이 테이블들을 덤프(Dump)해 놓은 다음에, 업그레이드를 한 후에 다시 재 로드 한다. (동일한 비호환성 문제가 5.0.6에서 생성한 테이블을 5.0.3과 5.0.5로 다운
그레이드할 때에도 발생한다.)
● Incompatible change: DECIMAL구현 방법이 MySQL 5.0.3에서 변경 되었다. 어플리케이션이 이 변경 사항을 인식하도록 해야 하는데, 자세한 내용은, Section 21.2, “DECIMAL 데
이터 타입 변경”을 참조하기 바란다.
DECIMAL 과 NUMERIC 고정-소수점 타입(fixed-point data types)의 구현 방법의 변경으로 인해 서버는 표준 SQL의 규칙을 보다 확실하게 준수하게 되었다. 예를 들면,
DECIMAL(3,1)의 데이터 타입은 99.9의 최대 값을 저장한다. MySQL 5.0.3 이전에서는, 서버는 보다 큰 숫자를 저장했어야 했다. 즉, 서버는 100.0에 대해 100.0으로 저장을 했다.
MySQL 5.0.3 이후에는, 서버는 100.0을 절사해서(clips) 최대 가능 숫자 99.9로 저장된다. 여러분이 5.0.3 이전 버전에서 생성된 테이블을 갖고 있고 이 테이블이 부동 소수점 데이
터 타입을 갖고 있다면, 이 데이터를 변경 시켜야 한다. 예를 들면:
● Incompatible change: MySQL 5.0.3 이후부터는, 서버가 메인 함수 심볼에 추가적으로 정의된 보조 심볼(auxiliary symbol)(예를 들면 xxx_init 또는 xxx_deinit 심볼)을 적어도 하
나 이상 갖고 있지 않는다면 디폴트로 더 이상 사용자 정의 함수를 로드 하지 않는다. 이런 동작은 --allow-suspicious-udfs 옵션을 가지고 우선적으로 실행시킬 수 있다.
Section 24.2.4.6, “사용자 정의 함수 보안 사전 대책”을 참조할 것.
● Incompatible change: 업데이트 로그는 MySQL 5.0에서 삭제 되었다. 여러분이 전에 이것을 활성화 시켰다면, 이것 대신에 바이너리 로그를 활성화 시켜야 한다.
● Incompatible change: ISAM 스토리지 엔지에 대한 지원은 없어졌다. 만약에 ISAM 테이블을 갖고 있다면, 업그레이드하기 전에 그 테이블을 변환시켜야(convert) 한다. 예를 들면,
MyISAM 스토리지 엔진을 사용하도록 ISAM 테이블을 변환 시키기 위해서는, 다음의 명령문을 사용한다:
● Incompatible change: MySQL5.0부터는 MyISAM 테이블에 있는 RAID 옵션에 대한 지원이 삭제 되었다. 이러한 옵션을 사용하는 테이블을 갖고 있다면, 업그레이드 하기 전에 변환
을 해 놓아야 한다. 한 가지 방법은 mysqldump을 가지고 덤프를 하고, 덤프 파일을 CREATE TABLE 명령문에 있는 RAID 옵션을 삭제하고 덤프 파일을 다시 로드 하는 것이다. 다른
방법으로는 CREATE TABLE new_tbl ... SELECT raid_tbl을 사용해서 RAID 테이블로부터 새로운 테이블을 생성하는 것이다. 하지만, 명령문의 CREATE TABLE 부분에는 반드
시 인덱스뿐만 아니라 컬럼 속성을 재 생성을 위한 충분한 정보가 포함되어야 하는데, 그렇지 않을 경우에는 컬럼 속성을 잃어 버리게 되고 인덱스는 새로운 테이블에서 사라지게 될 것
이다. Section 13.1.5, “CREATE TABLE 신텍스”를 참조할 것.
주어진 데이터베이스에 있는 RAID 테이블을 위한 .MYD 파일들은 00에서 ff까지의 16진수로 이름이 되어 있는 서브 디렉토리에 있는 데이터 디렉토리 아래에 저장된다. RAID 옵션
을 가지고 있는 모든 테이블을 변환시킨 다음에도, 이러한 RAID-관련 서브 디렉토리는 아직까지 존재하게 되지만 삭제가 가능하다. 이 디렉토리가 비어 있음을 확인하고, 수동으로 이
것들을 삭제한다. (디렉토리가 비어 있지 않으면, 아직까지도 변환되지 않은 RAID 테이블이 있는 것이다.)
● MySQL 5.0.6에서는, 스토어드 루틴과 트리거의 바이너리 로깅이 변경 되었다. 이 변경 사항은 Section 17.4, “스토어드 루틴과 트리거의 바이너리 로깅”에서 설명하듯이 보안, 리플
SQL Changes:
● Incompatible change: 이전에는, 잠금 대기 타임 아웃(lock wait timeout)은 InnoDB가 현재의 모든 트랜젝션을 롤백(roll back)하게끔 만들었다. MySQL 5.0.13이후에는, 이것은 가
장 최신의 SQL명령문만 롤백 시킨다.
● Incompatible change: 트리거용 이름 공간(namespace)은 MySQL 5.0.10에서 변경 되었다. 이전 버전에서는, 트리거의 이름은 테이블 별로 서로 틀린 것을 사용해야 했다. 이제는 스
키마(데이터베이스)별로 서로 틀린 이름을 사용해야 한다. 이 변경은 이제는 DROP TRIGGER 신텍스가 테이블 이름 대신에 스키마 이름을 사용한다는 것을 의미하는 것이다(스키마 이
름은 옵션 사항이며, 만약에 생략 되면, 현재의 스키마가 사용 된다).
MySQL 5.0 이전 버전에서 MySQL 5.0.10 또는 그 이후 버전으로 업그레이드를 할 때, 여러분은 모든 트리거를 드롭(drop)시킨 후에 다시 생성 시켜야 하는데, 그렇지 않으면 DROP
TRIGGER가 업그레이드 후에 동작하지 않는다. 이것을 실행하기 위한 권장 과정이 여기에 있다:
1. MySQL 5.0.10 또는 그 이후 버전으로 업그레이드를 해서 INFORMATION_SCHEMA.TRIGGERS 테이블에 있는 트리거 정보를 접근할 수 있도록 한다. (이것은
5.0.10 이전 트리거에 대해서도 실행해야 한다.)
2. 다음의 SELECT 명령문을 사용해서 모든 트리거 정의문을 덤프한다Dump all trigger definitions using the following SELECT statement:
SELECT CONCAT('CREATE TRIGGER ', t.TRIGGER_SCHEMA, '.',t.TRIGGER_NAME,
' ', t.ACTION_TIMING, ' ', t.EVENT_MANIPULATION, ' ON ',
t.EVENT_OBJECT_SCHEMA, '.', t.EVENT_OBJECT_TABLE,
' FOR EACH ROW ', t.ACTION_STATEMENT, '//' )
INTO OUTFILE '/tmp/triggers.sql'
FROM INFORMATION_SCHEMA.TRIGGERS AS t;
명령문은 INTO OUTFILE을 사용하기 때문에, 여러분은 FILE 권한을 반드시 갖고 있어야 한다. 이 파일은 서버 호스트에서 생성 되어진다; 원하면 다른 이름을 사용 한다.
100% 안전을 보장하기 위해, triggers.sql 파일에 있는 트리거 정의문을 조사하고, 이 파일의 복사본을 만들어 둔다.
3. 서버를 종료하고 데이터 디렉토리에 있는 모든 .TRG 파일을 삭제해서 모든 트리거를 드롭시킨다. 데이터 디렉토리로 위치를 변경한 다음에 다음의 명령어를 입력한다:
4. shell> rm */*.TRG
6. mysql> delimiter // ;
● Incompatible change: MySQL 5.0.15 이후에는, CHAR() 함수는 연결 문자 셋에 있는 스트링이 아닌 바이너리 스트링을 리턴 한다. USING charset_name 옵션 구문은 이것 대신에
특수 문자 셋을 리턴할 때 사용할 수 있다. 또한, 256보다 큰 인수들은 다중 문자(multiple character)를 만들어 낸다. 더 이상 모듈로 256을 해석해서 단일 문자 셋을 만들지는 못한다.
이러한 변경으로 인해 몇 가지 비호화성이 발생하게 되었다:
o +----------------------+
o | CHAR(ORD('A')) = 'a' |
o +----------------------+
o | 0|
o +----------------------+
대소 문자를 구분하지 않는 비교문을 실행하기 위해서는, USING 구문을 추가 하거나 또는 결과를 변환 시킴으로써 비-바이너리(non-binary)문자 셋에 결과 스트링을 만들
수 있다:
mysql>
제목검색
2. MySQL 설치 및 업그레이드 하기
2.10. MySQL 업그레이드 하기 여러분은 MyISAM 테이블용 .frm, .MYI, 및 .MYD 파일을 동일한 부동 소수점 포맷을 지원하는 서로 다른 머신 사이에서 이동 시
2.10.3 MySQL 데이터 베이스를 다른 머신으로 복 킬 수 있다. Section 14.1, “MyISAM 스토리지 엔진”을 참조 할 것.
사하기
서로 다른 머신간에 데이터 베이스를 전달할 필요가 있을 경우에는, mysqldump를 사용해서 SQL명령문을 갖는 파일을 만든다.
그 다음에는 다른 머신에 전달하고 mysql 클라이언트의 입력 값으로 사용한다.
mysqldump --help옵션을 사용해서 사용 가능한 옵션을 알아 본다. 데이터를 새로운 버전의 MySQL로 전달한다면,
mysqldump --opt 를 사용해서 최대한 최적화를 시켜서 덤프를 함으로서 크기를 작게 할 수 있다.
두 머신간의 데이터 이동(빠르지는 않더라도) 방법 중에 가장 간단한 것은 데이터 베이스가 있는 머신에서 아래의 명령어들을 실행
하는 것이다:
속도가 느린 네트워크상에 있는 리모트 머신에서 데이터를 복사하고자 한다면, 다음의 명령어를 사용하면 된다:
여러분은 파일안에 덤프로 저장하고, 타겟 머신에 파일을 전송하고, 그 다음에 그곳에 있는 데이터 베이스로 파일을 로드할 수도 있
다. 예를 들면, 아래와 같이 소스 머신에서 데이터 베이스를 압축 파일로 덤프할 수 있다:
데이터 베이스를 갖고 있는 파일을 타겟 머신으로 전송한 다음에 아래의 명령어를 그곳에서 실행한다:
데이터 베이스를 전송하기 위해서 mysqldump 와mysqlimport 도 사용할 수 있다. 큰 테이블의 경우, 이것은 단순히 mysqldump
를 사용하는 것보다 빠르다. 아래의 명령어에서 보면, DUMPDIR 는 mysqldump 로부터 결과를 저장하기 위해 사용하는 디렉토리
의 전체 경로 이름을 표시하는 것이다.
그 다음에는 DUMPDIR 디렉토리에 있는 파일을 타겟 머신의 대응되는 디렉토리에 전송하고 그 곳에 잇는 MySQL안으로 로드를
한다:
mysql 데이터 베이스를 복사하는 것을 잊지 말아야 하는데, 거기에 그랜트 테이블이 저장되어 있기 때문이다. 여러분이 새로운 머
신에 mysql 데이터 베이스를 갖기 전까지는 그 곳에서 root 사용자로서 명령어를 실행해야 할 것이다.
mysql 데이터 베이스를 새로운 머신으로 전송한 다음에는, mysqladmin flush-privileges를 실행해서 서버가 그랜트 테이블 정보
를 다시 로드하도록 만든다.
제목검색
2.11.1 4.1로 다운 그레이드 하기 동일한 릴리즈 시리즈내에서 다운 그레이드를 한다면(예를 들면, 4.1.13에서 4.1.12로), 일반적인 방법은 새로운 바이너리를 이전
버전의 최상위에 설치하는 것이다. 데이터 베이스에는 아무것도 할 것이 없다. 하지만, 항상 그러하듯이, 백업을 받아 두는 것이 좋
다.
아래에서는 다운 그레이드를 실행할 때 체크해야 할 항목들을 명시하고 있다.:
● 다운 그레이드 하고자 하는 버전에 있는 업그레이드 섹션을 숙지하여 필요 없는 기능은 실행하지 않도록 한다.
Section 2.10, “MySQL 업그레이드 하기”를 참조할 것.
● 그곳에 다운 그레이드에 관련된 사항이 있다면, 그 부분도 숙지하기 바란다.
대부분의 경우, 여러분은 동일한 MySQL릴리즈 시리즈 버전에서 진행하는 동안 동일 머신에 있는 서로 다른 버전간에 MySQL 포
맷 파일과 데이터 파일을 이동하는 것은 가능하다.
하나의 릴리즈 시리즈에서 다른 다운 그레이드를 할 경우에는, 테이블 스토리지 포맷에서 호환이 되지 않는 경우도 있다. 이럴 경우
에는, mysqldump를 사용해서 다운 그레이드 하기 전에 테이블을 덤프한다. 다운 그레이드한 후에, mysql을 사용해서 덤프 파일
을 재 로드하거나 또는 mysqlimport를 사용해서 테이블을 재 생성한다. 예를 들면, Section 2.10.3, “다른 머신으로 MySQL 데
이터 베이스 복사하기”를 참조할 것.
다운 그레이드할 때 하향 비화화적인 테이블 포멧(downward-incompatible table format) 변경의 일반적인 증상은 테이블을 열
지 못한다는 것이다. 이와 같은 경우, 다음의 과정을 진행한다:
1. 다운 로드 하고자 하는 예전 서버를 종료한다.
2. 다운 로드 하고자 하는 새로운 서버를 재 시작한다.
3. 예전 서버에서 사용할 수 없는 테이블들을 덤프한다. Mysqldump를 사용해서 덤프 파일을 만든다.
4. 새로운 서버를 종료하고 구형 서버를 재 시작한다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.11. MySQL 다운 그레이드 하기 5.0에서 다운 그레이드를 한 다음에는, mysql.err 파일에서 다음과 같은 에러를 볼 수 있을 것이다:
제목검색
상위메뉴리스트 ◆ 2.12. OS 관련 노트
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=12&scate=0&idx=1632006-08-03 오후 4:06:11
:::MySQL Korea:::
제목검색
여기에서 설명하는 대부분의 문제점들은 구형 리눅스 버전을 사용할 경우에 발생되는 것들로서, 만약에 최신의 리눅스 버전을 사용
할 경우에는 거의 발생하지 않게 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=12&scate=1&idx=1662006-08-03 오후 4:06:17
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.12.1 리눅스 노트
Warning: 우리는 몇 가지 이상한 문제점들이 리눅스 2.2.14과 MySQL이 시스템에서 동작할 때 발생된다는 것을 발견하였다. 우리
2.12.1.1 리눅스 OS 노트
는 또한 몇몇 MySQL사용자들이 리눅스 커널 2.2.14에서 MySQL서버를 구동시킬 때 안정성에 심각한 문제가 있다는 보고를 받
2.12.1.2 리눅스 바이너리 배포판 노트
은 적도 있다. 여러분이 이런 커널을 사용하고 있다면, 커널을 2.2.19(또는 그 이상)으로 업그레이드 하거나 2.4커널로 업그레이
2.12.1.3 리눅스 소스 배포판 노트
드 해야 한다. 다중 CPU시스템을 사용중이라면, 2.4 커널을 사용하길 적극 권장하는데, 이런 시스템 환경에서는 괄목할 만한 성능
2.12.1.4 리눅스 설치후 과정 노트
향상과 개선된 안정성을 기대할 수 있기 때문이다.
2.12.1.5 리눅스 x86 노트
2.12.1.6 리눅스 SPARC 노트 리눅스쓰레드(LinuxThreads)를 사용할 때, 여러분은 최소한 3개의 mysqld 프로세스가 구동되고 있음을 볼 것이다. 이것들이 사
2.12.1.7 리눅스 Alpha 노트 실 쓰레드이다. 하나는 리눅스쓰레드 관리자용이고, 다른 하나는 연결(connection)을 다루기 위한 쓰레드이며, 나머지 한 개는 경
2.12.1.8 리눅스 PowerPC 노트 고와 신호(alarm and signal)을 처리하기 위한 것이다.
2.12.1.9 리눅스 MIPS 노트
2.12.1.10 리눅스 IA-64 노트
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=12&scate=1&idx=1672006-08-03 오후 4:06:18
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.12.1 리눅스 노트
바이너리 릴리즈는 -static으로 링크되어 있는데, 이것은 여러분이 지금 가지고 있는 시스템 버전이 무엇인지 걱정을 하지 않아도
2.12.1.1 리눅스 OS 노트
된다는 것을 의미한다. 리눅스 쓰레드를 설치할 필요도 없다. -static으로 링크된 프로그램은 동적으로 링크된 것보다 파일 크기가
2.12.1.2 리눅스 바이너리 배포판 노트
다소 크긴 하지만, 3~5%정도 빠르게 동작한다. 하지만, 정적으로 링크된 프로그램이 갖는 한가지 문제점은 사용자 정의 함수
2.12.1.3 리눅스 소스 배포판 노트
(UDFs)를 사용할 수 없다는 것이다. 만약에 UDF를 작성 하거나 사용하고자 할 경우라면(C 또는 C++ 프로그래머에만 해당될
2.12.1.4 리눅스 설치후 과정 노트
수 있음), 여러분 스스로 동적 링크를 사용해서 MySQL을 컴파일 해야 한다.
2.12.1.5 리눅스 x86 노트
2.12.1.6 리눅스 SPARC 노트 libc (레드햇 4.x 또는 Slackware)를 사용하는 구형 리눅스 시스템에서 바인너리 배포판을 사용할 때에는, 호스트 이름에 관련하
2.12.1.7 리눅스 Alpha 노트 여 몇 가지 문제점들(non-fatal)이 있다고 알려져 있다. 시스템이 glibc2를 사용하지 않고 libc를 사용할 경우에는, 호스트 이름 해
2.12.1.8 리눅스 PowerPC 노트 결 및 getpwnam()에서 문제를 느낄 것이다. 이것은 glibc (불행하게도)가 –static를 가지고 컴파일 한다고 하더라도, 몇몇 외부
2.12.1.9 리눅스 MIPS 노트 라이브러리를 사용해서 호스트 이름 해결 및 getpwent()를 처리하기 때문이다. 이러한 문제들은 두 가지 방식으로 표현된다:
2.12.1.10 리눅스 IA-64 노트
● 여러분이 mysql_install_db를 구동시키면 아래와 같은 에러를 보게된다:
여러분은 이것을 mysql_install_db –force를 가지고 처리할 수 있는데, 이것은 mysql_install_db에서 resolveip 테스트
를 실행하지 않게 한다. 이런 하향 지원으로 인해 여러분은 그랜트 테이블에서 호스트 이름을 사용할 수 없게 된다:
localhost을 사용하지 않고, 대신에 IP 번호를 사용해야 한다. –force를 지원하지 않는 구형 MySQL버전을 사용하
고 있다면, 텍스트 편집기를 사용해서 수동으로 mysql_install 에 있는 resolveip 테스트를 삭제해야 한다.
이 문제를 해결하기 위해서는, mysqld을 실행할 때 --user 옵션을 사용하지 말고 su 명령어를 사용한다. 이것은 시스템
자체가 mysqld 프로세스의 사용자 ID를 변경 시켜서 mysqld이 그 일을 할 필요가 없게 만들어 준다.
어떤 리눅스 2.2. 버전에서는, 클러이언트가 TCP/IP를 통해 mysqld 서버에 새로운 접속을 수없이 진행할 때 ‘Resource
temporarily unavailable’라는 에러가 생기기도 한다. 이 문제는 여러분이 TCP/IP소켓을 닫는 시간과 시스템이 실제로 이것을
사용 가능하게 만드는 시간 사이에 차이가 발생하기 때문이다. 예를 들면, TCP/IP를 통해 MySQL test-connect 벤치 마크를 실
행하면 에러가 발생하게 된다
우리는 여러 가지 방법을 통해 이 문제를 해결하고자 하고 있지만, 아직은 적절한 해결책을 찾지는 못하고 있는 상황이다. 유일한
해결책은 클라이언트가 계속적으로 접속을 시도하거나, 또는 데이터베이스 서버와 클라이언트를 동일 장비에서 구동 시킬 경우에
는, TCP/IP 접속을 사용하지 않고 유닉스 소켓 파일 접속을 사용하는 것이다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.12. OS 관련 노트 이 장에서는 여러분이 스스로 MySQL을 설치하는 경우에만 적용되는 glibc 에 관련된 내용을 설명하기로 한다. 만약에 x86머신에
2.12.1 리눅스 노트 서 리눅스를 사용하고 있다면, 대부분의 경우에는 우리가 제공하는 바이너리를 사용하는 것이 더 좋을 것이다. 우리는 우리가 얻을
2.12.1.1 리눅스 OS 노트 수 있는 최신의 glibc 버전을 최상의 컴파일 옵션을 가지고 바이너리 배포판에 링크를 해서 고부하 서버에서 적용될 수 있도록 만들
었다. 일반적인 사용자의 경우에는, 비록 많은 수의 동시 접속의 설정하거나 최대 테이블 크기가 2GB를 초과한다고 하더라도, 대부
2.12.1.2 리눅스 바이너리 배포판 노트
분의 경우에 우리가 제공하는 바이너리를 사용하는 것이 최선의 방법이다. 이 장을 모두 읽고 난 후에, 아직도 어떤 것을 사용할 지
2.12.1.3 리눅스 소스 배포판 노트
결정하지 못한 사용자일 경우에는, 우선 우리가 배포한 바이너리를 사용해서 원하는 기능을 제공하는지 판단해 보길 권장한다. 우
2.12.1.4 리눅스 설치후 과정 노트
리의 배포판이 만족스럽지 못할 경우에는, 스스로 구축해 보고 싶은 마음이 생길 것이다.
2.12.1.5 리눅스 x86 노트
2.12.1.6 리눅스 SPARC 노트
MySQL는 리눅스에서 리눅스 쓰레드를 사용한다. 여러분이 glibc2를 갖고 있지 않는 구형 리눅스를 사용하고 있다면, MySQL을
2.12.1.7 리눅스 Alpha 노트
컴파일하기 전에 우선 리눅스쓰레드를 설치해야 한다. 리눅스 쓰레드는 http://dev.mysql.com/downloads/os-linux.html에서 얻
2.12.1.8 리눅스 PowerPC 노트 을 수 있다.
2.12.1.9 리눅스 MIPS 노트
2.12.1.10 리눅스 IA-64 노트 버전 2.1.1을 포함한 이전의 glibc는 pthread_mutex_timedwait()를 구현하는데 있어서 치명적이 에러를 가지고 있는데, 이것은
INSERT DELAYED 명령문이 실행될 때 나타난다. glibc를 업그레이드 하기 전에는 INSERT DELAYED를 사용하지 말 것을 권
장한다.
리눅스 커널과 리눅스쓰레드 라이브러리는 디폴트로 최대 1,024개의 쓰레드를 처리한다는 점을 알아두기 바란다. 1,000개 이상
의 동시 접속을 하고자 계획한다면, 리눅스 쓰레드에 대해서 아래와 같이 몇 가지 변경을 해두어야 한다:
MySQL의 성능을 현저하게 저하 시키는 또 다른 문제가 있는데, 특히SMP시스템에서 이러한 것들이 발생한다. glibc 2.1에 있는
리눅스쓰레드에서의 mutex 구현은 수많은 쓰레드가 매우 짧은 시간 동안만 mutex를 실행하는 프로그램에 대해서는 매우 좋지 않
은 성능을 내게 된다. 이것은 역설적인(paradoxical) 결과를 만들어낸다: 여러분이 MySQL을 수정하지 않은 리눅스쓰레드에 링
크 한다면, SMP에서 프로세서를 삭제하는 것이 많은 경우에 실제적으로 MySQL의 성능을 향상 시킨다. 우리는 glibc 2.1.3에서
사용 가능한 패치를 만들어 놓았다 (http://www.mysql.com/Downloads/Linux/linuxthreads-2.1-patch).
glibc 2.2.2에서는, MySQL은 개선된 mutex를 사용하는데, 이것은 2.1.3에 패치를 한 것 보다 더 우수한 성능을 보여준다. 하지
만, 우리가 경고를 하였듯이, 어떤 환경에서는 2.2.2에 있는 현재의 mutex코드는 오버 스핀(overspin)을 하기 때문에, MySQL의
성능을 저하시킨다. 이러한 경우는 mysqld 프로세스를 최고의 우선 순위로 변경시키면 많이 발생하지가 않는다. 우리는 또한 이러
한 오버 스핀을 해소할 수 있는 패치를 제공하고 있으며, http://www.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch
에서 찾을 수 있다. 이 패치는 오버스핀의 해결, 쓰레드의 최대 숫자, 그리고 스택 스페이싱(stack spacing)을 하나로 묶어서 제공
한다. 이것은 linuxthreads 디렉토리에 patch -p0 </tmp/linuxthreads-2.2.2.patch로 적용한다. 우리는 이 패치가 향후에 2.2.
릴리즈에 포함되어 제공되길 기대한다. 어떤 경우이건, 여러분이 glibc 2.2.2에 링크를 한다면, 여전히 STACK_SIZE 과
PTHREAD_THREADS_MAX를 해결해야 한다. 우리는 향후에 고 부하(high-load)MySQL에 보다 잘 적용될 수 있는 디폴트 값
이 제공되길 기대하며, 이에 따라 여러분 스스로 ./configure; make; make install을 구축하려는 수고가 많이 절감되길 바란다.
우리는 여러분이 이러한 패치들을 사용해서 libpthread.a 의 특별한 정적(static) 버전을 구축하고 MySQL에 정적으로만 링크할
때 사용하길 권장한다. 우리는 이러한 패치들이 MySQL에서 안정적으로 동작되고 상당한 수준의 성능 개선을 만든다는 것을 알고
있지만, 다른 어떤 어플리케이션에 무슨 영향을 미치는지에 대해서는 정확히 말할 수 없다. 리눅스쓰레드를 요구하는 다른 어플리
케이션을 패치가 된 정적 라이브러리 버전과, 또는 패치가 된 공유 버전과 링크를 하고 이것을 시스템에 설치하고자 한다면, 이에
대한 위험은 여러분 스스로 책임져야 한다.
MySQL을 설치하는 동안, 또는 일반 유틸리티를 다루면서 어떤 이상한 문제를 발견하게 되는 경우는, 그런 문제들은 라이브러리
또는 컴파일러와 연관된 것들일 것이다. 이러한 경우가 발생하면, 우리가 제공하는 바이너리를 사용해서 문제를 해결하기 바란다.
만약에 여러분 스스로의 MySQL클라이언트 프로그램을 링크하는 경우에는, 런타임 때에 아래와 같은 에러를 볼 수도 있을 것이
다:
후지쯔 컴파일러(fcc/FCC)를 사용한다면, MySQL을 컴파일 할 때 몇 가지 문제가 발생할 수 있는데, 그 이유는 리눅스 헤더 파일
이 gcc와 매우 밀접하게 관련이 있기 때문이다. 이때에는 아래의 configure 라인을 fcc/FCC과 함께 사용해야 한다:
-DCONST=const -DNO_STRTOLL_PROTO" ₩
'-D_EXTERN_INLINE=static __inline'" ₩
./configure ₩
--prefix=/usr/local/mysql --enable-assembler ₩
--with-mysqld-ldflags=-all-static --disable-shared ₩
--with-low-memory
제목검색
2. MySQL 설치 및 업그레이드 하기
2.12. OS 관련 노트 mysql.server 는 MySQL설치 디렉토리 밑에 있는 support-files 디렉토리 또는 MySQL 소스 트리에서 찾을 수 있다. 여러분은
2.12.1 리눅스 노트 이것을 /etc/init.d/mysql 형태로 설치하여 자동으로 MySQL 스타트업 및 셧 다운을 하도록 할 수 있다. Section 2.9.2.2, “자동
여러분이16MB 이사의 메모리를 갖고 있다면, 여러분의 초기 스크립트에 아래와 같은 것들을 추가해야 한다(예를 들면, 수세 리눅
스에서는 /etc/init.d/boot.local):
또한 root 사용자로서 명령어 라인에서 echo 명령어를 구동시킬 수는 있지만, 나중에 컴퓨터를 재 구동 시킬 때 시간만 허비하게
만든다.
대신에, 여러분은 sysctl 툴을 사용해서 스타트업 파일에 이러한 파라미터들을 설정할 수 있는데, 이런 방법은 많은 수의 리눅스 배
포판에서 사용하는 방법이다(수세 리눅스 8.0 및 이후 버전 포함). 아래의 값들을 /etc/sysctl.conf라는 이름의 파일에 추가한다:
fs.file-max = 65536
fs.dquot-max = 8192
fs.super-max = 1024
[mysqld_safe]
open-files-limit=8192
여러분 스스로 MySQL을 설정 한다면, 스택을 보다 잘 활용할 수 있도록 리눅스쓰레드를 패치할 수 있다. Section 2.12.1.3, “리
눅스 소스배포판 노트”를 참조할 것. 리눅스쓰레드를 패치하고 싶지 않다면, max_connections가 500 보다 크지 않도록 설정해
야 한다. 이것은 여러분이 대용량 키 버퍼, 대용량 데이터 테이블, 또는 mysqld에 많은양의 메모리를 할당해 주는 다른 어떤 것을
갖고 있다 하더라도, 또는 여러분이 2GB의 패치와 함께 2.2.커널을 구동 시키고 있다고 하더라도 마찬가지 인다. 우리가 제공하는
바이너리 또는 RPM 버전을 사용 중이라면, 여러분은 대량의 데이터를 가진 대용량 키 버퍼 또는 테이블이 없다는 가정하에 안심하
고 max_connections 를 1500으로 설정할 수가 있다. 리눅스쓰레드에서 STACK_SIZE의 크기를 줄이면 줄일수록 여러분은 쓰레
드를 더 안정적으로 생성할 수 있게 된다. 우리는 128KB 와256KB 사이의 값을 권장한다.
여러분이 많은 수의 동시 접속을 사용한다면, 아마도 2.2. 커널이 갖고 있는 “특성”인 프로세스 포킹(forking) 또는 클론닝
(cloning)을 방해하는 기능 때문에 곤란을 겪을 것이다. 이것으로 인해 MySQL은 동시 클라이언트의 숫자를 확장할 수가 없게 된
다. 단일-CPU 시스템에서, 우리는 매우 느린 속도의 쓰레드 생성을 경험하였다; MySQL에 접속하는데에 많은 시간이 걸리게 되
며(1분 정도 소요됨), 또한 셧 다웃을 할 때에도 마찬가지로 오래 걸린다. 다중-CPU 시스템에서는, 클라이언트의 수가 늘어날수
록 쿼리의 속도가 점진적으로 느려진다는 것을 경험했다. 해결책을 찾는 과정에서, 우리는 이러한 문제를 자신의 사이트에서 해결
한 사용자로부터 패치를 받게 되었다. 이 패치는 http://www.mysql.com/Downloads/Patches/linux-fork.patch에서 얻을 수 있
다. 우리는 이 패치가 아무런 문제를 발생시키지 않고 MySQL의 성능을 향상시킨다는 것을 테스트를 통해 알게 되었기 때문에 2.2.
커널에서 고 부하 서버를 구동시키는 사용자들이 이것을 사용할 것을 권장한다.
이 문제는 2.4커널에서는 해결이 되었기 때문에, 만약에 여러분이 아직도 현재의 성능에 만족을 느끼지 못한다면, 2.2 커널을 패치
하기 보다는 2.4 커널로 업그레이드하는 것이 훨씬 쉬울 것이다. SMP시스템에서는, 업그레이드를 통해 버그 패치뿐만 아니라 보
다 나은 성능 개선을 제공 받을 것이다.
우리는 MySQL을 2.4 커널과 2 CPU 머신에서 테스트 하였으며, MySQL이 보다 개선되었음을 알게 되었다. 클라이언트 1,000개
까지는 쿼리 처리율(throughput)에서 어떠한 감소 현상도 없었으며, MySQL 성능 요소는 180%까지 증가하였다. 우리는 4-
CPU 시스템에서도 비슷한 결과를 얻었다: 클라이언트 1,000개 까지는 쿼리 처리율(throughput)에서 어떠한 감소 현상도 없었으
며, MySQL 성능 요소는 300%까지 증가 하였다. 이러 결과를 근거로, 2.2 커널을 사용하는 고 부하 SMP서버에 대해서는, 결론적
으로 2.4커너로 업그레이드를 할 것을 권장하는 것이다.
우리는 mysqld 프로세스를 2.4 커널에서 동작 시킬 때에는 가능한 한 최고의 우선 순위를 가지고 진행하는 것이 최대의 성능을 얻
는데 필수적이라는 것을 알게 되었다. 이것은 renice -20 $$ 명령어를 mysqld_safe에 추가해서 진행하면 된다. 4-CPU 시스템
에서 진행한 우리의 테스트에서, 우선 순위를 증가 시킴으로써 60%의 처리율 개선 효과를 400개 클라이언트까지 볼 수 있었다.
블을 가지고 있음을 의미하는 것이다. Section A.4.2, “What to Do If MySQL Keeps Crashing”를 참조할 것.
mysqld 이 SIGSEGV 라는 시그널을 가지고 죽어 있을 경우에 리눅스에서 코어 덤프를 하기 위해서는, mysqld 을 --core-file
옵션을 가지고 시작한다. ulimit -c 1000000를 mysqld_safe에 추가해서 코어 파일의 크기를 늘려야 하거나, 또는 mysqld_safe
를 --core-file-size=1000000을 가지고 시작해야 한다는 것을 알아 두기 바란다. Section 5.4.1, “mysqld_safe — MySQL
서버 스타트업 스크립트”를 참조할 것.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.12. OS 관련 노트 MySQL은 libc 5.4.12 또는 그 이상의 버전을 요구한다. 현재까지는 libc 5.4.46과 구동이 잘 되는 것으로 알려져 있으며, glibc
2.12.1 리눅스 노트 2.0.6 과 이후 버전과도 잘 동작하고 있다. 하지만, 레드헷이 제공하는 glibc RPM과는 몇가지 문제가 있는데, 만약에 이럴 경우에
2.12.1.1 리눅스 OS 노트 는, 업데이트 사항을 검토하기 바란다. glibc 2.0.7-19 과2.0.7-29 RPM은 잘 구동되는 것으로 알려져 있다.
/usr/include/sched.h file.
mysqld.cc -o objs-thread/mysqld.o
Mysqld이 시작될 때마다 코어를 덤프한다면, 이것은 여러분이 구형 /lib/libc.a를 가지고 있기 때문에 발생되는 문제이다. 이것을
재 명명(rename)하고, 그 다음에 sql/mysqld를 삭제하고 새로운 make install 을 한 다음에 다시 실행한다. 이 문제는 슬랙웨어
(Slackware)를 설치할 때 발생된다고 보고되고 있다.
Mysqld을 링크할 때 아래와 같은 에러가 발생하면, 이것은 여러분이 사용하는libg++.a 가 제대로 설치되지 않았다는 것을 의미하
는 것이다:
제목검색
2.12. OS 관련 노트
2.12.1 리눅스 노트
2.12.1.1 리눅스 OS 노트
2.12.1.2 리눅스 바이너리 배포판 노트
2.12.1.3 리눅스 소스 배포판 노트
2.12.1.4 리눅스 설치후 과정 노트
2.12.1.5 리눅스 x86 노트
2.12.1.6 리눅스 SPARC 노트
2.12.1.7 리눅스 Alpha 노트
2.12.1.8 리눅스 PowerPC 노트
2.12.1.9 리눅스 MIPS 노트
2.12.1.10 리눅스 IA-64 노트
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=12&scate=1&idx=1762006-08-03 오후 4:06:33
:::MySQL Korea:::
제목검색
2.13. Perl 설치 노트
상위메뉴리스트 ◆
2.13.1 유닉스에 Perl 설치하기 MySQL을 지원하는 Perl은 DBI/DBD 클라이언트 인터페이스의 형태로 제공된다. 이 인터페이스는 Perl 5.6.1 또
2.13.2 윈도우에 ActiveState Perl 설치하기 는 이후 버전을 요구한다. 여러분이 구형 Perl버전을 가지고 있다면 구동이 되지 않을 것이다.
2.13.3 Perl DBI/DBD 인터페이스를 사용하는데 있어서의 문제점 Perl DBI 트랜젝션을 사용하고자 한다면, DBD::mysql 버전 1.2216 또는 이후 버전이 필요하게 된다. DBD::
mysql 2.9003 도는 이후 버전을 권장한다.
MySQL 4.1 또는 이후 버전의 클라이언트 라이브러리를 가지고 있다면, DBD::mysql 2.9003 또는 이후 버전을 사
용해야 한다.
Perl에 대한 지원은 MySQL 배포판에는 포함되어 있지 않다. 여러분은 필요한 유닉스에 모듈은 http://search.
cpan.org 에서 얻을 수 있으며, 또는 윈도우에서 ActiveState ppm 프로그램을 사용해서 얻을 수 있다. 다음의 섹
션에서는 이것을 어떻게 사용하는지에 대해 설명하기로 한다.
Perl support for MySQL을 위한 Perl 지원은 여러분이 MySQL벤치마크 스크립트를 구동시키고자 한다면 반드
시 설치 되어 있어야 한다. Section 7.1.4, “MySQL 벤치마크 슈트”를 참조할 것.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=2&mcate=13&scate=0&idx=1882006-08-03 오후 4:06:50
:::MySQL Korea:::
제목검색
2. MySQL 설치 및 업그레이드 하기
2.13. Perl 설치 노트 MySQL의 Perl 지원은 여러분이 MySQL클라이언트 프로그래밍 지원을 설치해 둘 것을 요구한다(라이브러리 및 헤더 파일들). 대
2.13.1 유닉스에 Perl 설치하기 부분의 설치 방법들은 필요한 파일들을 설치한다. 하지만, 리눅스에서 RPM으로 MySQL을 설치한 경우라면, 여러분이 개발자
(developer) RPM을 설치했는지 확인하기 바란다. 클라이언트 프로그램은 클라이언트 RPM에 있지만, 클라이언트 프로그래밍 지
원은 개발자 RPM에 들어 있다.
Perl 지원을 설치하고자 한다면, 여러분은 필요한 파일들을 http://search.cpan.org에 있는 CPAN (Comprehensive Perl
Archive Network)에서 찾을 수가 있다.
유닉시에 Perl 모듈을 설치하는 가장 쉬운 방법은 CPAN 모듈을 사용하는 것이다. 예를 들면:
DBD::mysql 설치는 많은 수의 테스트를 구동 시킨다. 이러한 테스트들은 디폴트 사용자 이름과 패스워드를 사용해서 로컬
MySQL서버에 접속을 시도한다. (디폴트 사용자 이름은 여러분이 유닉스에서 로그인한 이름이며, 윈도우에서는 ODBC이다. 디폴
트 패스워드는 “no password”이다.) 만약에 이러한 값들을 가지고 서버에 접속하는데 실패한다면(예를 들면, 계정에 패스워드
가 설정되어 있다면), 테스트는 실패하게 된다. 이때에는 force install DBD::mysql 를 사용해서 실패한 테스트를 무시하도록 한
다.
DBI는 Data::Dumper 모듈을 필요로 한다. 이 모듈은 아마도 설치되어 있을 것이다; 만약에 설치되지 않았다면, 여러분은 DBI을
설치하기 전에 이것을 설치해 두어야 한다.
압축 tar 아카이브 형태로 모듈 배포판을 다운 로드해서 수동으로 설치하는 것도 가능하다. 예를 들면, DBI 베포판을 풀어서 설치
를 한 다음에, 아래의 과정을 진행한다:
4. shell> cd DBI-VERSION
7. shell> make
make test 명령어는 중요한데, 왜냐하면 이 명령어가 모듈이 제대로 동작하는지를 검증을 하기 때문이다. DBD::mysql을 설치하
는 동안 이 명령어가 인터페이스 코드를 실행하도록 구동시키면, MySQL 서버는 구동될수 도 있지만 테스트가 실패할 수도 있다
는 점을 알기 바란다.
여러분이 새로운 릴리즈의 MySQL을 설치할 때마다, 특히 여러분이 MySQL을 업그레이드한 후에 모든 DBI 스크립트가 실패하는
것을 보게 될 경우에는, DBD::mysql 배포판을 항상 재 설치하고 재 구축하는 것이 바람직한 일이다.
여러분이 시스템 디렉토리에 Perl 모듈을 올바르게 설치하기 위한 접속 권한을 갖고 있지 않거나 또는 로컬 Perl 모듈을 설치하고
싶을 경우에는, 아래의 레퍼런스가 도움이 많이 될 것이다: http://servers.digitaldaze.com/extensions/perl/modules.
html#modules
“Installing New Modules that Require Locally Installed Modules.”라는 제목의 내용을 잘 살펴보기 바란다.
제목검색
2. MySQL 설치 및 업그레이드 하기
2.13. Perl 설치 노트 윈도우에서는, MySQL DBD 모듈을 ActiveState Perl과 함께 설치하기 위해서는 아래의 과정을 따라서 해야 한다:
4. set HTTP_proxy=my.proxy.com:3128
6. C:₩> C:₩perl₩bin₩ppm.pl
10. install ₩
11. ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd
만약에 위의 과정이 제대로 진행되지 않으면, 대신에 MyODBC 드라이버를 설치하고 ODBC를 통해 MySQL 서버에 접속한
다:
use DBI;
$dbh= DBI->connect("DBI:ODBC:$dsn",$user,$password) ||
제목검색
2. MySQL 설치 및 업그레이드 하기
2.13. Perl 설치 노트 만약에 Perl이 ../mysql/mysql.so 모듈을 찾을 수 없다면, 문제는 아마도 Perl이 libmysqlclient.so 공유 라이브러리를 가져오지
2.13.3 Perl DBI/DBD 인터페이스를 사용하는데 못했기 때문일 것이다. 여러분은 아래에 열거된 방법중에 하나를 가지고 이 문제를 해결해야 한다:
있어서의 문제점
● DBD::mysql 배포판을 컴파일 할 때, perl Makefile.PL 를 사용하지 말고, perl Makefile.PL -static -config 를 사용한
다.
● libmysqlclient.so 를 여러분의 다른 공유 라이브러리가 저장되어 있는 디렉토리에 복사 한다(아마도 /usr/lib 또는 /lib).
● Modify used to compile DBD::mysql을 컴파일할 때 사용하는 -L 옵션을 수정해서 libmysqlclient.so의 실제 위치를 반
영하도록 만든다.
● 리눅스에서는, libmysqlclient.so 가 저장되어 있는 디렉토리의 경로 이름을 /etc/ld.so.conf 파일에 추가 한다.
● libmysqlclient.so 가 저장되어 있는 디렉토리의 경로 이름을 LD_RUN_PATH 환경 변수에 추가 한다. 어떤 시스템에서는
이것 대신에 LD_LIBRARY_PATH 를 사용하기도 한다.
만약에 링커가 찾는데 실패하는 다른 라이브러리가 있다면 -L 옵션을 수정할 필요도 있다는 점을 알기 바란다. 예를 들면, 링커
가 /lib 에 있고 링크 명령어가 -L/usr/lib /lib를 지정하고 있기 때문에 libc 를 찾는데 실패하면, -L 옵션을 -L/lib 로 변경하거나
또는 -L/lib 를 존재하는 링크 명령어에 추가한다.
DBD::mysql에서 아래와 같은 에러를 보게 되면, 여러분은 아마도 gcc 를 사용하고 있는 것이다(또는 gcc로 컴파일된 구형 바이너
리들을 사용하는 것이다):
할 때 mysql.so 에 대해서 make가 만드는 결과를 검사한다). -L 옵션은 여러분의 시스템에 libgcc.a 이 저장되어 있는 디렉토리
의 경로 이름을 지정해 주어야 한다.
이 문제에 대한 다른 원인은 Perl과 MySQL이 모두 gcc로 컴파일 되지 않았다는 것을 의미할 수도 있다. 이와 같은 경우에는, 두
가지 모두를 gcc를 가지고 컴파일해서 불일치 되는 문제를 해결하면 된다.
t/00base............install_driver(mysql) failed:
이것은 -lz 암축 라이브러리를 링크 라인에 포함시킬 필요가 있음을 의미하는 것이다. 이것은 lib/DBD/mysql/Install.pm에 있는
아래의 라인을 변경해서 해결할 수 있다:
이렇게 한 후에, 여러분은 반드시 make realclean 를 실행해야 하고 그 다음에는 처음부터 설치 과정을 진행한다.
제목검색
상위메뉴리스트 ◆
Chapter 3. 사용 설명서
3. 사용 설명서 3.1. 서버에 접속하기 및 접속 종료하기
3.6.2 특정 컬럼의 최대값을 갖고 있는 줄(Row) 이 장에서는 mysql 클라이언트 프로그램을 사용해서 간단한 데이터 베이스를 만들고 사용하는 방법을 보여 줌으
3.6.3 그룹별 최대 컬럼 수(Maximum of Column per Group) 로써 MySQL의 사용법을 설명하기로 한다. mysql (때에 따라서 “terminal monitor” 또는 그냥
3.6.4 특정 필드의 그룹 와이즈(Group-wise) 최대값을 갖는 줄 “monitor”로 불리기도 함)은 여러분이 MySQL서버에 연결하고, 쿼리를 구동 시키고, 결과를 볼 수 있도록 하
여 주는 쌍방향(interactive)프로그램이다. mysql은 배치(batch)모드에서도 사용할 수 있다: 여러분은 쿼리를
3.6.5 사용자 정의 변수 사용하기(Using User-Defined Variables)
파일 안에 미리 만들어 놓고, mysql이 이 파일의 내용을 실행하게끔 할 수 있다. 여기에서는 이러한 두 가지의
3.6.6 외국어 키(Foreign Keys) 사용하기
mysql 사용 방법에 대해 설명하기로 한다.
3.6.7 두 개의 키(Two Keys)상에서 검색
3.6.8 일별 방문자수 계산하기(Calculating Visits Per Day)
mysql에서 사용할 수 있는 옵션의 종류를 보기 위해서는, --help 과 함께 이것을 호출하면 된다:
3.6.9 AUTO_INCREMENT사용하기
3.7 쌍둥이 프로젝트에서의 쿼리(Queries from the Twin Project) shell> mysql --help
3.8 아파치와 함께 MySQL 사용하기
이 장에서는 mysql 이 여러분의 머신에 설치되어 있고, 여러분은 MSQL 서버에 연결할 수 있다고 가정한다. 만
약에 이러한 상황이 아니라면, MySQL관리자에게 연락을 해서 위의 가정이 이루어 지도록 해야 한다. (여러분
이 관리자의 입장이라면, 이 설명서의 관련 부분을 잘 숙지하고 있어야 한다. Chapter 5, 데이터 베이스 관리.를
참조할 것)
이 장에서는 데이터 베이스를 설정하고 사용하는 전체 과정에 대해 설명을 한다. 만약에 현재 있는 데이터 베이
스에 접속하는 부분에 대해서만 관심이 있다면, 데이터 베이스 및 테이블 생성 방법에 대한 부분은 건너 띄어도
된다.
제목검색
상위메뉴리스트 ◆
3.1. 서버에 접속 하기와 접속 종료하기
3. 사용 설명서
서버에 연결하기 위해서는, mysql을 호출할 때 보통은 서버의 사용자 이름과 패스워드를 넣어주어야 한다. 만약에 여러분이 로그
3.1. 서버에 접속 하기와 접속 종료하기
인 한 서버가 아닌 머신에서 서버가 구동 된다면, 호스트 이름도 같이 지정해 주어야 한다. 어떤 파라미터를 사용해서 서버에 연결
3.1 서버에 접속 하기와 접속 종료하기
할 수 있는지는 서버 관리자에게 문의하면 된다(즉, 사용할 수 있는 호스트 이름, 사용자 이름 및 패스위드). 올바른 파라미터 값을
알고 나면, 아래와 같이 서버에 연결할 수 있게 된다:
host 및 user는 여러분의 MySQL서버가 돌아가고 있는 호스트의 이름 과 MySQL 계정에 있는 사용자 이름을 나타낸다. 여러분
이 설정한 것으로 입력하면 된다. ******** 는 패스워드를 말하는 것이다; mysql 이 Enter password: 프롬프트를 나타내면 입력
을 한다.
이렇게 하고 나면, 여러분은 여러 가지의 자료를 보게 되며 mysql> prompt가 뒤따라 나오게 된다:
Type 'help;' or '₩h' for help. Type '₩c' to clear the buffer.
mysql>
여러분이 MySQL이 구동 되고 있는 머신에 로그인을 한다면, 호스트 이름을 생략하고, 간단히 아래와 같이 입력을 하면 된다:
만약에, 로그인을 시도할 때, ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.
sock' (2)과 같은 에러가 나오면, 이것은 해당 MySQL서버의 데몬(유닉스) 또는 서비스(윈도우)가 동작되지 않고 있음을 의미하
는 것이다. 이럴 경우에는 서버 관리자의 도움을 받거나 Chapter 2, MySQL 설치 에서 여러분의 OS에 해당하는 부분을 참조하기
바란다.
로그인 할 때에 종종 나타나는 문제를 해결 하기 위해서는, Section A.2, “Common Errors When Using MySQL
Programs”를 참조하기 바란다.
어떤 MySQL 설치 버전에서는 사용자가 로컬 호스트에서 돌아가는 서버에 익명으로 접속할 수 있도록 하는 것들도 있다. 여러분
이 이런 경우에 해당된 다면, 다른 옵션이 없이도 서버에 연결할 수 있을 것이다:
shell> mysql
서버에 성공적으로 접속을 한 후에는, 언제든지 QUIT (또는 ₩q)을 mysql> 프롬프트에 입력해서 서버와의 연결을 끊을 수 있게
된다:
mysql> QUIT
Bye
이어지는 섹션에서 보여주는 대부분의 예제들은 여러분이 서버에 올바르게 연결되어 있다는 가정을 한다. 이것들은 mysql> 프롬
프트를 통해 이런 상태를 보여 줄 것이다.
제목검색
상위메뉴리스트 ◆
3.2. 쿼리 입력 하기
3. 사용 설명서
이전 섹션에서 설명 하였듯이 여러분은 서버에 연결 되어 있어야 한다. 이렇게 하는 것이 자체적으로는 특정 데이터 베이스를 선택
3.2. 쿼리 입력 하기
한 것은 아니지만, 이 상태로도 충분하다. 이 단계에서는, 테이블을 생성하고, 테이블 속으로 데이터를 넣고, 그리고 테이블에서 데
3.2 쿼리 입력 하기
이터를 가져오는 방법 보다는 쿼리를 만드는 방법에 대해 배우는 것이 보다 중요한 단계가 된다. 이 섹션에서는, mysql 이 어떻게
동작되는지에 대해 여러분이 정확히 알고 있는 몇몇 쿼리를 사용해서, 명령어 입력의 기본 원칙에 대해 설명하기로 한다.
여기에 있는 간단한 명령어는 서버가 현재의 날짜와 버전을 보여주도록 하는 것이다. 여기에 있는 대로 mysql> 프롬프트 다음에
입력을 한 후 엔터키(Enter)를 누른다:
+----------------+--------------+
| VERSION() | CURRENT_DATE |
+----------------+--------------+
| 5.0.7-beta-Max | 2005-07-11 |
+----------------+--------------+
mysql>
• 일반적으로 명령어는 세미콜론을 갖고 있는 SQL명령문으로 구성된다. (세미 콜론이 생략되는 예외적이 경우도 있
다. 앞에서 언급한 QUIT 의 경우가 이 중 하나이다. 다른 것들은 나중에 보기로 한다.)
• 명령어를 입력할 때, mysql은 이 명령어를 서버에 보내서 실행을 하도록 하며 그 결과를 화면에 보여주며, 그 다음에
는 또 다른 mysql> 프롬프트를 보여주어서 다른 명령어를 받아들일 준비가 되었음을 알려준다.
• mysql 은 얼마나 많은 줄을 생성하고 쿼리를 처리하는데 얼마의 시간이 소모되었는지에 대한 정보를 보여 주는데,
이러한 것들은 서버의 성능에 대한 대략적인 정보를 제공해 준다. 이러한 값들은 정확한 값들이 아닌데, 왜냐하면 대략적
인 처리 시간(CPU, 머신 타임이 아님)만을 나타내고, 서버의 로드 및 네트워크의 성능에 영향을 받기 때문이다.(간단히
말해서, “rows in set” 라인은 종종 이 장의 나머지 예제에서는 나타나지 않는다.)
여기에 또 다른 쿼리가 있다. 이 쿼리는 mysql을 간단한 계산기로 사용하는 예를 나타내는 것이다:
+------------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 | 25 |
+------------------+---------+
지금까지 보여진 쿼리들은 상대적으로 간단한, 단일 라인 명령문들이었다. 하나의 라인에 여러 개의 명령문을 입력하는 것도 가능
하다. 각각의 명령문들은 세미콜론으로 구분한다:
+----------------+
| VERSION() |
+----------------+
| 5.0.7-beta-Max |
+----------------+
+---------------------+
| NOW() |
+---------------------+
| 2005-07-11 17:59:36 |
+---------------------+
명령어는 하나의 라인에서만 표현될 필요는 없고, 여러 라인을 필요로 하는 기다란 명령어를 입력하는 것도 문제가 없다. mysql은
여러분이 입력하는 명령문을 입력 라인의 끝으로 구분하는 것이 아니라, 명령문의 끝을 가리키는 세미콜론을 가지고 구분하게 된
다. (다른 말로 표현하자면, mysql는 프리-포맷(free-format) 입력을 수용한다: mysql은 세미콜론이 나타나지 않으면 모든 입
력 라인을 실행하지 않는다.)
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+---------------+--------------+
| USER() | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2005-07-11 |
+---------------+--------------+
이 예문에서, 여러분이 다중 라인 쿼리의 처음 라인을 입력한 후에 프롬프트가 mysql>에서 ->로 변하는 것을 주목하자. 이것은
mysql이 아직 완전한 명령문을 가지지 않았으며 나머지 부분이 입력되기를 기다리고 있다는 것을 나타내는 것이다.
만약에 여러분이 명령어를 입력하는 도중에 입력한 명령어를 실행시키고 싶지 않을 경우, ₩c를 통해 취소 명령을 내릴 수 있다:
mysql> SELECT
-> USER()
-> ₩c
mysql>
여기에서도, 역시 프롬프트의 변화를 주목하자. 프롬프트는 ₩c 이후에 mysql>로 다시 복귀되었으며, mysql은 새로운 명령어를
실행할 준비가 되었음을 나타낸다.
아래의 테이블은 여러분이 볼 수 있는 프롬프트의 형태이며, 각 프롬프트가 의미하는 mysql의 상태를 정리한 것이다:
Prompt Meaning
다중 라인 명령문들은 주로 여러분이 단일 라인 명령문을 입력한 후에 실수로 세미콜론을 입력하지 않을 경우에 일어난다. 이러한
경우에, mysql은 입력 사항이 더 있는지를 기다린다:
->
이러한 일이 일어나면(모든 명령어를 다 입력을 하였지만 -> 프롬프트가 나타나면), 대부분의 경우 mysql은 세미콜론을 기다리
고 있는 것이다. 명령문을 완료하기 위한 세미콜론을 입력하게 되면, mysql은 이를 실행한다:
-> ;
+---------------+
| USER() |
+---------------+
| jon@localhost |
+---------------+
'> 과 "> 프롬프트는 문장을 표현할 때 나타난다(다른 말로 표현하면 MySQL은 문장이 완료되길 기다린다). MySQL에서는, 여러
분은 ‘'’ 또는 ‘"’ 문자를 가지고 문장을 쓸 수 있고(예를 들면, 'hello' 또는 "goodbye"), and mysql은 문장을 여러 개의 라인
에 걸쳐 입력할 수 있게 한다. '> 또는 "> 프롬프트를 보게 되면, 이것은 여러분이 ‘'’ 또는 ‘"’로 시작되는 문장의 입력을 시작
했으나, 아직까지 이 문장을 맺기 위해 나머지 인용 부호를 입력하지 않고 있다는 것을 의미한다. 이것은 종종 실수로 인용 부호를
누락하고 있다는 것을 가리켜 주기도 한다. 예를 들면:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'>
위와 같은 SELECT 명령문을 입력하였다면, Enter를 누르고 결과를 기다린다고 하더라도 아무런 일이 일어나지 않는다. 이 쿼리
가 너무 오래 걸린다고 의심하지 말고, '> 프롬프트가 의미하는 것이 무엇인지를 찾아야 한다. 이 프롬프트는, mysql이 지금 문장
의 완성을 위해 무엇인가를 기다리고 있다는 것을 나타내고 있는 것이다.
이 시점에서, 여러분이 할 수 있는 일은? 가장 간단한 것은 명령을 취소하는 것이다. 하지만, 이와 같은 경우에는 ₩c 만을 입력해
서 종료할 수 없는데, 왜냐하면 mysql은 이것을 문장의 일부분으로 해석하기 때문이다. 이렇게 하는 것 대신에, 문장 종료 문자를
입력하고(mysql이 문장의 끝임을 알게끔), 그 후에 ₩c를 입력한다:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'> '₩c
mysql>
`> 프롬프트는 '> 과 "> 프롬프트와 유사하지만, 여러분이 역방향(backtick-quoted)인용 부호로 시작한 식별자를 완성하지 않
았음을 가리킨다.
'>, ">, 및 `> 프롬프트가 무엇을 의미하는지 알고 있는 것이 중요한데, 왜냐하면 여러분이 실수로 완료(unterminated)가 되지 않
은 문장을 입력한다면, 그 이후의 모든 라인들은- QUIT 을 갖고 있는 문장 포함-mysql에 의해 무시되기 때문이다. 만약에 여러
분이 현재의 명령어를 취소하기 전에 문장 종료용 인용 부호를 입력해야 한다는 것을 모르고 있을 경우에는 특히 혼란을 일으킬 수
있는 사항이다.
제목검색
상위메뉴리스트 ◆
3.3. 데이터베이스 생성 및 사용하기
3. 사용 설명서 3.3.1. 데이터 베이스 생성 및 선택하기
3.3. 데이터베이스 생성 및 사용하기 3.3.2. 테이블 생성하기
3.3.3. 테이블에 데이터 로딩하기
3.3 데이터베이스 생성 및 사용하기
3.3.4. 테이블에서 정보 추출하기
3.3.1 데이터 베이스 생성 및 선택하기
3.3.2 테이블 생성하기
일단 명령어를 입력하는 방법을 알게 되면, 데이터 베이스에 접근할 준비가 되어진 것이다.
3.3.3 테이블에 데이터 넣기
3.3.4 테이블에서 정보를 불러오기 여러분이 집에서 여러 가지의 애완 동물을 기르고 있고 이것들에 대해 여러 가지 정보를 유지하고 싶다고 가정하자.
3.3.4.1 모든 데이터 선택하기 여러분은 테이블을 생성하고 데이터를 넣고 필요한 정보를 읽음으로써 이것을 유지할 수 있게 된다. 이 섹션은 여러분
3.3.4.2 특정 줄 선택하기 이 이러한 것들을 어떻게 할 수 있는지 보여준다:
3.3.4.3 특정 컬럼 선택하기
• 데이터 베이스 생성
3.3.4.5 데이터 계산하기
3.3.4.6 NULL 값을 가지고 작업하기 • 테이블 생성
+----------+
| Database |
+----------+
| mysql |
| test |
| tmp |
+----------+
데이터 베이스 리스트는 여러분이 사용하는 머신에 따라 다르겠지만, mysql과 test 데이터 베이스는 거의 다 포함되
어 있을 것이다. mysql 데이터 베이스는 사용자 접근 권한을 나타내는 것이기 때문에 필요한 것이다. test 데이터 베
이스는 사용자가 무엇을 시험을 해 볼 수 있도록 하기 위해 종종 제공되어지는 것이다.
여러분이 SHOW DATABASES 권한이 없다면 모든 데이터 베이스를 보지는 못할 것이다. Section 13.5.1.3,
“GRANT 신텍스”를 참조할 것.
Database changed
USE는, QUIT과 마찬가지로, 세미콜론을 필요하지 않는다.(이러한 명령문들을 세미콜론으로 종료하는 것도 가능하
기는 하다.) USE 명령문의 사용에는 주의 사항이 하나 있다: 이 명령문은 단일 라인에서만 사용되어야 한다.
여러분은 예제에서와 같이 test 데이터 베이스를 사용할 수 있겠지만, 여러분이 생성한 데이터들은 다른 누군가에 의
해 삭제될 수도 있다. 이러한 이유로, 여러분은 MySQL관리자에게 여러분만의 데이터 베이스를 사용할 수 있는 권한
을 요청해야 할 것이다. 여러분의 menagerie를 호출하고자 한다고 가정하자. 관리자는 다음과 같은 명령어를 실행하
야 할 것이다:
제목검색
상위메뉴리스트 ◆
3.3.1. 데이터 베이스 생성 및 선택하기
3. 사용 설명서
만약에 관리자가 여러분을 위해 권한을 설정할 때 데이터 베이스도 함께 생성을 하였다면, 여러분은 이것을 사용할 수 있게 된 것이
3.3. 데이터베이스 생성 및 사용하기
다. 그렇지 않으면, 여러분 스스로 이것을 생성해야 한다:
3.3.1 데이터 베이스 생성 및 선택하기
유닉스 환경에서는, 데이터 베이스의 이름은 대소 문자를 구분하기 때문에 (SQL 키워드와는 달리), 여러분은 반드시 데이터 베이
스 이름을 menagerie로 해야 한다. Menagerie, MENAGERIE, 또는 다른 변형된 형태를 사용하지 말기 바란다. 이것은 테이블 이
름에서도 동일하다. (윈도우에서는, 이러한 제약이 적용되지 않는다. 하지만, 여러 가지 이유로 인해, 데이터 베이스가 생성될 때 사
용한 문자 크기와 동일한 것을 사용할 것을 권장한다.)
Note: 만약에 데이터 베이스를 생성할 때 ERROR 1044 (42000): Access denied for user 'monty'@'localhost' to database
'menagerie'와 같은 에러가 나온다면, 이것은 여러분 계정이 데이터 베이스를 생성하는데 있어서 충분한 권한이 설정되지 않았음
을 의미하는 것이다. 이럴 경우에는 관리자와 상의를 하거나, Section 5.8, “MySQL 접근 권한 시스템”을 참조하기 바란다.
데이터 베이스 생성은 사용할 데이터 베이스를 선택하지는 않는다; 데이터 베이스를 선택하는 것은 확실하게(explicitly) 한다.
menagerie를 현재의 데이터 베이스로 만들기 위해서는, 이 명령어를 사용한다:
Database changed
여러분의 데이터 베이스가 일단 한번 생성되었다고 하더라도, 이것을 사용하기 위해서는 mysql 세션을 시작할 때마다 이것을 선택
해야 한다. 여러분은 이것을 예제에서 보았듯이 USE 명령문을 사용해서 실행할 수 있다. 다른 방법으로는, mysql 을 호출할 때 명
령어 라인에서 이 데이터 베이스를 선택할 수 있다. 여러분이 입력하고자 하는 연결 파라미터 다음에 데이터 베이스의 이름을 입력
명령어에 있는 menagerie는 여러분의 패스워드가 아니라는 점을 유의한다. 만약에 명령어의 -p 옵션 다음에 패스워드를 넣기를
원하면, 중간에 공간을 두지 말고 입력을 해야 한다(예를 들면, -pmypassword로 해야 하며, -p mypassword처럼 하면 안된
다). 하지만, 패스워드를 명령어 라인에서 입력하는 것은 권장하지 않는데, 왜냐하면 다른 사람들이 여러분의 머신에서 로그인할 경
우에 이 패스워드가 노출될 수도 있기 때문이다.
제목검색
상위메뉴리스트 ◆
3.3.2. 테이블 생성하기
3. 사용 설명서
데이터 베이스를 생성하는 것은 쉽지만, 현재까지는 그 안에 아무것도 없다. SHOW TABLES을 입력하면:
3.3. 데이터베이스 생성 및 사용하기
보다 어려운 부분은 여러분이 데이터베이스의 구조를 어떻게 만들 것인지 결정해야 하는 것이다: 어떤 테이블이 필요하며 그 안에
어떤 컬럼을 넣어야 하는지에 대해 결정해야 한다.
여러분은 애완 동물 각각에 대한 기록을 갖는 테이블을 원한다. 이것을 pet 테이블이라고 부르고, 각 동물의 이름을 갖고 있다. 이
름 자체는 그다지 흥미로운 것은 아니기 때문에 테이블은 이름 이외의 정보를 가져야 한다. 예를 들면, 여러분의 가족 중에 한 명 이
상이 애완 동물을 기르고 있다면, 각 동물의 주인을 나열하고 싶을 것이다. 또한 여러분은 애완 동물의 종자 및 성별과 같은 기본적
인 내용도 기록하고 싶을 것이다.
나이는? 이것은 흥미로운 정보일지 모르겠지만, 이것을 데이터 베이스에 넣는 것은 그리 좋은 일은 아니라고 생각한다. 나이는 시간
이 지나면서 변하는데, 이것은 여러분이 자주 데이터베이스를 업데이트해야 한다는 것을 의미한다. 대신에, 생일과 같은 변하지 않
는 값을 넣는 것이 더 좋다. 그 다음에는, 나이를 기록하고 싶을 때마다, 여러분은 생일과 현재의 날짜의 차이를 계산하기만 하면 된
다. MySQL은 날짜 계산식을 제공하고 있기 때문에 이것을 계산하는 것은 어려운 작업이 아니다. 나이보다는 생일을 저장하는 것
은 여러 가지 다른 장점도 있게 된다:
• 여러분은 현재의 날짜가 아닌 일수(dates)로 나이를 계산할 수 있다. 예를 들면, 데이터베이스에 애완 동물이 죽은
여러분은 이 데이터베이스 테이블에 유용하게 사용될 다른 형태의 정보를 생각할 수 있겠지만, 다음과 같은 것만으로도 충분하자:
name, owner, species, sex, birth, and death.
VARCHAR는 name, owner, 및 species 컬럼용으로는 잘 선택한 것인데, 왜냐하면 컬럼의 값들이 서로 길이가 다르기 때문이다.
이러한 컬럼 정의에서 길이는 모두 같을 필요가 없고, 20이 될 필요도 없다. 여러분 입장에서 가장 적당하다고 생각하는 길이를 1
에서 65535의 사이에서 선택하기만 하면 된다. (Note: MySQL 5.0.3 이전 버전에서는, 최대 한계치는 255 이었다.) 여러분이 처
음에 길이를 잘못 선택하였고 나중에 보다 긴 필드가 필요하게 될 경우에는, MySQL은 ALTER TABLE 명령문을 사용하면 된다.
다른 몇몇 값의 타입들은 애완 동물의 성별을 나타내는 것으로 선택하는데, 'm' 과 'f', 또는 'male' 과 'female'이 될 수도 있다. 단
일 문자 'm' 과 'f'를 사용하는 것이 가장 간편한 방법이다.
+---------------------+
| Tables in menagerie |
+---------------------+
| pet |
+---------------------+
테이블이 여러분이 의도한 방식으로 생성되었는지 검사하기 위해, DESCRIBE 명령문을 사용해 본다:
+---------+-------------+------+-----+---------+-------+
+---------+-------------+------+-----+---------+-------+
+---------+-------------+------+-----+---------+-------+
여러분은 언제든지 DESCRIBE를 사용할 수 있는데, 예를 들면, 테이블에 있는 컬럼의 이름 또는 그 안에 무엇이 있는지를 잊었을
경우에 사용할 수 있다.
MySQL 데이터 타입에 대한 보다 자세한 정보는, Chapter 11, 데이터 타입을 참조하기 바란다.
제목검색
상위메뉴리스트 ◆
3.3.3. 테이블에 데이터 넣기
3. 사용 설명서
테이블을 생성한 다음에는, 여러분은 테이블에 데이터를 넣어야 한다. LOAD DATA 와INSERT 명령문이 이런 작업에서 매우 유
3.3. 데이터베이스 생성 및 사용하기
용하게 사용된다.
3.3.3 테이블에 데이터 넣기
여러분의 애완 동물 기록이 아래와 같다고 가정하자. (MySQL은 날짜를 'YYYY-MM-DD' 포맷으로 다룬다는 것을 주의한다; 이
것은 여러분이 사용하는 방식과 다를 수도 있다.)
여러분은 비어있는 테이블을 가지고 시작하고 있기 때문에, 그 안에 데이터를 넣는 쉬운 방법은 각각의 애완 동물에 대한 줄(row)
을 가지는 텍스트 파일을 만든 다음에, 간단한 명령문을 사용해서 파일의 내용물을 읽어 들여서(load) 테이블에 넣는 것이다.
여러분은 라인 당 하나의 기록을 갖고 있고, 각각의 값들은 탭으로 구분되고, CREATE TABLE 명령문에서 컬럼이 나열된 순서로
되어 있는 텍스트 파일 pet.txt을 만들 수 있다. 누락된 값들에 대해서는(성별을 모르거나 아직 살아 있는 동물에 대한 죽은 날짜
등), NULL 값을 사용하면 된다. 텍스트 파일에서 이러한 것들을 표현하기 위해서는, ₩N (backslash, capital-N)를 사용한다. 예
를 들면, Whistler라는 이름의 새에 대해서는 아래와 같이 보이게 된다:
여러분이 윈도우에서 ₩r₩n 를 라인 터미네이터로 사용하는 에디터를 가지고 파일을 작성하였다면, 아래와 같은 것을 사용해야 한
다:
여러분은 원한다면 컬럼 값 구분자(separator)와 LOAD DATA 명령문에 있는 라인마커의 끝을 지정할 수 있지만, 디폴트는 탭과
라인피드(linefeed)이다. 이것들만 가지고도 파일 pet.txt를 읽기 위한 명령문에서 충분히 사용할 수 있다.
여러분이 한번에 한 개씩 새로운 레코드를 추가하고자 할 때에는, INSERT 명령문이 유용하다. 이 명령문의 간단한 형식 안에,
CREATE TABLE 명령문에서 지정한 컬럼의 순서대로 각 컬럼용 값을 입력하면 된다. 다이안(Diane)이 “Puffball”이라는 이름
의 새로운 햄스터를 얻었다고 하자. 여러분은 아래와 같이INSERT 명령문을 사용해서 새로운 레코드를 추가할 수 있다:
스트링과 날짜 값은 인용부호를 사용해서 지정하였다. 또한, INSERT를 가지고, 여러분은 누락값(missing value)를 나타내는
NULL을 직접 삽입할 수 있다. 하지만, 여러분이 LOAD DATA 에서 사용한 것과 같이 ₩N를 사용할 수는 없다.
예를 들면, 여러분은 간단한 LOAD DATA 명령문을 사용하는 대신에 여러 개의 INSERT 명령문을 사용해서 초기에 레코드를 로
드(load)하는 것을 볼 수 있을 것이다.
제목검색
상위메뉴리스트 ◆
3.3.4. 테이블에서 정보를 불러오기
FROM which_table
WHERE conditions_to_satisfy;
what_to_select 은 여러분이 보고자 하는 것을 가리킨다. 이것은 컬럼의 리스트가 될 수 있고, 또는 * 를 사용하면 “모든 컬
럼”을 나타내기도 한다. which_table은 여러분이 데이터를 가져오고 싶은 테이블이 어떤 것인지를 나타낸다. WHERE 구문은 옵
션이다. 이 구문이 표시되면, conditions_to_satisfy는 한 개 또는 그 이상의 조건문이다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=3&mcate=3&scate=4&idx=2352006-08-03 오후 4:09:32
:::MySQL Korea:::
제목검색
3. 사용 설명서
간단한 형태의 SELECT 명령문은 테이블에서 모든 것을 가져온다:
3.3. 데이터베이스 생성 및 사용하기
+----------+--------+---------+------+------------+------------+
SELECT는 여러분이 전체 테이블을 검토하고자 할 때 유용하게 사용되는 명령문이다. 예를 들면, 여러분은 Bowser의 생일이 틀
리게 입력되었다고 생각할 수 있을 것이다. 수의사의 기록을 살펴보면, 정확한 생일이 1979년이 아니고, 1989이다.
• pet.txt를 편집해서 에러를 수정한 다음, 테이블을 비우고 DELETE 과 LOAD DATA 를 사용해서 이것을 다시 로
드 한다:
제목검색
3. 사용 설명서
바로 전 섹션에서 보았듯이, 전체 테이블을 읽어오는 것은 쉬운 일이다. SELECT 명령문에서 WHERE 구문을 생략한다. 하지만 테
3.3. 데이터베이스 생성 및 사용하기
이블이 매우 큰 것이라면 전체 테이블을 보고 싶지 않을 것이다. 대신에, 여러분은 특정 질문에 대한 대답을 얻는 것이 더욱 흥미를
3.3.4 테이블에서 정보를 불러오기
가질 것인데, 이런 경우에는 여러분이 원하는 정보에 some constraints를 지정할 수 있다. 애완 동물에 관한 질문을 하는 몇 가지
3.3.4.1 모든 데이터 선택하기
선택 쿼리들을 살펴보기로 하자.
3.3.4.2 특정 줄 선택하기
3.3.4.3 특정 컬럼 선택하기 여러분은 테이블에서 특정 줄만 선택할 수 있다. 예를 들면, Bowser의 생일을 변경한 것을 확인해 보고 싶다면, 아래와 같이
3.3.4.5 데이터 계산하기 Bowser의 레코드를 선택한다:
3.3.4.6 NULL 값을 가지고 작업하기
3.3.4.7 패턴 매칭 mysql> SELECT * FROM pet WHERE name = 'Bowser';
3.3.4.8 줄 세기
+--------+-------+---------+------+------------+------------+
3.3.4.9 한 개 이상의 테이블 사용하기
3.3.4.4 줄 정렬하기
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
+--------+-------+---------+------+------------+------------+
스트링 비교는 일반적으로 대소 문자를 구분하지 않기 때문에, 여러분은 이름을 'bowser', 'BOWSER', 및 다른 형식으로 지정할
수 있다. 쿼리의 결과는 동일하게 나온다.
여러분은 이름 컬럼을 제외하고, 다른 어떤 컬럼에 대해서도 조건문을 작성할 수 있다. 예를 들면, 어떤 동물이 1998년에 또는 그
이후에 태어 났는지 알고 싶다면, birth 컬럼을 테스트한다:
+----------+-------+---------+------+------------+-------+
+----------+-------+---------+------+------------+-------+
+----------+-------+---------+------+------------+-------+
mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
+----------+-------+---------+------+------------+-------+
+----------+-------+---------+------+------------+-------+
+----------+-------+---------+------+------------+-------+
AND 및 OR는 서로 혼용해서 사용할 수 있는데, AND가 OR보다 우선 순위가 있다. 이 두 가지 연산자를 모두 사용할 경우, 어떤
조건문이 그룹으로 동작되어야 하는지를 지정하기 위해 괄호를 사용하는 것이 좋다:
mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
제목검색
3. 사용 설명서
테이블에서 전체 줄을 보고 싶지 않을 경우에는, 콤마를 사용해서 보고 싶은 컬럼의 이름만 입력하면 된다. 예를 들면, 여러분의 동
3.3. 데이터베이스 생성 및 사용하기
물들이 언제 태어났는지 보고 싶다, name 과 birth 컬럼을 선택한다:
3.3.4 테이블에서 정보를 불러오기
3.3.4.1 모든 데이터 선택하기 mysql> SELECT name, birth FROM pet;
3.3.4.2 특정 줄 선택하기
3.3.4.3 특정 컬럼 선택하기 +----------+------------+
3.3.4.5 데이터 계산하기
3.3.4.6 NULL 값을 가지고 작업하기 | name | birth |
3.3.4.7 패턴 매칭
+----------+------------+
3.3.4.8 줄 세기
3.3.4.9 한 개 이상의 테이블 사용하기
| Fluffy | 1993-02-04 |
3.3.4.4 줄 정렬하기
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
+--------+
| owner |
+--------+
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Gwen |
| Benny |
| Diane |
+--------+
쿼리는 각 레코드에서 간단하게 owner를 불러오는데, 어떤 사람의 이름은 여러 번 나오게 된다는 것을 주목한다. 이것을 최소화하
기 위해서는 각각의 이름이 딱 한번만 나오도록 하기 위해 DISTINCT를 추가할 수도 있다:
+--------+
| owner |
+--------+
| Benny |
| Diane |
| Gwen |
| Harold |
+--------+
여러분은 WHERE 구문을 사용해서 줄 선택과 컬럼 선택을 서로 묶을 수가 있다. 예를 들면, 개와 고양이들의 생일만 얻기 위해서
는, 아래의 쿼리를 사용한다:
+--------+---------+------------+
+--------+---------+------------+
+--------+---------+------------+
제목검색
3. 사용 설명서
MySQL은 여러분이 날짜를 가지고 나이를 계산하거나 날짜 포맷에서 특정 부분을 추출해 낼 수 있는 여러 가지 함수를 제공해 주
3.3. 데이터베이스 생성 및 사용하기
고 있다.
3.3.4 테이블에서 정보를 불러오기
3.3.4.1 모든 데이터 선택하기 각 동물들이 얼마나 나이를 먹었는지 계산하기 위해서는, 현재의 날짜와 태어난 날짜의 연도의 차이를 계산하고, 그 다음에 현재의
3.3.4.2 특정 줄 선택하기 날짜가 태어난 날짜보다 앞선 날짜면 1을 뺀다. 아래의 쿼리는 각 애완 동물에 대해, 생일, 현재 날짜, 그리고 나이를 보여주고 있
3.3.4.3 특정 컬럼 선택하기 다.
3.3.4.5 데이터 계산하기
3.3.4.6 NULL 값을 가지고 작업하기 mysql> SELECT name, birth, CURDATE(),
3.3.4.7 패턴 매칭
-> (YEAR(CURDATE())-YEAR(birth))
3.3.4.8 줄 세기
3.3.4.9 한 개 이상의 테이블 사용하기
-> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
3.3.4.4 줄 정렬하기
-> AS age
+----------+------------+------------+------+
+----------+------------+------------+------+
+----------+------------+------------+------+
여기에서, YEAR() 는 날짜에서 연도 부분을 가져오고 RIGHT()는 날짜 포맷의 MM-DD (calendar year)을 나타내는 오른 쪽
다섯 숫자를 가져 온다. The part of the expression that compares the MM-DD 값을 비교하는 수식은 1 또는0를 계산하는데,
이것은 만약에 CURDATE()가 birth보다 앞선 일자이면 연도의 차이에서 한 해를 뺀다. 전체 수식은 다소 ungainly하기 때문에,
alias (age)는 보다 의미를 잘 나타내는 결과 컬럼을 만드는데 사용한다.
이 쿼리는 제대로 동작을 하기는 하지만, 만약에 줄이 특정 순서로 표시되어 있다면 보다 쉽게 검사할 수 있을 것이다. 이것은
ORDER BY name 구문을 추가해서 결과가 나올 때 이름으로 정렬하도록 할 수 있다:
-> (YEAR(CURDATE())-YEAR(birth))
-> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
-> AS age
+----------+------------+------------+------+
+----------+------------+------------+------+
+----------+------------+------------+------+
To sort the output rather than name으로 정렬을 하지 말고 age로 결과 값을 정렬하기 위해서는, 다른 ORDER BY 구문을 사용
한다:
-> (YEAR(CURDATE())-YEAR(birth))
-> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
-> AS age
+----------+------------+------------+------+
+----------+------------+------------+------+
+----------+------------+------------+------+
비슷한 쿼리를 사용해서 이미 죽은 동물들의 죽은 나이를 검사할 수 있다. 여러분은 death값이NULL 인지 아닌지를 먼저 검사해
서 죽은 동물이 어느 것인지 검사 한다. 그 다음에 NULL 값이 아닌 동물에 대해, death 와birth 값의 차이를 계산한다:
-> AS age
+--------+------------+------------+------+
+--------+------------+------------+------+
+--------+------------+------------+------+
쿼리는 death <> NULL를 사용하지 않고 death IS NOT NULL를 사용하고 있는데, 그 이유는 NULL이 일반적이 비교 연산자
를 가지고는 비교 연산을 할 수 없는 특별한 값을 가지기 때문이다. 이 점에 대해서는 나중에 논의하기로 한다. Section 3.3.4.6,
“NULL 값을 가지고 작업하기”를 참조할 것.
다음달에 생일이 돌아오는 동물이 어떤 것인지 알고자 할 경우에는 어떻게 야 하는가? 이것을 계산하기 위해서는, 연도와 요일은
관련이 없게 된다; 여러분은 birth 컬럼에서 월(month)부분만을 가져 오면 된다. MySQL은 YEAR(), MONTH(), 및
DAYOFMONTH()와 같이 날짜 부분에서 필요한 부분을 추출해주는 함수를 제공한다. MONTH()는 여러분이 여기에서 원하는 것
을 작업해 준다. 이것이 어떻게 동작하는지 보기 위해, birth 와 MONTH(birth)의 값을 알려주는 간단한 쿼리를 구동시킨다:
+----------+------------+--------------+
+----------+------------+--------------+
| Fluffy | 1993-02-04 | 2|
| Claws | 1994-03-17 | 3|
| Buffy | 1989-05-13 | 5|
| Fang | 1990-08-27 | 8|
| Bowser | 1989-08-31 | 8|
| Chirpy | 1998-09-11 | 9|
| Whistler | 1997-12-09 | 12 |
| Slim | 1996-04-29 | 4|
| Puffball | 1999-03-30 | 3|
+----------+------------+--------------+
앞으로 다가오는 달에 생일이 있는 동물을 찾는 것 역시 쉽다. 지금은 4월이라고 가정하자. 그러면 월(month0값은 4가 되며 여러
분은 아래와 같이 5월에 생일이 있는 동물을 찾아낼 수 있다:
+-------+------------+
| name | birth |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+
지금이 12월이라면 다소 복잡한 일이 생긴다. 여러분은 간단히 숫자 하나를 월(month)값에 더해서 13월에 태어난 동물을 찾을 수
가 없는데, 13월 이라는 달은 없기 때문이다. 대신에 여러분은 1월에 태어난 동물을 찾아야 한다.
지금이 무슨 달인지 상관없는 쿼리를 쓸 수가 있는데, 이렇게 하면 숫자를 사용해서 특정 월을 표시하지 않아도 된다. DATE_ADD
()는 여러분이 시간 간격(interval)을 주어진 날짜에 추가할 수 있도록 해 준다. 여러분이 1달을 CURDATE()의 값에 더하고, 그
다음에 MONTH()를 가지고 월 부분을 가져오고자 한다면, 결과는 생일을 월 부분에서 찾는 작업을 한다:
동일 업무를 실행하는 다른 방법은 만약에 지금이 12라면 월(month)값을 0으로 하기 위해 모듈로(modulo) 함수(MOD) 를 사용
한 후에 1을 더해서 다음달을 계산하면 된다:
MONTH는 1에서 12의 사이 숫자를 리턴한다는 점을 알기 바란다. 그리고 MOD(something,12)는 0 과 11사이의 숫자를 리턴한
다. 따라서 첨가 작업은 MOD() 다음에 해야 하는데, 그렇지 않으면 우리는11월에서 1월로 가게 된다.
제목검색
3. 사용 설명서
NULL값은 개념적으로 본다면, “누락된 알려지지 않은 값(missing unknown value)”을 의미하고 다른 값과는 다소 다르게 취
3.3. 데이터베이스 생성 및 사용하기
급된다. NULL에 대한 테스트를 할 때에는, =, <, 또는 <>과 같은 산순 비교 연산자는 사용할 수 없다. 이것을 실험해 보기 위해,
3.3.4 테이블에서 정보를 불러오기
다음의 쿼리를 시도해 보자:
3.3.4.1 모든 데이터 선택하기
3.3.4.2 특정 줄 선택하기 mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
3.3.4.3 특정 컬럼 선택하기
3.3.4.5 데이터 계산하기 +----------+-----------+----------+----------+
+----------+-----------+----------+----------+
명백히 이러한 비교문을 가지고는 의미 있는 결과를 얻어낼 수 없다. 대신에 IS NULL과 IS NOT NULL 연산자를 사용해 본다:
+-----------+---------------+
+-----------+---------------+
| 0| 1|
+-----------+---------------+
앞의 섹션에서 보았듯이, 어떤 동물이 죽었는지를 판단하기 위한 방법을 death <> NULL가 아닌 death IS NOT NULL로 사용
한 이유가 바로 이러한 NULL의 특별한 성격 때문이다..
ORDER BY를 실행할 때, NULL은 ORDER BY ... ASC를 하면 가장 먼저 나오고 ORDER BY ... DESC를 하면 가장 나중에 나오
는 값이 된다.
NULL을 가지고 작업을 할 때 범하는 일반적인 에러중의 하나는 NOT NULL로 정의된 컬럼에 0 또는 빈 스트링을 삽입하는 것은
불가능하게 생각하는 것이다. 하지만, 그렇지 않다. NULL이 “값을 갖고 있지 않음(not having a value)”을 의미하는 반면에, 이
러한 것들은 분명한 값으로 존재하는 것이다. 여러분은 아래와 같이IS [NOT] NULL을 사용해서 간단히 이것을 테스트 해볼 수 있
다:
mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
+-----------+---------------+------------+----------------+
| 0| 1| 0| 1|
+-----------+---------------+------------+----------------+
따라서 0 또는 빈 스트링을 NOT NULL에 삽입하는 것은 분명히 가능한 작업이다. Section A.5.3, “Problems with NULL
Values”를 참조할 것.
제목검색
상위메뉴리스트 ◆ 3.3.4.7. 패턴 매칭
3. 사용 설명서
MySQL은 유닉스 유틸리티가 사용하는 vi, grep, 및 sed등과 유사한 확장된 규칙 수식(extended regular expression)에 근거한
3.3. 데이터베이스 생성 및 사용하기
패턴 매칭 형식 뿐만 아니라 표준 SQL 패턴 매칭도 함께 제공한다.
3.3.4 테이블에서 정보를 불러오기
3.3.4.1 모든 데이터 선택하기 SQL 패턴 매칭은 ‘_’을 사용해서 단일 문자를 매칭시킬 수 있게 하고 ‘%’ 를 사용해서는 문자(제로 문자 포함)의 arbitrary
3.3.4.2 특정 줄 선택하기 number를 매칭 시킬 수 있게 해 준다. MySQL에서는, SQL 패턴은 디폴트로 대소 문자를 구분하지 않는다. 몇 가지 예문을 보기
3.3.4.3 특정 컬럼 선택하기 로 한다. 주의할 것은 SQL패턴을 사용할 때에는 = 또는 <>는 사용할 수 없다는 것이다; LIKE 또는 NOT LIKE 를 대신 사용한
3.3.4.5 데이터 계산하기 다.
3.3.4.6 NULL 값을 가지고 작업하기
3.3.4.7 패턴 매칭 ‘b’로 시작되는 이름을 찾기 위해서는:
3.3.4.8 줄 세기
mysql> SELECT * FROM pet WHERE name LIKE 'b%';
3.3.4.9 한 개 이상의 테이블 사용하기
3.3.4.4 줄 정렬하기
+--------+--------+---------+------+------------+------------+
+--------+--------+---------+------+------------+------------+
+--------+--------+---------+------+------------+------------+
+--------+--------+---------+------+------------+-------+
+--------+--------+---------+------+------------+-------+
+--------+--------+---------+------+------------+-------+
이름 안에 ‘w’가 있는 것을 찾기 위해서는:
+----------+-------+---------+------+------------+------------+
+----------+-------+---------+------+------------+------------+
+----------+-------+---------+------+------------+------------+
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
패턴 매칭의 다른 형태는 MySQL이 확장된 규칙 수식을 사용할 때 나타난다. 이러한 유형의 패턴 매칭을 테스트 하고자 할 때에
는, REGEXP 과 NOT REGEXP 연산자를 사용한다(또는 RLIKE 과 NOT RLIKE를 사용한다).
확장 규칙 수식이 어떻게 동작을 하는지 보이기 위해, 이전에 사용한 LIKE 쿼리를 REGEXP를 사용하는 수식으로 다시 작성한다.
‘b’로 시작하는 이름을 찾기 위해, ‘^’를 사용해서 패턴에 일치하는 이름을 찾는다:
+--------+--------+---------+------+------------+------------+
+--------+--------+---------+------+------------+------------+
+--------+--------+---------+------+------------+------------+
여러분이 REGEXP 비교문이 대소 문자를 구분하도록 하고자 한다면, BINARY 키워드를 사용해서 바이너리 스트링을 만든다. 이
쿼리는 이름이 소문자 ‘b’로 시작하는 것만을 매치 시킨다:
+--------+--------+---------+------+------------+-------+
+--------+--------+---------+------+------------+-------+
+--------+--------+---------+------+------------+-------+
+----------+-------+---------+------+------------+------------+
+----------+-------+---------+------+------------+------------+
+----------+-------+---------+------+------------+------------+
레귤러 수식 패턴은 테스트가 되는 값에서 매칭을 하기 때문에, 이전의 쿼리에서는 여러분이 SQL 패턴에서 사용한 것과 같이 와일
드카드를 패턴의 양 끝에 넣고 전체 값을 매칭 시키는 것이 불필요하게 된다.
정확히 5개의 문자를 가지고 있는 이름을 찾기 위해서는, ‘^’ 와 ‘$’ 를 패턴의 양쪽 끝에 놓고 중간에 다섯 개의 ‘.’ 인스턴
스를 넣어둔다:
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
+-------+--------+---------+------+------------+-------+
제목검색
상위메뉴리스트 ◆ 3.3.4.8. 줄 세기
3. 사용 설명서
데이터 베이스는 “테이블에서 얼마나 자주 특정 데이터 타입이 일어나는가?”와 같은 물음에 답하기 위해 사용된다. 예를 들면, 여
3.3. 데이터베이스 생성 및 사용하기
러분이 얼마나 많은 동물을 가지고 있는지 또는 각각의 주인들이 몇 마리씩을 키우고 있는지 또는 여러 가지의 다른 종류의 조사를
3.3.4 테이블에서 정보를 불러오기
할 수도 있다.
3.3.4.1 모든 데이터 선택하기
3.3.4.2 특정 줄 선택하기 여러분이 기르고 있는 동물의 수를 계산하는 것은, “pet 테이블에는 몇 개의 줄이 있는가?”를 묻는 것과 같은 질문이다. 왜냐하
3.3.4.3 특정 컬럼 선택하기 면 동물당 한 개의 레코드가 있기 때문이다. COUNT(*)는 줄의 수를 계산하는데, 따라서 쿼리는 아래와 같이 동물의 수를 계산하
3.3.4.5 데이터 계산하기 게 된다:
3.3.4.6 NULL 값을 가지고 작업하기
3.3.4.7 패턴 매칭 mysql> SELECT COUNT(*) FROM pet;
3.3.4.8 줄 세기
+----------+
3.3.4.9 한 개 이상의 테이블 사용하기
3.3.4.4 줄 정렬하기
| COUNT(*) |
+----------+
| 9|
+----------+
앞에서, 여러분은 동물의 주인 이름을 읽어올 수 있었다. 여기에서는 COUNT()를 사용해서 각 주인들이 얼마나 많은 수의 동물을
기르고 있는지를 계산할 수 있게 된다:
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Benny | 2|
| Diane | 2|
| Gwen | 3|
| Harold | 2|
+--------+----------+
GROUP BY는 각 owner의 모든 기록을 그룹화 하기 위해 사용한다는 것을 알아 두기 바란다. 이렇게 하지 않으면, 에러가 발생한
다:
COUNT() 과 GROUP BY는 여러모로 데이터를 특성화 시키는데 유용하다. 아래의 예제들은 다양한 방법으로 동물의 특성을 알
아 보는 방법을 알려 주는 것이다.
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird | 2|
| cat | 2|
| dog | 3|
| hamster | 1|
| snake | 1|
+---------+----------+
성별로 구분한다:
+------+----------+
| sex | COUNT(*) |
+------+----------+
| NULL | 1|
|f | 4|
|m | 4|
+------+----------+
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
+---------+------+----------+
| bird | NULL | 1|
| bird |f | 1|
| cat |f | 1|
| cat |m | 1|
| dog |f | 1|
| dog |m | 2|
| hamster | f | 1|
| snake | m | 1|
+---------+------+----------+
COUNT()을 사용할 때에는 전체 테이블을 읽어 들일(retrieve) 필요가 없다. 예를 들면, 앞의 쿼리에서, 개와 고양이에서만 실행
할 경우, 아래와 같이 보인다:
+---------+------+----------+
+---------+------+----------+
| cat |f | 1|
| cat |m | 1|
| dog |f | 1|
| dog |m | 2|
+---------+------+----------+
+---------+------+----------+
+---------+------+----------+
| bird |f | 1|
| cat |f | 1|
| cat |m | 1|
| dog |f | 1|
| dog |m | 2|
| hamster | f | 1|
| snake | m | 1|
+---------+------+----------+
제목검색
3. 사용 설명서
pet 테이블은 여러분이 기르는 동물의 기록을 유지하고 있다. 여러분이 만약에 이 동물들에 대한 다른 정보들을 기록하고 싶다면,
3.3. 데이터베이스 생성 및 사용하기
여러분은 다른 테이블이 필요하게 된다. 이 테이블은 어떤 모양이 되어야 하는가? 다음의 것이 필요하게 된다:
3.3.4 테이블에서 정보를 불러오기
3.3.4.1 모든 데이터 선택하기
• 각각의 이벤트가 어떤 동물에게 일어났는지 알기 위해서 동물의 이름을 가지고 있을 것.
3.3.4.2 특정 줄 선택하기
• 이벤트가 일어난 날짜를 알기 위한 날짜 기록.
3.3.4.3 특정 컬럼 선택하기
• 이벤트를 기록하기 위한 필드.
3.3.4.5 데이터 계산하기
3.3.4.6 NULL 값을 가지고 작업하기 • 이벤트 타입 필드. 각각의 이벤트를 목록화 하고자 할 경우에 필요함.
3.3.4.7 패턴 매칭
이러한 고려 사항을 가지고, event 테이블을 위한 CREATE TABLE 명령문은 아래와 같이 작성될 것이다:
3.3.4.8 줄 세기
3.3.4.9 한 개 이상의 테이블 사용하기
mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
3.3.4.4 줄 정렬하기
pet 테이블에서와 마찬가지로, 각 정보를 가지고 있는 텍스트 파일에서 초기에 데이터를 읽어 오는 것은 매우 쉬운 일이다:
pet 테이블에서 구동 시켜본 쿼리로부터 배운 것을 토대로 하면, 여러분은 event 테이블 안에 있는 레코드를 불러(retrieval)올 수
있을 것이다; 원리는 똑 같다. 하지만 event 테이블 자체가 여러분이 질문하는 것에 대해 불충분하게 답변을 할 경우에는 어떻게 해
야 하는가?
각 동물이 새끼를 낳았을 때의 나이를 알고 싶다고 가정하자. 앞에서 우리는 두 개의 날짜를 가지고 나이를 계산하는 방법을 본적
이 있다. 어미가 새끼를 낳은 날짜는 even 테이블에 있지만, 어미의 나이를 계산하기 위해서는 생일이 언제인지 알 필요가 있는데,
이 날짜는 pet 테이블에 기록되어 있다. 이것을 쿼리가 두 테이블을 모두 필요로 한다는 것을 의미한다:
-> remark
+--------+------+-----------------------------+
+--------+------+-----------------------------+
+--------+------+-----------------------------+
• 쿼리가 두 테이블 모두에서 정보를 불러와야 하기 때문에 FROM 구문은 두 테이블에서 목록에 가져온다.
• 다중의 테이블에서 정보를 조합(combining)할 때, 여러분은 하나의 테이블에 있는 레코드가 어떻게 다른 테이블에
있는 레코드에 매치되는지를 지정해 주어야 한다. 이것은 쉬운 일인데, 왜냐하면 두 테이블 모두 name 컬럼을 갖고 있기
때문이다. 쿼리는 WHERE 구문을 사용해서 두 테이블에서 name 값을 가지고 레코드들을 비교한다.
• name 컬럼이 두 테이블에 모두 있기 때문에, 참조하고자 하는 컬럼이 어떤 테이블에 있는 것인지를 분명히 지정해
주어야 한다. 이것은 컬럼 이름 앞에 테이블 이름을 적어 주는 방식으로 사용된다.
여러분은 두 개의 서로 다른 테이블을 합(join)할 필요는 없다. 때로는 테이블 자체를 합하는 것이 더 유용할 수 있는데, 만약에 동
일한 테이블에 있는 다른 레코드간에 비교를 할 경우가 이에 해당한다. 예를 들면, 암수 한 쌍의 동물을 찾기 위해서, pet 테이블 자
체를 합에서 각 동물의 암수 쌍을 만들어 낸다:
-> WHERE p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm';
+--------+------+--------+------+---------+
+--------+------+--------+------+---------+
+--------+------+--------+------+---------+
제목검색
3. 사용 설명서
여러분의 앞의 예제에서 결과로 화면에 나온 줄들이 특정 규칙이 없이 보여졌다는 점을 발견할 수 있을 것이다. 어떤 의미를 가지
3.3. 데이터베이스 생성 및 사용하기
고 줄이 정렬이 되어지면 쿼리의 결과를 분석하는 것이 보다 쉬울 수도 있을 것이다. 결과를 정렬하기 위해서는, ORDER BY 구문
3.3.4 테이블에서 정보를 불러오기
을 사용한다.
3.3.4.1 모든 데이터 선택하기
3.3.4.2 특정 줄 선택하기 여기에서는 동물의 생일을 날짜로 정렬하고 있다:
3.3.4.3 특정 컬럼 선택하기
3.3.4.5 데이터 계산하기 mysql> SELECT name, birth FROM pet ORDER BY birth;
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
문자 타입의 컬럼에서, 정렬-모든 비교 연산과 마찬가지로-은 일반적으로는 대소 문자를 구분하지 않는다. 여러분은 다음과 같이
BINARY를 사용해서 컬럼에 대해 대소 문자를 구분하도록 정렬시킬 수 있다: ORDER BY BINARY col_name.
디폴트 정렬 순서는 오름 차순이고, 가장 작은 것이 먼저 나오게 된다. 내림 차순으로 정렬하기 위해서는, DESC 키워드를 정렬하고
자 하는 컬럼 이름에 추가한다:
+----------+------------+
| name | birth |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+
다중 컬럼에서 정렬을 할 수 있으며, 서로 다른 순서로 컬럼을 정렬할 수도 있다. 예를 들면, 오름 차순으로 동물의 타입을 정렬하
고, 그 다음에는 동물의 타입에서 내림 차순으로 생일을 정렬하기 위해서는, 아래의 쿼리를 사용한다:
+----------+---------+------------+
+----------+---------+------------+
+----------+---------+------------+
DESC 키워드는 바로 앞에 있는 컬럼 이름(birth)에만 적용된다는 점을 주목하기 바란다; 이것은 species 컬럼의 정렬에는 관여하
지 않는다.
제목검색
상위메뉴리스트 ◆
3.4. 데이터 베이스와 테이블에 대한 정보 얻기
3. 사용 설명서
만약에 데이터 베이스 또는 테이블 이름을 잊었거나, 또는 주어진 테이블의 구조(예를 들면, 컬럼의 이름이 무엇인지)를 모른다고
3.4. 데이터 베이스와 테이블에 대한 정보 얻기
할 경우에는? MySQL은 이러한 문제를 다루는 명령문을 제공해 줌으로서 데이터 베이스와 테이블에 대한 정보를 나타내도록 하
3.4 데이터 베이스와 테이블에 대한 정보 얻기
고 있다.
여러분은 앞에서 SHOW DATABASES를 보았는데, 이것은 서버가 관리하는 데이터 베이스를 목록으로 보여준다. 어떤 데이터 베
이스가 현재 사용되고 있는지 보기 위해서, DATABASE() 함수를 사용한다:
+------------+
| DATABASE() |
+------------+
| menagerie |
+------------+
디폴트 데이터 베이스가 갖고 있는 테이블이 무엇인지를 보기 위해(예를 들면, 여러분이 테이블 이름에 대해 확신이 없다면), 다음
의 명령어를 사용한다:
+---------------------+
| Tables in menagerie |
+---------------------+
| event |
| pet |
+---------------------+
테이블의 구조를 알고 싶다면, DESCRIBE 명령어가 유용하다; 이 명령어는 각 테이블의 컬럼 정보를 표시해 준다:
+---------+-------------+------+-----+---------+-------+
+---------+-------------+------+-----+---------+-------+
+---------+-------------+------+-----+---------+-------+
Field는 컬럼 이름을 나타내며, Type은 컬럼에 대한 데이터 타입, NULL 은 컬럼이 NULL 값을 갖고 있는지 아닌지를 표시하며,
Key는 컬럼이 인덱싱이 되어 있는지 아닌지, 그리고 Default는 컬럼의 디폴트 값을 지정하고 있다.
테이블에 인덱스를 갖고 있다면, SHOW INDEX FROM tbl_name은 인덱스에 대한 정보를 보여 주게 된다.
제목검색
상위메뉴리스트 ◆
3.5. 배치(Batch)모드에서 mysql 사용 하기
3. 사용 설명서
앞의 섹션에서, 여러분은 mysql을 사용해서 쿼리를 입력하고 결과를 볼 수가 있었다. 여러분은 mysql을 배치 모드에서도 사용할
3.5. 배치(Batch)모드에서 mysql 사용 하기
수 있다. 이렇게 사용하기 위해서는, 명령어를 구동시키고 싶은 파일 안에 기록해 놓은 다음에, mysql이 이 파일에서 입력 값을 읽
3.5 배치(Batch)모드에서 mysql 사용 하기
어 오도록 명령하면 된다:
윈도우 환경에서 mysql를 구동시키고 파일 안에 문제를 일으키는 특수 문자가 있는 경우에는, 아래의 것을 실행한다:
스크립트 안에 있는 명령어 중에 하나가 에러를 발생시킨다고 하더라도 스크립트를 계속 진행 시키고자 한다면, --force 명령어
라인 옵션을 사용해야 한다.
• 대용량의 결과를 만들어 내는 쿼리를 가지고 있다면, 화면에 스크롤 되는 결과를 얻는 것보다는 종이에 출력을 얻는
것이 나을 것이다:
• 여러분이 작성한 스크립트를 다른 사람에 줄 수 있으며, 그 사람들도 여러분과 동일한 명령어를 실행 시킬 수 있다.
디폴트 결과 포맷은 배치 모드에서 mysql을 사용할 때와 상호 교류 동작시에 사용할 때가 다르게 나타난다. 예를 들면, SELECT
DISTINCT species FROM pet은 mysql이 상호 교류적으로 구동될 때에는 다음과 같이 나온다:
+---------+
| species |
+---------+
| bird |
| cat |
| dog |
| hamster |
| snake |
+---------+
species
bird
cat
dog
hamster
snake
만약에 배치 모드에서 상호 교류적인 결과값 포맷을 얻고자 한다면, mysql –t를 사용한다. 실행된 명령문에 결과 값을 다시 돌려
보내고 싶다면(to echo), mysql –vvv를 사용한다.
mysql> ₩. filename
제목검색
상위메뉴리스트 ◆
3.6. 일반적인 쿼리의 예제들(Examples)
3. 사용 설명서 3.6.1. 컬럼의 최대 값
3.6.9 AUTO_INCREMENT사용하기
명령어 라인에서 mysql을 구동 시키고 데이터 베이스를 선택한다:
-> (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
-> (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);
+---------+--------+-------+
+---------+--------+-------+
| 0001 | A | 3.45 |
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | B | 1.45 |
| 0003 | C | 1.69 |
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+
제목검색
상위메뉴리스트 ◆
3.6.1. 컬럼에 대한 최대 값(Maximum Value)
3. 사용 설명서
“최고(highest)의 아이템 숫자는 어떤 것인가?”
3.6. 일반적인 쿼리의 예제들(Examples)
+---------+
| article |
+---------+
| 4|
+---------+
http://www.mysqlkorea.com/develop/sub_07.html?lcate=3&mcate=6&scate=1&idx=2852006-08-03 오후 4:11:35
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
3.6.2. 특정 컬럼의 최대값을 갖고 있는 줄(Row)
3. 사용 설명서
Task: 가장 비싼 상품의 숫자, 판매자, 그리고 가격을 찾는다.
3.6. 일반적인 쿼리의 예제들(Examples)
FROM shop
FROM shop
LIMIT 1;
http://www.mysqlkorea.com/develop/sub_07.html?lcate=3&mcate=6&scate=2&idx=2862006-08-03 오후 4:11:39
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
3.6.3. 그룹별 최대 컬럼 수(Maximum of Column per Group)
3. 사용 설명서
Task: 상품별로 최고의 값을 찾는다.
3.6. 일반적인 쿼리의 예제들(Examples)
FROM shop
GROUP BY article
+---------+-------+
| article | price |
+---------+-------+
| 0001 | 3.99 |
| 0002 | 10.99 |
| 0003 | 1.69 |
| 0004 | 19.95 |
+---------+-------+
제목검색
상위메뉴리스트 ◆
3.6.4. 특정 필드의 그룹 와이즈(Group-wise) 최대값을 갖는 줄
3. 사용 설명서
Task: 각 상품별로, 판매자를 찾거나 또는 최고의 값을 갖고 있는 판매자를 찾는
3.6. 일반적인 쿼리의 예제들(Examples)
다.
3.6.4 특정 필드의 그룹 와이즈(Group-wise) 최대값
을 갖는 줄
이 문제는 아래와 같은 서브 쿼리를 사용해서 해결할 수 있다:
FROM shop s1
FROM shop s2
http://www.mysqlkorea.com/develop/sub_07.html?lcate=3&mcate=6&scate=4&idx=2892006-08-03 오후 4:11:41
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
3.6.5. 사용자 정의 변수 사용하기(Using User-Defined Variables)
3. 사용 설명서
여러분은 결과값을 클라이언트에 있는 임시 변수에 저장하지 않고 MySQL사용자 변수에 기억시키도록 할 수가 있다.
3.6. 일반적인 쿼리의 예제들(Examples)
( Section 9.3, “사용자 지정(User-Defined) 변수”를 참조할 것.)
3.6.5 사용자 정의 변수 사용하기(Using User-
Defined Variables)
예를 들면, 최고 가격 및 최저 가격을 갖는 상품을 찾기 위해 여러분은 아래와 같이 할 수 있다:
+---------+--------+-------+
+---------+--------+-------+
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+
http://www.mysqlkorea.com/develop/sub_07.html?lcate=3&mcate=6&scate=5&idx=2912006-08-03 오후 4:11:43
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
3.6.6. 외국어 키(Foreign Keys) 사용하기
3. 사용 설명서
MySQL에서, InnoDB 테이블은 외국어 키 constraints 검사를 지원한다. Section 14.2, “InnoDB 스토리지 엔지”, 및
3.6. 일반적인 쿼리의 예제들(Examples)
Section 1.9.5.5, “외국어 키(Foreign Keys)”를 참조할 것.
3.6.6 외국어 키(Foreign Keys) 사용하기
외국어 키 constraint는 단순히 두 테이블을 합할 때에는 필요하지 않다. InnoDB가 아닌 스토리지 엔진에 대해서는, 컬럼이
REFERENCES tbl_name(col_name) 구문을 사용하도록 정의할 때 사용 가능한데, 이것은 실제로 아무런 효과도 없으며, 또한 여
러분이 지금 정의한 컬럼은 다른 테이블에 있는 컬럼을 참조하도록 의도된 것이라는 것을 알려주는 메모 또는 코멘트 역할만 하게
된다. 아래와 같은 신텍스를 사용할 때는 매우 중요하다:
• MySQL은 col_name 이 실제로 tbl_name 에 있는지(또는 tbl_name 자체가 있는지) 확인하기 위한 어떠한 종류의
CHECK도 실행하지 않는다.
);
);
+----+---------------------+
| id | name |
+----+---------------------+
| 1 | Antonio Paz |
| 2 | Lilliana Angelovska |
+----+---------------------+
+----+---------+--------+-------+
+----+---------+--------+-------+
| 1 | polo | blue | 1|
| 2 | dress | white | 1|
| 3 | t-shirt | blue | 1|
| 4 | dress | orange | 2|
| 5 | polo | red | 2|
| 6 | dress | blue | 2|
| 7 | t-shirt | white | 2|
+----+---------+--------+-------+
+----+-------+--------+-------+
+----+-------+--------+-------+
| 4 | dress | orange | 2|
| 5 | polo | red | 2|
| 6 | dress | blue | 2|
+----+-------+--------+-------+
이러한 형태로 사용될 경우에, REFERENCES 구문은 SHOW CREATE TABLE 또는 DESCRIBE 구문의 결과에는 나타나지 않
는다:
Table: shirt
제목검색
상위메뉴리스트 ◆
3.6.7. 두 개의 키(Two Keys)상에서 검색
3. 사용 설명서
단일 키를 사용하는 OR는 AND에서 다루어진 것처럼 매우 잘 동작을 하게 된다.
3.6. 일반적인 쿼리의 예제들(Examples)
이것은MySQL 5.0.0에서부터 최적화 되었다. Section 7.2.6, “인덱스 병합 최적화(Index Merge Optimization)”를 참조할 것.
여러분은 또한 두 의 독립적인 SELECT 명령문에서 나오는 결과를 조합하는 UNION을 사용해서 문제를 효과적으로 해결할 수 있
다. Section 13.2.7.2, “UNION 신텍스”를 참조할 것.
UNION
제목검색
상위메뉴리스트 ◆
3.6.8. 일별 방문자수 계산하기(Calculating Visits Per Day)
3. 사용 설명서
아래의 예제는 비트 그룹 함수를 사용해서 월별 일수를 계산하고 웹 사이트에 일별로 방문한 사람의 숫자를 계산하는 방법을 알려
3.6. 일반적인 쿼리의 예제들(Examples)
주는 것이다.
3.6.8 일별 방문자수 계산하기(Calculating Visits
Per Day)
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
(2000,2,23),(2000,2,23);
GROUP BY year,month;
Which returns:
+------+-------+------+
+------+-------+------+
| 2000 | 01 | 3|
| 2000 | 02 | 2|
+------+-------+------+
쿼리는 중복되는 엔트리를 자동으로 삭제 시키면서, 각 년/월 조합 테이블에서 얼마나 많은 날들이 발생했는지를 계산한다.
제목검색
상위메뉴리스트 ◆
3.6.9. AUTO_INCREMENT사용하기
3. 사용 설명서
AUTO_INCREMENT는 새로운 줄에 대해 유일한(unique) 값을 생성시킬 때 사용된다:
3.6. 일반적인 쿼리의 예제들(Examples)
3.6.9 AUTO_INCREMENT사용하기
CREATE TABLE animals (
);
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
Which returns:
+----+---------+
| id | name |
+----+---------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
+----+---------+
하다.
);
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
다음을 리턴 한다:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
만약에 AUTO_INCREMENT 컬럼이 다중 인덱스의 부분이라면, MySQL은 AUTO_INCREMENT 컬럼을 가지고 시작하는 인덱
스를 사용해서 시퀀스 값을 만들어 낼 것이다. 예를 들면, 만약에 animals 테이블이 PRIMARY KEY (grp, id) 및 INDEX (id) 인
덱스를 갖고 있다면, MySQL은 시퀀스 값을 만들기 위해 PRIMARY KEY를 무시하게 될 것이다. 그 결과로, 테이블은 단일 시퀀스
를 갖게 되며, grp의 값 별로 시퀀스를 갖지는 않는다.
• AUTO_INCREMENT 속성을 컬럼에 할당하는 방법: Section 13.1.5, “CREATE TABLE 신텍스”, 및
Section 13.1.2, “ALTER TABLE 신텍스”를 참조.
• SQL 모드에 따른 AUTO_INCREMENT 의 동작 원리: Section 5.2.5, “서버 SQL 모드”를 참조.
제목검색
상위메뉴리스트 ◆
3.7. 쌍둥이 프로젝트에서의 쿼리(Queries from the Twin Project) - Skip
3. 사용 설명서 3.7.1. Find All Non-distributed Twins
3.7. 쌍둥이 프로젝트에서의 쿼리(Queries from the Twin Project) 3.7.2. Show a Table of Twin Pair Status
http://www.mysqlkorea.com/develop/sub_07.html?lcate=3&mcate=7&scate=0&idx=3022006-08-03 오후 4:12:10
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
3.8. 아파치와 함께 MySQL 사용하기
3. 사용 설명서
여기에는 여러분이 MySQL데이터 베이스에 대해 확신을 가지고 MySQL테이블에 로그 파일을 기입할 수 있도록 하는 프로그램이
3.8. 아파치와 함께 MySQL 사용하기
있다.
3.8 아파치와 함께 MySQL 사용하기
여러분은 아파치 구성 파일에 아래의 내용을 넣음으로써 MySQL이 보다 쉽게 아파치 로깅 포맷을 읽을 수 있도록 할 수 있다:
LogFormat ₩
"₩"%h₩",%{%Y%m%d%H%M%S}t,%>s,₩"%b₩",₩"%{Content-Type}o₩", ₩
₩"%U₩",₩"%{Referer}i₩",₩"%{User-Agent}i₩""
http://www.mysqlkorea.com/develop/sub_07.html?lcate=3&mcate=8&scate=0&idx=3042006-08-03 오후 4:12:17
:::MySQL Korea:::
제목검색
● MySQL 관리자(Administrator): 이 툴은 MySQL 서버, 데이터 베이스, 테이블, 그리고 사용자 계정을 관리하기 위한 것
이다.
● MySQL 쿼리 브라우저(Query Browser): 이 그래픽 툴은 MySQL에서 쿼리를 생성하고, 실행하고, 그리고 최적화 시키
기 위한 툴이다.
● MySQL 마이그레이션 툴 킷(Migration Toolkit): 이것은 여러분이 다른 관계 지향 데이터 베이스 관리 시스템에 있는 스
키마와 데이터를 MySQL에서 사용할 수 있도록 도와주는 프로그램이다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=4&mcate=0&scate=0&idx=3152006-08-03 오후 4:14:15
:::MySQL Korea:::
제목검색
제목검색
상위메뉴리스트 ◆
4.2. MySQL 프로그램 호출 하기
4. MySQL 프로그램 사용하기
명령어 라인에서 MySQL 프로그램을 호출하기 위해서는(즉, 쉘 또는 명령어 프롬프트에서), 프로그램 이름과 그 프로
4.2. MySQL 프로그램 호출 하기
그램이 실행할 일을 지시하는 옵션 또는 인수를 함께 입력한다. 아래의 명령어는 프로그램 호출의 샘플을 보여주는 것
4.2 MySQL 프로그램 호출 하기 이다. “shell>”은 명령어 해석기(interpreter)를 위한 프롬프트를 나타낸다. 여러분이 사용하는 명령어 해석기에
따라 서로 다른 프롬프트가 나타날 것이다. 전형적인 프롬프트는, sh 또는 bash에서는 $, csh 또는 tcsh에서는 %, 그
리고 윈도우 command.com 또는 cmd.exe 명령어 해석기에 대해서는 C:₩> 가 된다.
옵션이 없는(Non-option) 인수들(앞에 대쉬가 없는 인수들)은 프로그램에 추가적인 정보를 제공해 주는 것이다. 예
를 들면, mysql 프로그램은 처음에 나오는 옵션 없는 인수를 데이터 베이스의 이름으로 해석하는데, 따라서 명령어
mysql -u root test는 여러분이test 데이터 베이스를 사용하고자 한다는 것을 나타내는 것이다.
이 다음의 섹션에서는 프로그램이 이해하는 인수에는 어떤 것들이 있으며 옵션 없이 사용하는 인수들은 무엇을 의미
하는 것인지에 대해 각 프로그램 별로 설명을 하기로 하겠다.
어떤 옵션들은 여러 프로그램에서 공통으로 사용되기도 한다. 이러한 옵션들중에 가장 대표적인 것들은 --host (또
는 -h), --user (또는 -u), 그리고 --password (또는 -p) 옵션으로서, 이것들은 접속 파라미터를 지정하는 것들
이다. 이 옵션들은 MySQL 서버가 구동되는 호스트를 지정하며, 또한 MySQL계정의 사용자 이름과 패스워드를 나타
내는 것들이다. 모든 MySQL 클라이언트 프로그램들은 이러한 옵션들을 이해한다; 이 옵션들을 사용해서 여러분은
어떤 서버에 접속을 하고 어떤 계정을 사용할 것인지를 지정할 수 있게 된다.
여러분은 MySQL 프로그램들을 호출하기 위해서는 이 프로그램들이 설치되어 있는 bin 디렉토리의 경로 이름을 사용
할 필요가 있다는 것을 알게 될 것이다. 이것은 여러분이 bin 디렉토리가 아닌 곳에서 MySQL프로그램을 구동 시키고
자 할 때마다 “program not found” 에러를 보게 된다면 느낄 수 있을 것이다. 보다 편리하게 MySQL을 사용하기
위해서는, bin 디렉토리의 경로 이름을 PATH 환경 변수 설정에 추가하면 된다. 이렇게 함으로써 전체 경로의 이름을
입력하지 않고 단순히 프로그램의 이름만을 입력해서 구동시킬 수 있게 된다. 예를 들면, 만약에 mysql이 /usr/local/
mysql/bin에 설치되어 있다면, 여러분은 이것을 단지 mysql의 호출로만으로도 실행 시킬 수 있게 된다; 이것을 호출
할 때 더 이상 /usr/local/mysql/bin/mysql 전체를 입력할 필요가 없게 된다.
PATH 변수 설정에 대한 사용 방법은 여러분이 사용하는 명령어 해석기 사용 설명서를 참조하기 바란다. 환경 변수
설정 신텍스는 각 명령어 해석기와 관련을 갖고 있다.
제목검색
4.3.2 옵션 파일 사용 하기
● 명령어 라인에서 프로그램 이름 다음에 옵션을 열거한다. 이것은 프로그램을 특별하게 호출할 때 사용하는 가장 일반적인
4.3.3 환경 변수를 사용해서 옵션 지정 하기
방법이다.
4.3.4 옵션을 사용해서 프로그램 변수 설정하기
● 프로그램이 시작될 때 읽게 되는 옵션 파일에 옵션을 열거한다. 이 방법은 프로그램이 실행될 때마다 이 옵션을 사용하도
록 하게 할 경우에 쓰는 일반적인 방법이다.
● 환경 변수에 옵션을 열거한다. 이 방법은 프로그램이 실행 될 때마다 이 옵션을 적용하고자 할 경우에 유용한 방법이다. 실
제로는, 이러한 목적으로는 옵션 파일들이 주로 사용된다. 하지만, Section 5.13.2, “유닉스에서 다중 서버 구동 시키
기”에서는 환경 변수들이 보다 효과적으로 사용될 수 있다는 것을 보여 준다. 그곳에서는 이러한 변수들을 사용해서 서버
와 클라이언트 프로그램 모두를 위한 TCP/IP 포트 및 유닉스 소켓 파일을 효과적으로 지정하는 방법을 설명한다.
어떤 변수들이 지정되어졌는지 확인 하기 위해, MySQL 프로그램은 우선 환경 변수들을 검사하게 되고, 그 다음에 옵션 파일들을
읽고, 그 다음에 마지막으로 명령어 라인을 검사하게 된다. 하나의 옵션이 여러 번 지정되어 있다면, 마지막에 나오는 것이 우선권
을 갖게 된다. 이것은 환경 변수가 가장 낮은 순위를 갖고 명령어 라인이 가장 높은 우선권을 갖는다는 것을 의미하는 것이다.
여러분은 옵션 파일에 있는 프로그램 옵션에 대해 디폴트 값을 지정해서 프로그램들이 이것을 사용하도록 활용할 수도 있다. 이렇
게 하면 프로그램을 실행시킬 때마다 일일이 입력을 하는 수고를 피할 수 있을 뿐만 아니라, 필요하다면 명령어 라인에서 다른 옵션
을 지정해 줌으로서 디폴트 값을 무시하도록 만들 수도 있게 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=4&mcate=3&scate=0&idx=3262006-08-03 오후 4:14:39
:::MySQL Korea:::
제목검색
4. MySQL 프로그램 사용하기 명령어 라인에서 지정되는 옵션들은 아래의 규칙을 따른다:
4.3. 프로그램 옵션 지정하기
첫 번째 명령어는 mysql이 test를 패스워드 값으로 사용하도록 지시하지만, 디폴트 데이터 베이스를 지정하지는 않게 된
다. 두 번째 명령어는 mysql가 프롬프트를 패스워드로 사용하고 test를 디폴트 데이터 베이스로 사용하도록 지시하는 것
이다.
어떤 옵션들은 결과를 활성화 또는 비활성화(turn on or off)시키는 기능을 제어하기도 한다. 예를 들면, mysql 클라이언트는 --
column-names 옵션을 지원하는데, 이 옵션은 쿼리 결과를 보여줄 때 컬럼 이름 열을 화면에 보여줄 지 또는 숨길지를 결정한다.
이 옵션의 디폴트 값은 보여주는 것이다. 하지만, 여러분은 이 기능을 어떤 상황에서는 숨길 수도 있는데, 예를 들면 mysql의 결과
를 다른 프로그램에 보내서 초기 헤더 라인을 뺀 데이터 부분만을 보고자 할 경우가 여기에 해당한다.
컬럼 이름을 비활성화 시키기 위해서는, 아래의 형태중에 하나를 가지고 옵션을 지정하면 된다:
--disable-column-names
--skip-column-names
--column-names=0
--disable 과 --skip 접두사 및 =0 접미사는 모두 동일한 효과를 나타낸다: 이것들은 옵션을 비활성화 시킨다.
--column-names
--enable-column-names
--column-names=1
만약에 옵션이 –loose 다음에 나온다면, 프로그램이 그 옵션을 인식하지 못할 경우에는 에러를 보이면서 종료하는 대신에, 경고
메시지만을 보여주게 된다:
--loose 접두사는 동일 머신에 다중의 MySQL을 설치한 장비에서 프로그램을 구동시키고 옵션 파일에 옵션을 기술해 놓을 때 유
용하게 사용할 수 있는 것이다. 한 프로그램의 모든 버전이 인식하지 못하는 옵션에 대해서는 --loose 접두사를 가지고 줄 수 있
다(또는 옵션 파일에서는 loose 를 사용한다). 이 옵션을 인식하는 프로그램 버전은 정상적으로 프로세스를 진행하고, 이것을 인식
하지 못하는 버전은 경고 메시지를 보낸 다음에 무시해 버리게 된다.
때때로 mysql과 함께 유용하게 사용할 수 있는 옵션이 --execute 또는 -e 옵션인데, 이것은 SQL명령문을 서버에 패스할 때 사
용된다. 이러한 명령문들은 단일 또는 이중 인용 부호로 묶여야 한다. 명령문안에서 인용 부호를 사용하고자 한다면, 명령문에 대해
서는 이중 인용 부호를 사용하고, 명령문 내에서는 단일 인용 부호를 사용한다. 이 옵션을 사용하면, mysql은 그 명령문을 사용한
다음에 종료를 한다.
+------+-----------+
| User | Host |
+------+-----------+
| | gigan |
| root | gigan |
| | localhost |
| jon | localhost |
| root | localhost |
+------+-----------+
shell>
앞의 예제에서 보듯이, mysql 데이터 베이스의 이름은 별도의 인수 형태로 전달 되었다. 하지만, 동일한 명령문을 아래의 명령어
로 실행시킬 수 있는데, 여기에는 디폴트 데이터 베이스를 지정하지 않았다:
+------------+
| VERSION() |
+------------+
| 5.0.19-log |
+------------+
+---------------------+
| NOW() |
+---------------------+
| 2006-01-05 21:19:04 |
+---------------------+
--execute 또는 -e 옵션은 또한 MySQL 클러스터에 대한 ndb_mgm 관리 클라이언트에 비슷한 형식으로 명령문을 전달할 때
사용될 수도 있다. Section 15.3.6, “안전한 셧다운과 재 시작”에서 예문을 참조하기 바란다.
제목검색
상위메뉴리스트 ◆ 4.3.2. 옵션 파일 사용 하기
4. MySQL 프로그램 사용하기 대부분의 MySQL 프로그램들은 옵션 파일(때로는 구성 파일로도 불리어짐)에서 스타트업 옵션을 읽을 수 있다. 옵
4.3. 프로그램 옵션 지정하기 션 파일들은 주로 사용되는 옵션들을 지정하는데 있어서 편리한 방법을 제공하여 주는데, 따라서 여러분이 명령어 라
프로그램이 옵션 파일을 읽을 수 있는지 없는지를 확인하기 위해서는, --help 옵션(mysqld의 경우, --verbose 및
--help for mysqld)을 함께 사용해서 프로그램을 호출한다. 만약에 프로그램이 옵션 파일을 읽을 수 있다면, 도움
말 메시지는 프로그램이 찾는 파일과 인식할 수 있는 옵션 그룹을 표시하게 된다.
Note: MySQL 클러스터 프로그램과 함께 사용되는 옵션 파일들은 Section 15.4, “MySQL 클러스터 구성”에서 설
명하기로 한다.
Filename Purpose
WINDIR₩my.ini Global options
WINDIR 는 여러분의 윈도우 디렉토리의 위치를 나타낸다. 이것은 주로 C:₩WINDOWS 또는 C:₩WINNT가 된다.
여러분은 이것의 정확한 위치를 아래의 명령문을 사용해서 WINDIR 환경 변수의 값을 가지고 알아낼 수가 있다:
Filename Purpose
/etc/my.cnf Global options
MySQL은 위에서 언급한 순서대로 옵션 파일들을 찾고 읽게 된다. 여러분이 사용하고자 하는 옵션 파일이 존재하지
않는다면, 일반적인 텍스트 편집기를 사용해서 이것을 생성한다.
주어진 옵션에서 다중의 인스턴스가 발견되면, 최종 인스턴스가 우선 순위를 갖게 된다. 한 가지 예외가 있다: mysqld
에 대해서는, --user 옵션의 첫 번째 인스턴스는 보안 목적으로 사용되기 때문에, 옵션 파일에 있는 사용자 지정 옵
션을 명령어 라인에서 지정하는 것이 앞서 실행되지 않도록 하고 있다.
Note: 유닉스 플랫폼에서는, MySQL은 모든 사람이 작성할 수 있는(world-writable) 구성 파일은 무시해 버린다.
이것은 의도적인 것으로, 보안에 관련된 정책이다.
하나의 옵션 파일에서 옵션을 지정할 때 사용하는 신텍스는 명령어 라인에서 사용하는 신텍스와 유사한데, 옵션 앞에
사용하는 두 가지의 대쉬는 생략해야 한다. 예를 들면, 명령어 라인에서 사용되는 --quick 또는 --host=localhost
은 옵션 파일에서는 quick 또는 host=localhost 과 같이 쓰여져야 한다. --loose-opt_name 를 옵션 파일에서 지정
하기 위해서는, loose-opt_name와 같이 작성되어야 한다.
● #comment, ;comment
코멘트 라인은 ‘#’ 또는 ‘;’로 시작한다. ‘#’로 시작 되는 코멘트는 라인의 중간에서도 시작할 수
있다.
● [group]
있다.
● opt_name
● opt_name=value
‘₩₩’ 이스케이프 시퀀스는 단일 백슬레쉬를 의미하기 때문에, 여러분은 각각의 ‘₩’를 ‘₩₩’로 써야 한다.
다른 방법으로는, 경로 이름 구분자로서 ‘₩’를 사용하지 않고 ‘/’를 사용할 수도 있다.
옵션 그룹의 이름이 프로그램 이름과 같다면, 그룹에 있는 옵션들은 특별히 그 프로그램에 적용되게 된다. 예를 들면,
[mysqld] 과 [mysql] 그룹은 mysqld 서버와 mysql 클라이언트 프로그램에 각각 적용된다.
워드를 지정할 때 사용할 수 있는 완벽한 그룹이다. (하지만 그 옵션 파일이 여러분만 읽고 쓸 수 있도록 해야 하며, 따
라서 다른 사람들이 패스워드를 알지 못하도록 해야 한다.) 어떤 옵션 하나를 여러분이 사용하는 모든 클라이언트 프
로그램이 인식하지 못할 경우에는 [client] 그룹에 그 옵션을 넣지 않도록 한다. 여러분이 프로그램을 구동시키고자
한다면, 프로그램은 이 옵션을 인식하지 못하게 되며 에러 메시지를 보여 주면서 동작을 멈추게 된다.
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M
[mysqldump]
quick
[client]
password="my_password"
[mysql]
no-auto-rehash
connect_timeout=2
[mysqlhotcopy]
interactive-timeout
[mysqld-5.0]
new
MySQL 5.0.4 이후에는, 옵션 파일에 !include 지시문(directives)을 사용해서 다른 옵션 파일을 포함하도록 지시할
수 있게 되었고 !includedir를 사용해서 옵션 파일에 대한 특정 디렉토리를 검색하도록 할 수 있다. 예를 들면, /home/
!include /home/me/myopt.cnf
!includedir /home/mydir
Note: 현재의 버전까지는, 유닉스 시스템에서 !includedir 지시문을 사용해서 검색되고 포함 되어지는 파일들은 반드
시 파일 이름 끝에 .cnf가 있어야 한다. 윈도우에서는, 이러한 지시문은 .ini 또는 .cnf 확장자로 끝나는 파일을 검사한
다.
포함되어진 파일에서 읽혀진 옵션들은 현재(current) 옵션 그룹의 문장에서 적용된다는 점을 알아두기 바란다. 여러
분이 아래의 라인을 my.cnf 안에 써 놓았다고 가정하자:
[mysqld]
!include /home/mydir/myopt.cnf
제목검색
4. MySQL 프로그램 사용하기 환경 변수를 사용해서 옵션을 지정하기 위해서는, 여러분이 사용하는 명령어 프로세서에 적당한 신텍스를 사용해서 변수를 설정한
4.3. 프로그램 옵션 지정하기 다. 예를 들면, 윈도우 또는 넷웨어(NetWare)에서는, USER 변수를 설정해서 MySQL 계정 이름을 지정하도록 한다. 이렇게 하기
SET USER=your_name
유닉스에서의 신텍스는 여러분이 사용하는 쉘에 관련이 된다. 여러분이 TCP/IP 포트 번호를 MYSQL_TCP_PORT 변수를 사용해
서 지정하고자 한다고 가정한다. 전형적인 신텍스는(sh, bash, zsh의 경우) 다음과 같다:
MYSQL_TCP_PORT=3306
export MYSQL_TCP_PORT
첫 번째 명령어는 변수를 설정하고, 그리고 export 명령어는 그 변수를 쉘 환경 변수로 보내어서 이 값을 MySQL과 다른 프로세스
들이 사용할 수 있도록 만든다.
환경 변수를 설정하는 명령어는 명령어 라인에서 실행 시켜서 즉시 효과를 나타내도록 할 수 있으나, 하지만 설정은 여러분이 로그
아웃을 하지 않은 상태에서만 유지된다. 여러분이 로그인 할 때마다 효과를 갖기 위해서는, 적당한 명령어 또는 명령어들을 스타트
업 파일에 적어 놓아서 명령어 해석기가 매 서버 시작 때마다 읽을 수 있도록 하면 된다. 전형적인 스타트업 파일들은 윈도우에서
는 AUTOEXEC.BAT 이며, for bash에서는 .bash_profile, 또는 tcsh에 대해서는 .tcshrc 가 된다. 보다 상세한 사항은 명령어 해
석기 매뉴얼을 참조하기 바란다.
Appendix F, Environment Variables에서는 MySQL프로그램 작동에 영향을 미치는 모든 환경 변수를 열거하고 있다.
제목검색
4. MySQL 프로그램 사용하기 많은 MySQL 프로그램들이 런타임 때 설정할 수 있는 내부 변수들을 가지고 있다. 프로그램 변수들은 전체 이름 옵션들에 값을 설
4.3. 프로그램 옵션 지정하기 정하는 것과 같은 방식으로 설정된다. 예를 들면, mysql은 max_allowed_packet 라는 변수를 가지고 있는데, 이 변수는 통신 버퍼
4.3.4 옵션을 사용해서 프로그램 변수 설정하기 의 최대 크기를 제어한다. max_allowed_packet 변수를 16MB로 설정하기 위해서는, 아래의 명령어 중에 하나를 사용한다:
첫 번째 명령어는 그 값을 바이트로 지정했다. 두 번째 명령어는 메가 바이트로 지정을 했다. 숫자 값을 가지는 변수에 대해서는, 접
미사 K, M, 또는 G (대소 문자 상관 없음)를 사용해서 1024, 10242 or 10243의 승수를 표시할 수 있다.(예를 들면,
max_allowed_packet를 설정하기 위해 사용될 때, 접미사는 킬로 바이트, 메가 바이트, 또는 기가 바이트를 나타낸다.)
[mysql]
max_allowed_packet=16777216
또는:
[mysql]
max_allowed_packet=16M
[mysqld]
key_buffer_size=512M
[mysqld]
key-buffer-size=512M
Note: MySQL 4.0.2 이전에는, 프로그램 변수를 설정할 수 있는 유일한 신텍스는 --set-variable=option=value (또는 옵션 파
일에서는, set-variable=option=value)밖에 없었다. 이 신텍스는 여전히 사용 가능하지만, 4.0.2 이후에는 그다지 사용되지 않는
다.
많은 서버 시스템 변수들도 역시 런타임시에 설정을 할 수가 있다. 자세한 사항은, Section 5.2.3.2, “동적 시스템 변수들”을 참
조할 것.
제목검색
5.5 mysqlmanager — MySQL 인스턴스 관리자 5.6.1. mysql_fix_privilege_tables — MySQL 시스템 테이블 업그레이
5.5.2 MySQL 인스턴스 관리자에 접속하기와 사용자 계정 생성하기 5.6.2. mysql_upgrade — MySQL 업그레이드를 위한 테이블 체크
5.7. 일반적인 보안 문제
5.5.2.1 인스턴스 관리자 사용자 및 패스워드
5.7.1. 일반적인 보안 가이드 라인
5.5.2.2 상태 모니터를 위한 MySQL 서버 계정
5.7.2. 보안 공격으로부터 MySQL 보안 설정하기
5.5.4 MySQL 인스턴스 관리자 구성 파일 5.7.4. LOAD DATA LOCAL 에서의 보안 문제들
5.5.5 MySQL 인스턴스 관리자가 인식하는 명령어 5.7.5. How to Run MySQL as a Normal User
5.8. MySQL 접근 권한 시스템
5.6 설치-관련 프로그램
5.8.1. 권한 시스템이 하는 일
5.6.1 mysql_fix_privilege_tables — MySQL 시스템 테이블 업그레이드
5.8.2. 권한 시스템의 동작 방식
5.6.2 mysql_upgrade — MySQL 업그레이드를 위한 테이블 검사
5.8.3. MySQL이 제공하는 권한
5.7 일반적인 보안 이슈
5.8.4. MySQL서버에 접속하기
5.7.1 일반적인 보안 가이드 라인
5.8.5. 접근 제어, Stage 1: 접속 검증
5.7.2 공격으로부터 MySQL 보안 설정하기
5.8.6. 접근 제어, Stage 2: 요청 검증
5.7.3 보안-관련 mysqld 옵션
5.8.7. 권한 변경이 효력을 나타내는 시점
5.7.4 LOAD DATA LOCAL가 가지고 있는 보안 이슈 5.8.8. Access denied 에러의 원인
5.7.5 일반 사용자 자격으로 MySQL 구동시키는 방법 5.8.9. MySQL 4.1 이후의 패스워드 해싱(Hashing)
5.8 MySQL 권한 시스템 5.9. MySQL 사용자 계정 관리
5.8.1 권한 시스템이 하는 일 5.9.1. MySQL 사용자 이름과 패스워드
5.10.4.4 테이블 최적화 이 장에서는 MySQL 설치를 관리하는 사항들에 대해 설명하기로 한다:
5.11.7 문자 셋 문제
5.11.8 MySQL 서버 타임존 지원
5.12 MySQL 서버 로그
5.12.1 에러 로그
5.13.1.2 서비스 형태로 여러 개의 윈도우 서버 시작하기
5.12.2 일반적인 쿼리 로그
5.12.3 바이너리 로그
5.12.4 슬로우 쿼리 로그
5.12.5 서버 로그 관리
5.13 동일 머신에서 여러 대의 MySQL 서버 구동 시키기
5.13.1.1 명령어 라인에서 여러 개의 윈도우 서버 구동하기
5.13.2 유닉스에서 여러 개의 서버 구동하기
5.13.3 다중-서버 환경에서 클라이언트 프로그램 사용하기
5.14 MySQL 쿼리 캐시
5.14.1 쿼리 캐시를 동작 시키는 방법
5.14.2 쿼리 캐시 SELECT 옵션
5.14.3 쿼리 캐시 구성
5.14.4 쿼리 캐시 상태 및 관리
제목검색
● mysqld
SQL 데몬 (즉, MySQL 서버). 클라이언트 프로그램을 사용하기 위해서는, mysqld을 반드시 구동 시켜야 하는데, 왜냐하
면 클라이언트는 서버 접속을 통해서 데이터 베이스에 접근할 수 있기 때문이다. Section 5.2, “mysqld — MySQL 서
버”를 참조.
● mysqld-max
부가적인 기능을 포함하고 있는 서버 버전. Section 5.3, “The mysqld-max 확장된 MySQL 서버”를 참조.
● mysqld_safe
서버 스타트업 스크립트. mysqld_safe는 mysqld-max가 있다면 이것을 구동 시킨다. 그것이 없으면, mysqld를 구동시
킨다. Section 5.4.1, “mysqld_safe — MySQL 서버 스타트업 스크립트”를 참조.
● mysql.server
● mysqld_multi
● mysql_install_db
이 스크립트는 MySQL 데이터베이스를 생성하고 디폴트 권한을 가진 그랜트 테이블을 초기화 시킨다. 이것은 일반적으
로 오직 한번만 실행되는데, 최초 에 시스템에 MySQL을 설치할 때 실행된다. Section 2.9.2, “유닉스 설치후 처리 과
정”을 참조할 것.
● mysql_fix_privilege_tables
이 프로그램은 MySQL을 업그레이드한 다음에 사용된다. 이것은 MySQL의 새로운 버전에서 변경된 사항들을 그랜트 테
이블에 적용시킨다. Section 5.6.1, “mysql_fix_privilege_tables — MySQL 시스템 테이블 업그레이드”를 참조할
것.
Note: MySQL 5.0.19 버전 이후로는, 이 프로그램은 mysql_upgrade로 대체되었다.
● mysql_upgrade
이 프로그램은 MySQL을 업그레이드한 이후에 사용된다. 이것은 테이블의 비호환성에 대해 검사를 하고 필요하면 수정
을 하며, 새로운 MySQL버전에서 변경된 사항들을 그랜트 테이블에 적용 시킨다. Section 5.6.2, “mysql_upgrade —
MySQL 업그레이드에 대한 테이블 검사”를 참조할 것.
● mysqlmanager
MySQL서버를 모니터하고 관리하기 위한. Section 5.5, “mysqlmanager — MySQL 인스턴스 관리자”를 참조할 것.
위의 것들 이외에도 서버 호스트에서 구동되는 다른 프로그램들이 여러 개가 있다:
● make_binary_distribution
이 프로그램은 컴파일된 MySQL의 바이너리 릴리즈를 만든다. 이것은 FTP에 의해 다른 MySQL사용자의 편의를 위해
ftp.mysql.com 에 있는 /pub/mysql/upload/ 로 보내진다.
제목검색
5.2.3 시스템 변수 사용하기 mysqld 은 MySQL 서버다. 아래의 내용은 이 MySQL서버 구성에 대한 주제를 다루는 것이
다:
5.2.3.1 구조(structured) 시스템 변수
5.2.3.2 동적(dynamic) 시스템 변수
● 서버가 지원하는 스타트업 옵션
5.2.4 서버 상태 변수
● 서버 시스템 변수
5.2.5 서버 SQL 모드
● 서버 상태 변수
5.2.6 MySQL 서버 셧다운 프로세스
● 서버 SQL모드 설정 방법
● 서버 셧다운 과정
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=2&scate=0&idx=14472006-08-03 오후 4:16:37
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 mysqld 서버를 시작할 때, 여러분은 Section 4.3, “프로그램 옵션 지정하기”에서 설명하는 방법으로 프로그램 옵션을 지정할
5.2. mysqld — MySQL 서버 수 있다. 가장 일반적인 방법은 옵션 파일 또는 명령어 라인에서 옵션을 제공하는 것이다. 하지만, 대부분의 경우에는 서버가 매번
5.2.1 mysqld 명령어 옵션 실행할 때마다 동일한 옵션을 사용하도록 해 주는 것이 가장 바람직한 방법이다. 이렇게 동작하도록 하는 최선의 방법은 옵션 파일
에 옵션을 작성하는 것이다. Section 4.3.2, “옵션 파일 사용하기”를 참조할 것.
Mysqld은 [mysqld] 과 [server] 그룹에서 옵션을 읽는다. mysqld_safe 은 [mysqld], [server], [mysqld_safe], 및
[safe_mysqld] 그룹에서 옵션을 읽는다. mysql.server는 [mysqld] 과 [mysql.server] 그룹에서 옵션을 읽는다.
임베디드 MySQL 서버는 일반적으로 [server], [embedded], 그리고 [xxxxx_SERVER] 그룹에서 옵션을 읽는데, 여기에서
xxxxx는 서버가 임베디드되는 어플리케이션의 이름이다.
Mysqld는 많은 수의 옵션을 사용한다. 간략한 리스트를 보고자 하면, mysqld –help를 실행한다. 전체 리스트를 보고자 하면,
mysqld --verbose –help를 사용한다.
아래의 리스트는 가장 일반적인 서버 옵션을 보여주는 것이다. 추가적인 옵션들에 대해서는 나중에 설명하기로 한다:
여러분은 다음 섹션에서 설명하는 방법을 사용해서, 변수 이름을 옵션처럼 사용해서 서버 시스템 변수의 값을 설정할 수도 있다.
● --help, -?
● --allow-suspicious-udfs
이 옵션은 메인 함수에 대해 xxx symbol만을 갖고 있는 사용자 지정 함수를 로드할 것인지를 제어한다. 디폴트로는, 이
옵션은 오프(off)이며 최소 한 개의 보조 심볼을 갖고 있는 UDF만 로드할 수 있다; 이것은 규칙에 맞게 작성된 UDF가 아
닌 다른 공유 오브젝트 파일에서 함수를 로드하려는 시도를 하지 못하도록 한다. 이 옵션은 5.0.3에서 추가되었다.
Section 24.2.4.6, “사용자 정의 함수 보안에 대한 사전 해결책”.
● --ansi
MySQL 신텍스 대신에 표준(ANSI) SQL 신텍스를 사용한다. SQL모드에 대해 보다 정확한 제어를 하기 위해서는, --
sql-mode 를 대신 사용한다. Section 1.9.3, “ANSI 모드에서 MySQL구동 시키기”, 및 Section 5.2.5, “서버
SQL 모드”를 참조할 것.
● --basedir=path, -b path
● --bind-address=IP
연결하고자 하는 IP 주소.
● --bootstrap
● --character-sets-dir=path
● --character-set-client-handshake
클라이언트가 보내는 문자 셋 정보를 무시하지 말도록 함. 클라이언트의 정보를 무시하고 디폴트 서버 문자셋을 사용하기
위해서는, --skip-character-set-client-handshake를 사용한다; 이것은 MySQL이 4.0 처럼 행동하도록 만든다.
● --character-set-filesystem=charset_name
● --character-set-server=charset_name, -C charset_name
charset_name을 디폴트 서버 문자 셋으로 사용한다. Section 5.11.1, “데이터와 정렬을 위해 사용되는 문자 셋”을 참
조.
● --chroot=path
Put the mysqld server in a closed environment during startup by using chroot() 시스템 호출을 사용하는 동안
mysqld 서버를 페쇄적인 상황으로만들어 둔다. 이것은 보안 문제 관점에서 추천된다. 이 옵션의 사용은 LOAD DATA
INFILE 과 SELECT ... INTO OUTFILE을 다소 제한한다는 점을 알아두기 바란다.
● --collation-server=collation_name
● --console
(윈도우만 해당됨.) --log-error가 지정되어 있다고 하더라도, 에러 로그 메시지를 stderr 과 stdout에 작성한다.
mysqld은 이 옵션이 사용되면 콘솔을 닫지 않는다.
● --core-file
● --datadir=path, -h path
● --debug[=debug_options], -# [debug_options]
● --default-character-set=charset_name (DEPRECATED)
● --default-collation=collation_name
● --default-storage-engine=type
테이블을 위한 디폴트 스토리지 엔진(테이블 타입)을 설정한다. Chapter 14, 스토리지 엔진과 테이블 타입 을 참조할
것.
● --default-table-type=type
● --default-time-zone=timezone
디폴트 서버 타임존을 설정한다. 이 옵션은 글로벌 time_zone 시스템 변수를 설정한다. 이 옵션이 주어지지 않으면, 디폴
트 타임존은 시스템 타임존과 같게 된다(system_time_zone 시스템 변수가 설정된 값).
키 쓰기 지연(delay)을 사용하는 방법을 지정한다. 지연된 키 쓰기는 키 버퍼가 MyISAM 테이블을 작성하는 동안에 넘치
지 않게 한다. OFF는 키 쓰기 지연을 비활성화 시킨다. ON은 DELAY_KEY_WRITE 옵션을 가지고 생성되는 태이블들
에 대한 지연 키 쓰기를 활성화 시킨다. ALL은 모든 MyISAM 테이블에 대한 작성을 지연 시킨다. Section 7.5.2, “서
버 파라미터 튜닝하기”, 및Section 14.1.1, “MyISAM 스타트 업 옵션”을 참조할 것.
Note: 이 변수를 ALL로 설정하면, MyISAM 테이블이 사용될 때 다른 프로그램(다른 MySQL 서버 또는 myisamchk)안
에서는 이 테이블을 사용할 수 없게 된다.
● --des-key-file=file_name
이 파일로부터 디폴트 DES 키를 읽어 온다. 이러한 키들은 DES_ENCRYPT() 과 DES_DECRYPT() 함수가 사용한다.
● --enable-named-pipe
네임드 파이프에 대한 지원을 가능하게 한다. 이 옵션은 Windows NT, 2000, XP, and 2003 시스템에만 적용되며, 또한
네임드 파이프 접속을 지원하는 mysqld-nt 와 mysqld-max-nt 서버와 함께만 사용될 수 있다.
● --exit-info[=flags], -T [flags]
이것은 mysqld 서버를 디버깅 하기 위해 사용하는 다른 플래그의 비트마스크(bit mask) 이다. 이 옵션이 무슨 일을 하는
지 정확히 알지 못한다면 사용하지 말기 바란다!
● --external-locking
외부 잠금(시스템 잠금)을 활성화 시키는데, 이것은 4.0 이후에는 디폴트로비활성화 된다. lockd가 완전하게 동작하지 않
는 시스템(리눅스와 같은 시스템)에서 이 옵션을 사용한다면, mysqld이 데드락(deadlock) 되기 쉽다는 점을 알아두기 바
란다. 이 옵션은 이전에는 --enable-locking라고 불리었다.
Note: 많은 MySQL 처리 과정에서 MyISAM 테이블을 업데이트 할 수 있도록하기 위해 이 옵션을 사용하고자 한다면,
아래의 조건이 만족하는지 먼저 확인해야 한다:
제목검색
5. 데이터 베이스 관리 mysql 서버는 서버가 어떻게 구성되었는지를 가리키는 많은 시스템 변수들을 유지 관리 한다. 각 시스템 변수는 디폴트 값을 가지고 있다. 시스템 변수들
5.2. mysqld — 은 명령어 라인 또는 옵션 파일에서 옵션을 사용하여 서버 스타트 업때에 설정될 수 있다. 대부분의 것들은 서버가 구동되고 있는 동안에 SET 명령문을 가
MySQL 서버 지고 동적으로 변경할 수 있는데, 이 명령문은 서버를 종료하고 재 구동 시키지 않는 상태에서 서버의 동작을 수정할 수 있다. 여러분은 수식 안에 시스템 변
5.2.2 서버 시스템 변수 수를 사용할 수 있다.
● 서버가 읽는 디폴트 및 옵션 파일 컴파일에서 서버가 사용하게 될 변수의 값을 보기 위해서는, 아래의 명령어를 사용한다:
● 다른 옵션 파일에 있는 설정 값은 무시하고, 서버의 디폴트 컴파일에서 서버가 사용하게 될 변수의 값을 보기 위해서는, 아래의 명령어를 사용한다:
이 섹션은 각 시스템 변수에 대한 상세 설명을 제공한다. 버전 번호가 없는 변수들은 모든 MySQL 5.0 릴리즈에 존재하는 것임을 의미한다. 이러한 변수들
의 구현에 관련된 이전의 정보들에 대해서는 MySQL 3.23, 4.0, 4.1 Reference Manual을 참조하기 바란다.
● Section 5.2.3, “Using System Variables”에서는, 시스템 변수 값을 설정하고 화면에 보여주는 신텍스를 설명한다.
● Section 5.2.3.2, “Dynamic System Variables”에서는, 런타임시에 설정할 수 있는 변수들을 보여 준다.
● 시스템 변수 튜닝에 대한 정보는 Section 7.5.2, “Tuning Server Parameters”에서 찾을 수 있다.
● Section 14.2.4, “InnoDB Startup Options and System Variables”에서는, InnoDB 시스템 변수를 열거한다.
Note: 아래의 변수 설명문 중에 어떤 것들은 변수를 “enabling” 또는 “disabling” 하는 것에 대해 언급하고 있다. 이러한 변수들은 SET 명령문을 사용
해서 그 값을 ON 또는 1로 설정해서 활성화 시킬 수 있으며, 또는 OFF 또는 0으로 설정해서 비활성화 시킬 수가 있다. 하지만, 이러한 변수들을 명령어 라
인 또는 옵션 파일에서 설정하기 위해서는, 이것들은 반드시 1 또는 0으로 설정 되어야 한다; ON 또는 OFF로 설정하면 구동이 되지 않는다. 예를 들면, 명
령어 라인에서, --delay_key_write=1는 잘 구동되지만, --delay_key_write=ON 는 실행되지 않는다.
버퍼 크기, 길이, 그리고 스택의 크기에 대한 값은 별도로 지정되지 않으면 바이트 단위로 주어진다.
● auto_increment_increment
o +--------------------------+-------+
o | Variable_name | Value |
o +--------------------------+-------+
o | auto_increment_increment | 1 |
o | auto_increment_offset |1 |
o +--------------------------+-------+
o ㅡ
o +--------------------------+-------+
o | Variable_name | Value |
o +--------------------------+-------+
o | auto_increment_increment | 10 |
o | auto_increment_offset |1 |
o +--------------------------+-------+
o +-----+
o | col |
o +-----+
o | 1|
o | 11 |
o | 21 |
o | 31 |
o +-----+
o +--------------------------+-------+
o | Variable_name | Value |
o +--------------------------+-------+
o | auto_increment_increment | 10 |
o | auto_increment_offset |5 |
o +--------------------------+-------+
o +-----+
o | col |
o +-----+
o | 5|
o | 15 |
제목검색
5.2.3 시스템 변수 사용하기 mysql 서버는 서버가 어떻게 구성되었는지를 알려주는 많은 시스템 변수들을 관리한다. Section 5.2.2, “서버 시스템 변수”에서는 이
5.2.3.1 구조(structured) 시스템 변수 러한 변수들의 의미를 설명한다. 각 시스템 변수는 디폴트 값을 가지고 있다. 시스템 변수는 서버 스타트업 시점에 명령어 라인 또는 옵
션 파일에서 설정될 수 있다. 대부분의 것들은 서버가 구동되는 동안에 SET 명령문을 사용해서 동적으로 그 값이 변경될 수 있는데, 이
5.2.3.2 동적(dynamic) 시스템 변수
명령문은 서버를 중단하고 다시 구동시키지 않는 상태에서 서버의 동작을 수정할 수 있게 해 준다. 여러분은 수식 안에서 시스템 변수의
값을 참조할 수 있다.
서버는 두 가지 종류의 시스템 변수를 관리한다. 글로벌 변수는 서버의 전반적인 동작에 영향을 준다. 세션 변수는 개별 클라이언트 접속
에 대한 서버 동작에 영향을 준다. 주어진 하나의 시스템 변수는 글로벌과 세션 값을 모두 가질 수가 있다. 글로벌 및 세션 시스템 변수
는 아래와 같이 관련이 있다:
● 서버가 구동될 때, 서버는 모든 글로벌 변수를 자신의 디폴트 값으로 초기화 시킨다. 이러한 디폴트 값은 명령어 라인 또는 옵션
파일에서 지정된 옵션으로 변경될 수 있다. ( Section 4.3, “프로그램 옵션 지정하기”를 참조할 것.)
● 서버는 접속되는 각각의 클라이언트에 대한 세션 변수 셋을 관리하기도 한다. 클라이언트의 세션 변수는 접속되는 시점에 대응
되는 글로벌 변수의 현재 값으로 초기화 된다. 예를 들면, 클라이언트의 SQL 모드는 세션 sql_mode 값의 제어를 받는데, 이것
시스템 변수의 값은 서버 스타트업 시점에 명령어 라인 또는 옵션 파일에 있는 옵션을 가지고 글로벌하게 설정 될 수 있다. 여러분이 스
타트업 옵션을 사용해서 변수가 숫자 값을 가지도록 설정을 한다면, 이 값은 K, M, 또는 G (대 소문자 구분 없음)라는 접미사를 사용해
서 1024, 10242 or 10243의 승수를 표시할 수 있다;즉, 킬로 바이트, 메가 바이트,또는 기가 바이트를 의미한다. 따라서, 아래의 명령어
는 서버를 16메가 바이트의 캐시 크기와 1 기가 바이트의 최대 패킷 크기를 가지고 구동 되도록 만든다.:
[mysqld]
query_cache_size=16M
max_allowed_packet=1G
접미사의 문자 크기는 상관이 없다; 16M 와 16m 는 동일한 것이며, 1G 와 1g도 마찬가지 이다.
만약에 런타임 시에 SET 명령문을 가지고 설정할 수 있는 시스템 변수의 최대 값을 제한하고자 한다면, 서버 스타트업 시점에 --
maximum-var_name 의 형태 옵션을 사용해서 최대 값을 한정할 수가 있게 된다. 예를 들면, query_cache_size의 크기가 런타임 시
에 32MB 보다 커지기 않게 하기 위해서는, --maximum-query_cache_size=32M의 옵션을 사용한다.
많은 시스템 변수들이 동적인 변수이며 서버가 동작 중에 있을 때 SET 명령문을 사용해서 변경될 수 있다.이러한 변수의 리스트를 보고
싶다면, Section 5.2.3.2, “동적(dynamic) 시스템 변수”를 참조 한다. SET명령문을 사용해서 시스템 변수를 변경하기 위해서는,
var_name와 같은 것을 통해서 참조하기 바라며, 옵션으로는 수정자(modifier)를 앞세우기도 한다:
● 하나의 변수가 글로벌 변수임을 확실하게 지정하기 위해서는, 변수 이름 앞에 GLOBAL 또는 @@global. 를 앞세운다. 글로벌
SET 명령문은 다중 변수 지정문을 가질 수 있는데, 각각은 콤마(,)로 구분된다. 여러분이 여러 개의 시스템 변수를 설정한다면, 명령문
안에 있는 가장 최신의 GLOBAL 또는 SESSION 수정자가 뒤따라 오는 수정자가 지정되지 않은 변수를 위해 사용된다..
예제:
SET sort_buffer_size=10000;
SET @@local.sort_buffer_size=10000;
SET @@sort_buffer_size=1000000;
여러분이 SET를 가지고 시스템 변수의 값을 지정할 때, 변수 값의 접미사는 사용할 수가 없다 (스타트 업 옵션에서 사용한 것과 같이).
하지만, 그 값은 하나의 수식 형태로 나타낼 수는 있다:
여러분이 세션 시스템 변수를 변경한다면, 그 값은 여러분이 세션을 종료하거나 또는 그 세션 변수의 값을 다른 것을 변경하기 전까지 그
대로 유지가 된다. 변수 값의 변경은 다른 클라이언트에는 보여지지 않는다.
글로벌 변수를 변경한다면, 서버가 재 구동 되기 전까지 변경된 값이 기억되고 새로운 접속에서 사용될 것이다. (글로벌 변수를 영구적
인 값으로 만들기 위해서는, 그 값을 옵션 파일에서 설정을 해야 한다.) 이렇게 변경된 값은 글로벌 변수에 접근하는 모든 클라이언트가
볼 수 있게 된다. 하지만, 변경 사항은 글로벌 변수 변경 후에 접속을 하는 클라이언트의 세션 변수에만 영향을 주게 된다. 글로벌 변수
의 변경 내용은 이미 기존에 접속을 하고 있는 클라이언트의 세션 변수에는 어떠한 영향도 주지 못한다 (클라이언트가 SET GLOBAL
명령문을 입력한다고 하더라도 마찬가지임).
올바르지 않게 사용하는 것을 방지하기 위해서, MySQL은 SET GLOBAL이 SET SESSION 을 가지고서 만 사용되는 변수와 함께 사
용되거나 또는 글로벌 변수를 설정할 때 GLOBAL (또는 @@global.)를 사용하지 않을 경우에는 에러를 발생 시킨다.
SESSION 변수를 GLOBAL 값으로 설정하거나 또는 GLOBAL 값을 컴파일된 MySQL 디폴트 값으로 설정하기 위해서는, DEFAULT
키워드를 사용한다. 예를 들면, 아래의 두 명령문은 max_join_size의 세션 값을 글로벌 값으로 설정하는데 있어서 동일한 것들이다:
SET max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;
모든 시스템 변수가 DEFAULT로 설정되는 것은 아니다. 어떤 경우에는, DEFAULT를 사용하는 것이 에러를 만들 수도 있다.
여러분이 수식 안에 있는 시스템 변수를 @@var_name로 참조할 때(즉, @@global. 또는 @@session.를 지정하지 않을 때), MySQL
은 세션 값이 존재하면 그것을 리턴하고 아니면 글로벌 값을 리턴한다. (이것은 SET @@var_name = value와는 다른 것인데, 이것은
항상 세션 값을 참조하는 것이다.)
Note: 어떤 시스템 변수들은 ON 또는 1으로 설정을 해서 SET 명령문을 활성화 시키거나 또는 OFF 또는 0으로 설정을 해서 비활성화
시킬 수가 있다. 하지만, 이 같은 변수들을 명령어 라인 또는 옵션 파일에서 설정하기 위해서는, 반드시 1 또는 0으로 설정을 해야 한다;
ON 또는 OFF으로 설정하는 것은 동작하지 않는다. 예를 들면, 명령어 라인에서, --delay_key_write=1은 동작을 하지만 --
delay_key_write=ON는 그렇지 못하게 된다.
+--------+--------------------------------------------------------------+
| Variable_name | Value |
+--------+--------------------------------------------------------------+
| auto_increment_increment |1 |
| auto_increment_offset |1 |
| automatic_sp_privileges | ON |
| back_log | 50 |
| basedir |/ |
| bdb_cache_size | 8388600 |
| bdb_home | /var/lib/mysql/ |
| bdb_log_buffer_size | 32768 |
| bdb_logdir | |
| bdb_max_lock | 10000 |
| bdb_shared_data | OFF |
| bdb_tmpdir | /tmp/ |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
...
| innodb_additional_mem_pool_size | 1048576 |
| innodb_autoextend_increment |8 |
| innodb_buffer_pool_awe_mem_mb | 0 |
| innodb_buffer_pool_size | 8388608 |
| innodb_checksums | ON |
| innodb_commit_concurrency |0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
...
| version | 5.0.19-Max |
| version_compile_machine | i686 |
| version_compile_os | pc-linux-gnu |
| wait_timeout | 28800 |
+--------+--------------------------------------------------------------+
LIKE 구문과 함께 사용하면, 명령문은 패턴이 일치하는 변수의 값들만 출력하게 된다. 특정 변수의 이름을 얻기 위해서는, LIKE 구문
을 아래와 같이 사용한다:
이름이 일치하는 변수의 리스트를 얻기 위해서는, LIKE 구문 안에 ‘%’ 와일드카드 문자를 사용한다:
와일드카드 문자는 매치 시키고자 하는 패턴 안에 어느 위치에서도 사용할 수가 있다. 엄밀하게 말한다면, ‘_’ 는 모든 단일 문자를 매
치를 시키는 와일드카드 문자이기 때문에, 문자 그대로 이것을 매치 시키고자 한다면 ‘₩_’ 형태로 사용해야 한다. 실제로는, 거의 필
요하지가 않다.
SHOW VARIABLES에 대해서는, 여러분이 GLOBAL 또는 SESSION중에 어느 것도 지정을 하지 않으면, MySQL은 SESSION 값을
리턴 한다.
GLOBAL 변수만을 설정할 때에 GLOBAL 키워드를 요청하고 글로벌 변수에서 값을 추출할 때에는 요청하지 않는 이유는 이후 버전에
서 나올 수 있는 문제들을 피하기 위해서이다. 우리가 GLOBAL 변수와 똑 같은 이름을 사용하는 SESSION 변수를 삭제했다면,
SUPER 권한을 가지고 있는 클라이언트는 자신의 접속을 위한 SESSION 변수가 아닌 GLOBAL 변수가 우연히 변경될 수도 있었을 것
이다. 만약에 GLOBAL 변수와 똑 같은 이름을 가지고서 SESSION 변수를 추가 한다면, 자신의 변경된 SESSION 변수만을 찾고자 했
던 클라이언트는 GLOBAL 변수를 변경하려고 할 것이다.
제목검색
5. 데이터 베이스 관리 구조 변수(structured variable)는 정규 시스템 변수(regular system variable)와는 두 가지 측면에서 서로 다르다:
5.2. mysqld — MySQL 서버
5.2.3 시스템 변수 사용하기 ● 이 변수의 값은 밀접하게 관련되었다고 간주되는 서버 파라미터를 지정하는 요소들을 가지고 있는 구조이다.
● 구조 변수의 주어진 타입에는 여러 가지 인스턴스가 있을 수 있다. 각 인스턴스는 서로 다른 이름을 가지며 서버가 관리하
5.2.3.1 구조(structured) 시스템 변수
5.2.3.2 동적(dynamic) 시스템 변수 는 서로 다른 자원들을 참조한다.
MySQL 5.0은 하나의 구조 변수 타입을 지원하는데, 이것은 키 캐시의 동작을 관장하는 파라미터를 지정한다. 하나의 키 캐시 구
조 변수는 다음의 요소들을 가지고 있다:
● key_buffer_size
● key_cache_block_size
● key_cache_division_limit
● key_cache_age_threshold
이 섹션에서는 구조 변수를 참조하기 위한 신텍스를 설명한다. 키 캐시 변수들은 신텍스 예제들에서 사용되지만, 키 캐시가 어떻게
동작하는지에 대한 상세 설명은 다른 곳에서 찾아 볼 수가 있다.Section 7.4.6, “MyISAM 키 캐시”를 참조할 것.
hot_cache.key_buffer_size
hot_cache.key_cache_block_size
cold_cache.key_cache_block_size
각각의 구조 시스템 변수에 대해서는, default 이름을 가진 하나의 인스턴스가 먼저 정의 된다. 아무런 인스턴스의 이름을 사용하
지 않고 구조 변수의 컴퍼넌트를 참조할 경우에는, default 인스턴스가 사용되게 된다. 따라서, default.key_buffer_size 와
key_buffer_size 는 둘 다 동일한 시스템 변수를 참조하게 된다.
● 주어진 구조 변수의 타입에 대해서는, 각 인스턴스는 반드시 그 타입의 변수 안에서 고유의 이름을 가져야 한다. 하지만, 인
스턴스 이름은 구조 변수 타입 전체에서 유일한 이름을 사용할 필요는 없다. 예를 들면, 각 구조 변수는 default라는 이름
현재까지의 버전으로는, 위의 처음 두 가지 규칙에 대해서는 혼란이 없는데, 그 이유는 구조 변수 타입만이 키 캐시를 위한 것이기
때문이다. 이러한 규칙들은 다른 구조 변수들이 향후에 생성되어 진다면 보다 중요성이 증대될 것이다.
한가지 예외적인 것은, 단순한 변수 이름이 나타나는 문장에서 컴퍼넌트 이름을 사용해서 구조 변수의 컴퍼넌트를 참조할 수가 있
다는 것이다. 예를 들면, 여러분은 명령어 라인 옵션을 사용해서 구조 변수의 값을 지정할 수가 있게 된다:
[mysqld]
hot_cache.key_buffer_size=64K
서버가 이 옵션을 가지고 구동된다면, 서버는 8MB의 디폴트 크기를 가지고 있는 디폴트 키 캐시와 더불어서 64KB 크기의
hot_cache라는 이름의 키 캐시를 생성하게 된다.
--extra_cache.key_buffer_size=128K ₩
--extra_cache.key_cache_block_size=2048
이와 같은 경우에는, 서버는 디폴트 키 캐시의 트기를 256KB로 설정하게 된다. (--default.key_buffer_size=256K처럼 작성할
수도 있다) 부가적으로, 서버는 the server creates a second key cache named extra_cache 라는 이름의 두 번째 키 캐시를
128KB의 크기로 생성을 하는데, 이 크기는2048 바이트로 설정되는 테이블 인덱스 블록을 캐싱 하기 위한 블록 버퍼의 크기이다.
아래의 예제는 서버를 크기가 3:1:1의 비율로 되어 있는 세 개의 서로 다른 키 캐시를 가지고 시작되도록 하는 것이다:
--hot_cache.key_buffer_size=2M ₩
--cold_cache.key_buffer_size=2M
구조 변수 값은 런타임 시에도 설정 및 추출을 할 수가 있다. 예를 들면, hot_cache 라는 이름의 키 캐시를 10MB 크기로 설정하기
위해서는, 아래의 명령문 중에 하나를 사용한다:
하지만, 아래의 명령문은 실행되지 않는다. 여기에서 사용된 변수는 컴퍼넌트의 이름으로 해석되는 것이 아니고, LIKE 패턴-매칭
동작을 위한 단순한 스트링으로 해석이 되어 버린다:
제목검색
5. 데이터 베이스 관리 많은 서버 시스템 변수들이 동적 변수이며 런타임 시에 SET GLOBAL 또는 SET SESSION를 사용해서 설정
5.2. mysqld — MySQL 서버 될 수 있다. 여러분은 SELECT를 사용해서 그 값을 얻을 수도 있다. Section 5.2.3, “시스템 변수 사용하
제목검색
상위메뉴리스트 ◆ 5.2.4. 서버 상태 변수
5. 데이터 베이스 관리 서버는 자신의 동작에 대한 정보를 제공하는 많은 상태 변수를 관리한다. 여러분은 이러한 변수와 값들을 SHOW STATUS 명령문
5.2. mysqld — MySQL 서버 을 사용해서 볼 수가 있다:
5.2.4 서버 상태 변수
mysql> SHOW STATUS;
+-----------------------------------+------------+
| Variable_name | Value |
+-----------------------------------+------------+
| Aborted_clients |0 |
| Aborted_connects |0 |
| Bytes_received | 155372598 |
| Bytes_sent | 1176560426 |
...
| Connections | 30023 |
| Created_tmp_disk_tables |0 |
| Created_tmp_files |3 |
| Created_tmp_tables |2 |
...
| Threads_created | 217 |
| Threads_running | 88 |
| Uptime | 1389872 |
+-----------------------------------+------------+
상태 변수는 아래와 같은 의미를 가지고 있다. 아무런 버전 정보가 없는 변수들은 5.0 이전 버전에서부터 있었던 것들이다
● Aborted_clients
클라이언트가 올바르게 닫히지 않고 멈추었기 때문에 중단된 접속의 숫자. Section A.2.10, “Communication Errors
and Aborted Connections”를 참조.
● Aborted_connects
MySQL 서버에 접속을 시도했으나 실패한 횟수. Section A.2.10, “Communication Errors and Aborted
Connections”를 참조.
● Binlog_cache_disk_use
● Binlog_cache_use
● Bytes_received
● Bytes_sent
● Com_xxx
Com_xxx 명령문 카운터 변수는 각 xxx 명령문이 실행된 횟수를 가리킨다. 각 명령문 타입에 대해서는 하나의 상태 변수
가 존재한다. 예를 들면, Com_delete과 Com_insert는 DELETE과 INSERT 명령문을 각각 카운트 한다.
Com_stmt_xxx 상태 변수는 5.0.8에 추가 되었다:
❍ Com_stmt_prepare
❍ Com_stmt_execute
❍ Com_stmt_fetch
❍ Com_stmt_send_long_data
❍ Com_stmt_reset
❍ Com_stmt_close
PREPARE에 대해서 각각 증가를 하게 된다. 부가적으로, 이전 버전의 명령문 카운터 변수(4.1.3 이후에 사용된 것들)인
Com_prepare_sql, Com_execute_sql, 그리고 Com_dealloc_sql의 값들도 PREPARE, EXECUTE, 및 DEALLOCATE
PREPARE 명령문에 대해서 증가를 하게 된다. Com_stmt_fetch은 커서로부터 가져(fetching)될 때 생기는 네트워크 라
운드-트립(round-trip)의 전체 숫자를 표현하게 된다.
Com_stmt_xxx 변수의 모든 것들은 프리페어드 명령문 이슈가 알려져 있지 않거나 또는 실행하는 동안 에러가 발생되더
라도 증가를 한다. 다른 말로 표현하면, 이들 변수의 값들은 발생된 요청의 숫자에 대응하는 것이지, 성공적으로 완료가
된 요청의 숫자에 대응되는 것이 아니다.
● Compression
● Connections
● Created_tmp_disk_tables
● Created_tmp_files
● Created_tmp_tables
서버가 명령문을 실행할 때 자동으로 생성되는 메모리에 있는 임시 테이블의 숫자. Created_tmp_disk_tables이 크다면,
tmp_table_size 변수의 값을 늘려서 임시 테이블이 디스크가 아닌 메모리에 들어 가도록 하길 원할 수도 있다.
● Delayed_errors
에러를 발생 시키는 것에 대해(아마도 duplicate key) INSERT DELAYED를 사용해서 쓰여진 줄의 숫자.
● Delayed_insert_threads
● Delayed_writes
● Flush_commands
● Handler_commit
● Handler_discover
MySQL 서버는 주어진 이름을 가진 테이블에 대한 정보를 NDB Cluster 스토리지 엔진에 요청할 수 있다. 이것을 디스커
버리(discovery)라고 부른다. Handler_discover는 테이블들이 이 메커니즘을 통해서 몇 번이나 발견되었는지를 나타낸
다.
● Handler_delete
● Handler_read_first
첫 번째 엔트리가 인덱스에서 읽혀진 횟수. 이 값이 크다면, 서버는 많은 수의 전체 인덱스 스캔을 실행하고 있음을 의미하
는 것이다; 예를 들면, SELECT col1 FROM foo에서, col1은 인덱스 된 것으로 간주된다.
● Handler_read_key
● Handler_read_next
● Handler_read_prev
키 순서에서 이전 줄을 읽기 위한 요청의 숫자. 이러한 읽기 방식은 주로ORDER BY ... DESC를 최적화 시키기 위해 사용
된다.
● Handler_read_rnd
● Handler_read_rnd_next
● Handler_rollback
● Handler_update
● Handler_write
● Innodb_buffer_pool_pages_data
● Innodb_buffer_pool_pages_dirty
● Innodb_buffer_pool_pages_flushed
● Innodb_buffer_pool_pages_free
● Innodb_buffer_pool_pages_latched
InnoDB 버퍼 풀에 있는 latched 페이지의 숫자. 이것은 현재 읽히고 있거나 또는 쓰여지고 있거나 또는 여러 가지 이유로
인해 플러시 될 수 없거나 또는 삭제할 수 없는 페이지들을 가리킨다. MySQL 5.0.2에 추가 됨.
● Innodb_buffer_pool_pages_misc
● Innodb_buffer_pool_pages_total
● Innodb_buffer_pool_read_ahead_rnd
InnoDB에 의해 초기화 되는 “무작위(random)” read-aheads의 숫자. 이것은 쿼리가 테이블의 많은 부분을 무작위 순
서로 스캔 할 때 발생된다. MySQL 5.0.2에서 추가 됨.
● Innodb_buffer_pool_read_ahead_seq
InnoDB에 의해 초기화 되는 시퀀셜 read-aheads의 숫자. 이것은 InnoDB가 시퀀셜로 전체 테이블을 스캔할 때 발생한
다. MySQL 5.0.2에서 추가 됨.
● Innodb_buffer_pool_read_requests
● Innodb_buffer_pool_reads
InnoDB가 버퍼 풀에서 찾지를 못하고 단일 페이지 읽기를 해야만 하는 논리적 읽기 횟수. MySQL 5.0.2에 추가 됨.
● Innodb_buffer_pool_wait_free
일반적으로는, 백그라운드에서 발생된 InnoDB 버퍼 풀에 쓰기를 한다. 하지만, 페이지를 읽거나 또는 생성하는 것이 필요
하고 어떠한 페이지도 깨끗이 만드는 것이 불가능 하다면, 페이지가 처음으로 플러시 되는 것도 역시 기다려야 한다. 이 카
운터는 이러한 대기 인스턴스를 카운트 한다. 버퍼 풀의 크기가 올바르게 설정 되었다면, 이 값은 작을 것이다. MySQL
5.0.2에서 추가 됨.
● Innodb_buffer_pool_write_requests
● Innodb_data_fsyncs
● Innodb_data_pending_fsyncs
현재 지연되고 있
제목검색
5. 데이터 베이스 관리 MySQL 서버는 서로 다른 SQL 모드 상태에서 동작할 수가 있고, 그리고 서로 다른 클라이언트에 대해 이러한 모드들을 다르게 적
5.2. mysqld — MySQL 서버 용할 수가 있다. 이러한 능력은 각 어플리케이션들이 서버의 동작 모드를 따라서 자신의 요구 사항을 처리할 수 있게 해 준다.
5.2.5 서버 SQL 모드
모드는 어떤 SQL 신텍스를 MySQL이 지원하고 있는지 그리고 데이터의 유효성(Validation)을 검사하는 방법은 무엇이 있는지를
가리킨다. 이것은 MySQL을 서로 다른 환경에서 사용하는 것을 손쉽게 만들어 주며 그리고 다른 데이터 베이스 서버와 함께
MySQL을 사용하는 것이 가능하도록 만들어 준다.
디폴트 SQL 모드 설정은 mysqld을 --sql-mode="modes" 옵션과 함께 구동 시켜서 할 수가 있다. modes 는 콤마(,)로 구분되
는 서로 다른 모드의 리스트이다. 디폴트 값은 비어 있다(empty) (아무런 모드고 설정되어 있지 않다). 만약에 확실하게 비어둘 생
각이라면, modes 값도 역시 비어 둘 수 있다 (--sql-mode="").
SELECT @@global.sql_mode;
SELECT @@session.sql_mode;
● ANSI
● STRICT_TRANS_TABLES
만약에 트랜젝션 테이블 속으로 값을 주어진 형태로 삽입할 수가 없다면, 명령문을 중단한다. 논-트랜젝션(non-
transactional) 테이블에 대해서는, 그 값이 단일-줄 명령문 또는 다중-줄 명령문의 맨 처음 줄에 나오게 되면 명령문을
중단한다. 보다 자세한 설명은 이 섹션 후반부에 하기로 한다. (MySQL 5.0.2에서 구현됨.)
● TRADITIONAL
MySQL의 동작을 마치 “전통적인(traditional)” SQL 데이터 베이스 시스템처럼 구동되도록 만든다. 올바르지 않은 값
을 컬럼에 삽입할 때 이 모드에 대한 간단한 설명이 “경고문 대신에 에러로 나온다(give an error instead of a
warning)”. Note: INSERT/UPDATE 는 에러가 발생되는 즉시 중단된다. 이것은 여러분이 논-트랜젝션(non-
transaction) 스토리지 엔진을 사용한다면 원하는 결과가 아닐 것인데, 왜냐하면 에러 이전에 수행된 데이터 변경은 롤백
(rolled-back)되지 않고, 그 결과 ‘부분적으로 수행된(partially done)”업데이트가 되기 때문이다. (MySQL 5.0.2에
추가 됨)
● ALLOW_INVALID_DATES
전체 날짜를 검사하지 않는다. 월(month)이 1에서 12 사이와 일자가 1에서31일 사이인 것들만 검사한다. 이것은 여러분
이 년, 월, 그리고 날짜(day)를 세 개의 필드에서 얻고 사용자가 삽입하는(날짜 유효 없이) 것을 정확하게 저장하고자 하
는 웹 어플리케이션에서 유용하게 사용할 수 있다. 이 모드는 DATE 와 DATETIME 컬럼에 적용된다. 이것은
TIMESTAMP 컬럼에는 적용되지 않는데, 이 컬럼은 유효한 날짜를 필요로 한다
이 모드는 MySQL 5.0.2에서 추가 되었다. 5.0.2 이전에는, 이것이 디폴트 MySQL 날짜-핸들링 모드였다. 5.0.2 이후에
는, 서버는 월(month)와 날짜(day) 값이, 단순히 1에서 12 사이와 1에서 31 사이의 값이 아닌, 규칙에 맞아야 하는 것을
요구한다. 스트릭트 모드를 비활성화 시키면, '2004-04-31' 과 같은 유효하지 않은 값은 '0000-00-00'로 변환 되고
경고문을 내보내게 된다. 스트릭트 모드를 활성화 시키면, 유효하지 않은 날짜 값은 에러를 발생 시킨다. 이러한 날짜 값
● ANSI_QUOTES
‘"’를 구분자 인용 부호 문자로 다루고 (‘`’ 인용 부호 문자 처럼) 스트링 인용 문자로 다루지 않는다. 여러분은 이 모
드에서도 여전히 ‘`’를 인용 구분자로 사용할 수가 있다. ANSI_QUOTES을 활성화 시키면, 이중 인용 부호를 사용해
서 문자 스트링을 인용할 수는 없게 되는데, 그 이유는 그것이 구분자로 해석되기 때문이다.
● ERROR_FOR_DIVISION_BY_ZERO
● HIGH_NOT_PRECEDENCE
MySQL 5.0.2 이후에, NOT 연산자의 우선권은 NOT a BETWEEN b AND c 와 같은 수식에서는 NOT (a BETWEEN
b AND c)와 같이 분석(parse)된다. MySQL 5.0.2 이전에는, 수식은 (NOT a) BETWEEN b AND c 과 같이 분석되었
다. 이전버전과 같은 우선권 동작은 HIGH_NOT_PRECEDENCE SQL 모드를 활성화 시키면 된다. (MySQL 5.0.2에서
추가됨)
-> 0
-> 1
● IGNORE_SPACE
함수 이름과 ‘(’ 문자 사이에 스페이스를 허용한다. 이것은 모든 함수 이름이사용 지정된(reserved) 단어로 취급되도
록 한다. 그 결과, 만약에 어떤 데이터 베이스, 테이블, 또는 사용 지정된 컬럼 이름에 여러분이 엑세스 하고자 한다면, 반
드시 그것을 인용 부호화 해야 한다. 예를 들면, USER() 라는 함수가 존재하기 때문에, mysql 데이터 베이스에 있는
user 테이블과 그 테이블 안에 있는 User 컬럼은 사용 지정 되는데, 따라서 그것들은 인용 부호로 둘러 쌓여야 한다:
IGNORE_SPACE SQL 모드는 빌트인(built-in) 함수에 적용 되며, 스토어드 루틴에는 적용되지 않는다. 루틴 이름 다음
에 스페이스를 가지는 것은 항상 가능한데, IGNORE_SPACE가 활성화 되어 있는지 와는 상관이 없게 된다.
● NO_AUTO_CREATE_USER
● NO_AUTO_VALUE_ON_ZERO
● NO_DIR_IN_CREATE
테이블을 생성할 때, 모든 INDEX DIRECTORY 와 DATA DIRECTORY 디렉토리를 무시한다. 이 옵션은 슬레이브 리플
리케이션 서버에서 유용하다.
● NO_ENGINE_SUBSTITUTION
CREATE TABLE와 같은 명령문이 비활성화 되었거나 또는 컴파일 되지 않은 스토리지 엔진을 지정할 때, 디폴트 스토리
지 엔진으로 자동 대체 되는 것을 막는다. (MySQL 5.0.8에서 구현됨)
● NO_FIELD_OPTIONS
SHOW CREATE TABLE의 결과에 MySQL-특성 컬럼 옵션을 프린트 하지 않는다. 이 모드는 포터빌러티(portability)
모드에서 mysqldump에 의해 사용된다.
● NO_KEY_OPTIONS
SHOW CREATE TABLE의 결과에 MySQL-특성 인덱스 옵션을 프린트 하지 않는다. 이 모드는 포터빌러티
(portability) 모드에서 mysqldump에 의해 사용된다.
● NO_TABLE_OPTIONS
SHOW CREATE TABLE의 결과에 MySQL-특성 테이블 옵션(ENGINE와 같은)을 프린트 하지 않는다. 이 모드는 포
터빌러티(portability) 모드에서 mysqldump에 의해 사용된다.
● NO_UNSIGNED_SUBTRACTION
다. 이것은 BIGINT UNSIGNED 을 모든 문장에서 100% 사용 가능하도록 만들지 않는다는 것을 알아두기 바란다.
Section 12.8, “Cast Functions and Operators”를 참조할 것
● NO_ZERO_DATE
스트릭트 모드에서, '0000-00-00' 를 유효한 날짜 표시 방법으로 만들지 않는다. 여러분은 여전히 IGNORE 옵션을 사
용해서 제로 날짜를 입력할 수 있게 된다. 스트릭트 모드가 아닐 때에는, 이러한 날짜는 경고는 발생되기는 하지만 수용된
다. (MySQL 5.0.2에서 추가됨)
● NO_ZERO_IN_DATE
스트릭트 모드에서, 월 또는 날짜 부분이 0 인 날짜는 받아들이지 않는다. 만약에 IGNORE 옵션이 사용된다면, MySQL
은 '0000-00-00' 날짜를 이러한 날짜에 삽입한다. 스트릭트 모드가 아닌 경우에는, 이러한 날짜는 경로를 만들기는 하지
만 사용 가능하다. (MySQL 5.0.2에 추가됨)
● ONLY_FULL_GROUP_BY
● PIPES_AS_CONCAT
● REAL_AS_FLOAT
REAL를 FLOAT에 대한 동의어로 다룬다. 디폴트로는, MySQL은 REAL을 DOUBLE의 동의어로 처리한다.
● STRICT_ALL_TABLES
모든 스토리지 엔진에 대해 스트릭트 모드를 활성화 시킨다. 유효하지 않은 데이터는 거절 된다. 추가적인 설명은 나중에
한다(MySQL 5.0.2에 추가됨)
● STRICT_TRANS_TABLES
논-트랜젝션 스토리지 엔진이 사용 가능할 때, 트랜젝션 스토리지 엔진에 대한 스트릭트 모드를 활성화 시킨다. 부가적인
설명은 나중에 한다. (MySQL 5.0.2에서 구현됨)
스트릭트 모드는 MySQL가 유효하지 않거나 누락된(missing) 데이터를 처리하는 방법을 제어한다. 하나의 값은 여러 가지 이유
로 유효하지 않게 된다. 예를 들면, 컬럼에 대해 틀린 데이터 타입을 가질 수가 있거나, 또는 범위를 벗어날 수도 있다. 삽입될 새로
운 줄이 확실한 DEFAULT 구문을 자신의 정의문안에 가지고 있지 않는 컬럼에 대한 값을 가지고 있지 않을 때 데이터는 누락되
게 된다.
제목검색
클라이언트 접속과 관련이 있는 각각의 쓰레드에 대해서는, 클라이언트에 대한 접속은 깨지게 되고 쓰레드는 킬드(killed)
로 표시가 된다. 쓰레드는 자신들이 이렇게 표시되는 것을 인지하게 되면 종료를 하게 된다. 아이들(idle)접속에 대한 쓰레
제목검색
5. 데이터 ● 윈도우의 경우, MySQL 바이너리 배포판은 표준 서버(mysqld.exe)와 MySQL-Max 서버(mysqld-max.exe)를 동시에 포함하고 있다. Section 2.3, “윈도우에 MySQL 설치하
베이스 관 기”를 참조.
리
● 리눅스의 경우, 만약에 MySQL을 RPM 배포판으로 설치한다면, MySQL-Max RPM 은 여러분이 이미 레귤러 서버 RPM을 설치해 놓았다고 추정을 한다. 우선, 레귤러 MySQL-
5.3. server RPM을 사용해서 mysqld를 설치한 다음에, MySQL-Max RPM을 사용해서 mysqld-max를 설치한다. Section 2.4, “리눅스에 MySQL 설치하기”를 참조.
mysqld-
● 다른 모든 MySQL-Max 배포판은 mysqld라는 이름의 단일 서버를 가지고 있지만 부가적인 기능들도 함께 포함되어 있다.
max 확
장
여러분은 MySQL-Max 바이너리 배포판을 http://dev.mysql.com/downloads/에서 얻을 수 있다.
MySQL
MySQL AB사는 MySQL-Max 서버를 아래와 같은 configure 옵션을 사용해서 구축하였다:
서버
5.3 mysqld-
● --with-server-suffix=-max
max 확장
MySQL
서버 이 옵션은 -max 접미사를 mysqld 버전 스트링에 추가한다.
● --with-innodb
이 옵션은 InnoDB 스토리지 엔진 지원을 활성화 시킨다. MySQL-Max 서버는 항상 InnoDB 지원을 포함하고 있다. MySQL 4.0 이후로 지금까지, InnoDB는 모든 바이너리 배포판에
디폴트로 포함되어 있기 때문에, 모든 MySQL-Max 서버는 별도의 InnoDB 지원을 가질 필요가 없게 된다.
● --with-bdb
이 옵션은 BDB를 사용하고 있는 플랫폼상의 버클리DB (BDB) 스토리지 엔진을 지원하도록 만든다.
● --with-blackhole-storage-engine
● --with-csv-storage-engine
● --with-example-storage-engine
● --with-federated-storage-engine
● --with-ndbcluster
이 옵션은 클러스터가 사용중에 있는 플랫폼상의 NDB Cluster 스토리지 엔진을 지원하도록 만든다.
● USE_SYMDIR
이것은 윈도우를 지원하기 위한 데이터 베이스 심볼릭 링크를 구동시킨다. 4.0 이후로는, 심볼릭 링크 지원은 모든 윈도우 서버를 지원하고 있기 때문에, MySQL-Max 서버는 이것을
사용할 필요가 없다.
MySQL-Max 바이너리 배포판은 미리 컴파일된 프로그램을 사용하고자 하는 사용자들에게는 매우 편리한 제품이다. 만약에 여러분이 소스 배포판을 사용해서 MySQL을 구축하고자 한다면,
서버 구성시에 MySQL-Max 바이너리 배포판이 가지고 있는 특징과 동일한 것들을 활성화 시킴으로서 MySQL-Max 서버와 비슷하게 MySQL 서버를 스스로 구축할 수도 있다
MySQL-Max 서버에는 BerkeleyDB (BDB) 스토리지 엔진이 포함되어 있으나, 모든 플랫폼이 BDB를 지원하는 것은 아니다.
현재, MySQL 클러스터는 리눅스(대부분의 플랫폼), Solaris, Mac OS X, 그리고 HP-UX만 지원하고 있다. 몇몇 사용자들이 소스 코드를 사용해서 BSD OS에 MySQL 클러스터를 성공적으
로 설치하였다고 보고하였으나, 아직까지는 공식적으로는 지원을 하지 않고 있다. 서버가 클러스터를 지원하게끔 컴파일 되었다고 하더라도, NDB Cluster 스토리지 엔진은 디폴트로는 활성화
되지 않는다는 점을 알아두기 바란다. 여러분은 서버를 --ndbcluster 옵션을 사용해서 구동 시켜서 이것이 MySQL 클러스터의 일부분으로 사용하도록 만들어 주어야 한다. (자세한 내용은,
Section 15.4, “MySQL 클러스터 구성”을 참조할 것.)
아래의 테이블은 BDB 와 NDB Cluster를 지원하는 MySQL-Max 바이너리 배포판에 대한 플랫폼을 보여주고 있다.
AIX 5.2 N N
HP-UX Y Y
Linux-IA-64 N Y
Linux-Intel Y Y
Mac OS X N Y
NetWare N N
SCO 6 N N
Solaris-SPARC Y Y
Solaris-Intel N Y
Solaris-AMD 64 Y Y
Windows NT/2000/XP Y N
여러분의 서버가 지원하는 스토리지 엔진이 어떤 것인지 확인하기 위해서는, SHOW ENGINES 명령문을 사용한다. (Section 13.5.4.10, “SHOW ENGINES 신텍스”를 참조.) 예를 들면:
mysql> SHOW ENGINES₩G
*************************** 1. row ***************************
Engine: MyISAM
Support: DEFAULT
Comment: Default engine as of MySQL 3.23 with great performance
*************************** 2. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
*************************** 3. row ***************************
Engine: InnoDB
Support: YES
Comment: Supports transactions, row-level locking, and foreign keys
*************************** 4. row ***************************
Engine: BerkeleyDB
Support: NO
Comment: Supports transactions and page-level locking
*************************** 5. row ***************************
Engine: BLACKHOLE
Support: YES
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=4&scate=0&idx=14572006-08-03 오후 4:18:00
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 mysqld_safe는 유닉스와 넷웨어에서 mysqld 서버를 구동 시키는 권장 방법이다. mysqld_safe는 에러가 발생했을 때 서버를 재
5.4. MySQL 서버 스타트업 프로그램 구동 시키고 런타임 정보를 에러 로그에 기록하는 것과 같은 안전 기능을 추가로 가지고 있다. NetWare-특성 동작은 이 섹션 후
디폴트로, mysqld_safe는 mysqld-max가 존재하면 이것을 시작할려고 시도하며, 존재하지 않으면 mysqld를 시도한다. 이러한
동작 구현에 대해서는 잘 숙지해야 한다:
● 리눅스에서는, MySQL-Max RPM은 이 mysqld_safe의 동작에 의존한다. RPM 은 mysqld-max를 설치하는데, 이것은
mysqld가 아닌 mysqld_safe를 자동으로 실행 가능하도록 사용한다.
● 여러분이 mysqld-max 라는 이름의 서버를 포함하고 있는 MySQL-Max 배포판을 설치했고, 그 다음에 MySQL의 non-
Max으로 업그레이드를 했다면, mysqld_safe 는 여전히 mysqld-max 서버를 구동 시키려는 시도를 할 것이다. 만약에 여
러분이 이러한 업그레이드를 했다면, 수동으로 구형 mysqld-max를 삭제해서 mysqld_safe 가 새로운 mysqld 서버를 구
동 시키게끔 해야 한다.
디폴트 동작을 없애고 여러분이 원하는 서버의 이름을 명확하게 지정하기 위해서는, --mysqld 또는 --mysqld-version 옵션
을 mysqld_safe에 지정한다. 또한 –ledir를 사용해서 mysqld_safe가 서버를 찾는 디렉토리를 지정하도록 할 수도 있다.
mysqld_safe에 대한 많은 옵션들은 mysqld에 대한 옵션들과 모두 동일하다. Section 5.2.1, “mysqld 명령어 옵션”을 참조할
것.
명령어 라인에서 mysqld_safe에 지정되는 모든 옵션들은 mysqld에 패스 된다. 만약에 mysqld_safe에만 해당되고 mysqld은 지
원하지 않는 옵션을 사용하고자 한다면, 명령어 라인에서 그것들을 지정하지 않으면 된다. 대신에, 옵션 파일 그룹의
mysqld_safe는 옵션 파일의 [mysqld], [server], 그리고 [mysqld_safe] 섹션에서 모든 것을 읽는다. 이전 버전과의 호환성을 위
해서, 여러분이 5.0 설치시에 [safe_mysqld] 섹션을 [mysqld_safe] 로 재 명영했다고 하더라도 이 섹션도 함께 읽게 된다.
● --help
● --autoclose
● --basedir=path
● --core-file-size=size
● --datadir=path
● --defaults-extra-file=path
일반적인 옵션 파일에 추가하여 읽혀 지는 옵션 파일의 이름. 이것이 사용될 경우에는 반드시 명령어 라인 처음에 나와야
한다.
● --defaults-file=file_name
일반적인 옵션 파일 대신에 읽혀 지는 옵션 파일의 이름. 만약에 사용될 경우에는명령어 라인의 첫 번째 옵션이 되어야 한
다.
● --ledir=path
mysqld_safe가 서버를 찾지 못할 경우, 이 옵션을 사용하여 서버가 저장되어 있는디렉토리의 경로 이름을 표시한다.
● --log-error=file_name
● --mysqld=prog_name
여러분이 시작하고자 하는 서버 프로그램의 이름(ledir 디렉토리에 있음. 이 옵션은여러분이 바이너리 배포판을 사용하고
있지만 데이터 디렉토리가 바이너리 배포판이 아닌 곳에 있는 경우에 필요하게 된다. 만약에 mysqld_safe가 서버를 찾지
못할 경우, --ledir 옵션을 사용해서 서버가 저장되어 있는 디렉토리의 경로 이름을 표시하도록 한다.
● --mysqld-version=suffix
이 옵션은 --mysqld 옵션과 비슷하지만, 여러분은 서버 프로그램 이름에 대한접미사만 지정하면 된다. 베이스 이름은
mysqld라고 여겨진다. 예를 들면, --mysqld-version=max를 사용한다면, mysqld_safe는 ledir 디렉토리에 있는
mysqld-max 프로그램을 구동 하기 시작한다. --mysqld-version에 대한 인수가 비어 있다면, mysqld_safe는 ledir
디렉토리에 있는 mysqld를 사용한다.
● --nice=priority
● --no-defaults
어떠한 옵션 파일도 읽지 않는다. 만약에 이것이 사용될 경우에는 명령어 라인에서첫 번째 옵션이 되어야 한다.
● --open-files-limit=count
mysqld가 열 수 있는 파일의 숫자. 옵션 값은 ulimit –n에 전달 된다. 이것이 올바르게 동작을 하기 위해서는 root로
mysqld_safe를 구동 시켜야 한다!
● --pid-file=file_name
● --port=port_num
서버가 TCP/IP 접속을 기다릴 때 사용하는 포트 번호. 포트 번호는 서버가 root 시스템 사용자로 구동되지 않는 한 반드
시 1024 또는 그 이상 이어야 한다.
● --socket=path
● --timezone=timezone
● --user={user_name | user_id}
“사용자(User)”는 시스템 계정을 참조한 것을 의미하며, 그랜트 테이블안에 있는 MySQL 사용자를 가리키는 것은 아
니다.)
mysqld_safe 스크립트는 보통은 소스 또는 바이너리 배포판을 설치한 서버를 구동 시킬 수 있도록 작성된다. (Section 2.1.5,
“설치 레이 아웃”을 참조할 것.) mysqld_safe는 아래의 조건들 중에 하나가 트루(true)일 것으로 기대한다:
● 서버와 데이터 베이스는 동작하고 있는 디렉토리에 관련되어 찾게 된다 ( mysqld_safe를 호출한 디렉토리에서). 바이너
리 배포판의 경우, mysqld_safe는 자신의 동작 디렉토리 밑에서 bin 과 data 디렉토리를 찾는다. 소스 배포판의 경우,
libexec 와 var 디렉토리를 찾게 된다. 이 조건은 만약에 여러분이 MySQL설치 디렉토리에서 mysqld_safe를 실행 시킨다
면 일치하게 된다 (예를 들면, 바이너리 배포판의 경우 /usr/local/mysql).
● 만약에 서버와 데이터 베이스가 동작중에 있는 디렉토리와 관련되어 찾지 못하게 되면, mysqld_safe는 이것들을 절대 경
로 이름(absolute pathname)을 가지고 저장 시키려고 한다. 전형적인 위치는 /usr/local/libexec 과 /usr/local/var가 된
다. 실제 위치는 배포판이 설치되는 시점에 구성된 값을 가지고 결정된다. 이것들은 만약에 MySQL이 서버 구성시에 지정
된 위치에 설치되어져 있다면 트루(true)가 된다.
Because mysqld_safe는 자신의 동작 디렉토리에 관련하여 서버와 데이터 베이스를 찾으려고 시도하기 때문에, 여러분은
MySQL 설치 디렉토리에서 mysqld_safe를 구동 시키는 한 바이너리 배포판을 어디에도 설치할 수가 있게 된다:
shell> cd mysql_installation_directory
만약에 mysqld_safe가 실패하면, 비록 MySQL 설치 디렉토리에서 호출을 한 경우에라도, 여러분은 --ledir 와 --datadir 옵션
을 지정해서 서버와 데이터 베이스가 저장되어 있는 디렉토리를 가리키도록 할 수 있다.
보통의 경우에는, 여러분은 mysqld_safe 스크립트는 수정하지 말아야 한다. 대신에, my.cnf 옵션 파일의 [mysqld_safe]섹션에
있는 옵션 또는 명령어 라인의 옵션을 사용해서 mysqld_safe를 구성한다. 드문 경우이긴 하지만, mysqld_safe를 직접 편집을 해
서 서버가 올바르게 구동되도록 해야할 경우도 있긴 하다. 하지만, 이렇게 하게 되면, 여러분이 수정한 mysqld_safe이 나중에
MySQL을 업그레이드 할 때 없어지기 때문에, 복사본을 마리 만들어 두어야 한다.
제목검색
5. 데이터 베이스 관리
5.4. MySQL 서버 스타트업 프로그램 유닉스상의 MySQL 배포판은 mysql.server라는 이름의 스크립트를 가지고 있다. 이것은 시스템 서비스를 시작/종료 하는
5.4.2 mysql.server — MySQL 서버 스타트업 스크립트 시스템-V 형태의 구동 디렉토리(System V-style run directory)를 사용하는 리눅스와 솔라리스와 같은 시스템에서 사용
된다. 이것은 또한 MySQL을 위한 Mac OS X 스타트업 아이템에 의해서도 사용된다.
여러분이 소스 배포판을 사용하거나 또는 자동으로 mysql.server를 설치하지 않는 바이너리 배포판을 사용해서 MySQL을
설치한다면, 여러분은 이것을 수동으로 설치해야 한다. 설치 설명서는 Section 2.9.2.2, “자동으로 MySQL 시작하기 및 종
료하기”를 참조할 것.
mysql.server는 옵션 파일의 [mysql.server] 와 [mysqld] 섹션에서 옵션을 읽는다. 이전 버전과의 호환성을 위해서,
[mysql_server] 섹션도 함께 읽게 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=4&scate=2&idx=14592006-08-03 오후 4:18:11
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 mysqld_multi는 다른 유닉스 소켓 파일과 TCP/IP 포트상에서 접속을 기다리는 mysqld 프로세스를 관리하기 위해 디자인 된 것
5.4. MySQL 서버 스타트업 프로그램 이다. 이것은 서버를 시작 또는 종료할 수 있으며, 또는 서버의 현재 상태를 보고할 수도 있다. MySQL 인스턴스 매니저는 다중 서
5.4.3 mysqld_multi — 다중 MySQL 서버 관리 버를 관리하는 것을 달리 의미하는 용어다. (Section 5.5, “mysqlmanager — MySQL 인스턴스 매니저”를 참조할 것).
mysqld_multi 는 my.cnf (또는 --config-file 옵션으로 이름 붙여진 파일)에서 [mysqldN]라는 이름의 그룹을 검색한다. N 는
모든 양수 정수가 될 수 있다. 이 번호는 다음의 섹션에서 옵션 그룹 번호 또는 GNR로 참조될 것이다. 그룹 번호는 각 그룹을 구분
하며 여러분이 시작, 종료, 또는 상태 레포트를 받고자 원하는 서버가 어떤 것인지를 지정하기 위한 mysqld_multi의 인수로서 사용
된다. 이러한 그룹내에 열거되어 있는 옵션들은 mysqld를 구동시키기 위해 사용하는 [mysqld] 그룹내에서 사용하는 것과 동일
한 것들이다. (Section 2.9.2.2, “자동으로 MySQL 시작하기 및 종료하기”를 참조할 것.) 하지만, 다중 서버를 사용할 때에는, 각
자의 서버는 유닉스 소켓 파일 및 TCP/IP 포트 번호와 같은 것에 대해 자신만의 옵션 값을 가지는 것이 필요하다. 다중 서버 환경
에서 서버별로 고유의 값을 가져야만 하는 옵션이 어떤 것이 있는지에 대한 보다 자세한 정보는 Section 5.13, “동일 서버에서 다
중의 MySQL서버 구동 시키기”를 참조할 것.
start, stop, 그리고 report는 수행되야할 동작을 가리키는 것이다. 여러분은 옵션 이름 다음에 나오는 GNR 리스트에 따라서, 단
일 서버 또는 다중 서버에 대한 지정 동작을 실행을 할 수가 있게 된다. 만약에 리스트가 없는 경우에는, mysqld_multi는 옵션 파일
에 있는 모든 서버에 대한 동작을 실행하게 된다.
● --help
● --config-file=name
대신 사용할 옵션 파일의 이름을 지정한다. 이것은 mysqld_multi이 [mysqldN] 옵션 그룹을 어디에서 찾을지를 알려준
다. 이 옵션 파일이 없으면, 모든 옵션은 일반적인 my.cnf 파일에서 읽혀 진다. 이 옵션은The option does not affect
where mysqld_multi가 자신의 옵션을 어디에서 읽을 지에 대해서는 알려주지 않는데, 이것은 항상 일반적인 my.cnf 파
일 안에 있는 [mysqld_multi] 그룹에서 얻어진다.
● --example
● --log=file_name
● --mysqladmin=prog_name
● --mysqld=prog_name
사용되는 mysqld 바이너리. 이 옵션을 위한 값으로서 mysqld_safe도 함께 지정할수 있다는 것을 알아두기 바란다. 만약
에 mysqld_safe를 사용햇 서버를 구동 시켰다면, 여러분은 [mysqldN] 옵션 그룹에 상응하여 mysqld 또는 ledir 옵션들
을 포함 시킬 수가 있게 된다. 이러한 옵션들은 mysqld_safe이 구동 시켜야 하는 서버의 이름과 서버가 저장되어 있는 디
렉토리의 경로 이름을 가리킨다. (Section 5.4.1, “mysqld_safe — MySQL 서버 스타트업 스크립트”를 참조.)
예제:
[mysqld38]
mysqld = mysqld-max
ledir = /opt/local/mysql/libexec
● --no-log
● --password=password
mysqladmin을 호출할 때 사용되는 MySQL 계정의 패스워드. 다른 MySQL 프로그램과는 달리, 이 옵션에 대한 패스워
드 값은 필수 사항이 된다.
● --silent
● --tcp-ip
각각의 MySQL 서버를 유닉스 소켓 파일 대신에 TCP/IP 포트를 통해 접속 시킴. (만약에 소켓 파일이 누락되어 있으면,
서버는 여전히 동작은 하겠지만, TCP/IP 포트만을 통해서만 접근할 수 있게 된다.) 디폴트로는, 유닉스 소켓 파일을 통해
서 접속이 이루어 진다. 이 옵션은 stop 과 report 동작에 영향을 준다.
● --user=user_name
● --verbose
● --version
● Most important: mysqld_multi를 사용하기 전에, 여러분은 mysqld 서버에 패스되는 옵션의 의미와 개별적인 mysqld 프
로세스를 가져야 하는 이유가 무엇인지를 정확히 알아야 한다. 동일한 데이터 디렉토리를 갖는 다중 mysqld 서버의 사용
은 위험하다는 것을 알기 바란다. 여러분이 무엇을 하고 있는지 정확히 알지 못할 경우에는. 데이터 디렉토리를 구분해서
사용하기 바란다. 동일한 데잍 디렉토리를 가지고 여러대의 서버를 구동 시키는 것은 쓰레드 시스템에서는 아무런 성능의
효과를 얻을 수가 없다. Section 5.13, “동일 머신에서 다중 MySQL 서버 구동하기”를 참조.
● Important: 각 서버에 대한 데이터 디렉토리는 특정 mysqld 프로세스가 구동되는 시스템의 전체 유닉스 계정이 접근 가능
하다는 것을 알아두기 바란다. 여러분이 무엇을 하고 있는지 정확히 알지 못할 경우에는, 이렇게 동작 시키기 위해서 유닉
스 root 계정을 사용하지 말기 바란다. Section 5.7.5, “일반 사용자로서 MySQL 구동 시키기”를 참조.
● mysqld 서버를 종료 시키기(mysqladmin 프로그램을 사용해서) 위해 사용하는 MySQL 계정은, 각 서버에 대해 동일한
사용자 이름과 패스워드를 가지고 있다는 점을 알아 두기 바란다. 또한, 그 계정은 SHUTDOWN 권한을 가지고 있어야 한
• Enter password:
Section 5.8.2, “권한 시스템이 어떻게 동작을 하는가”를 참조. 여러분은 각각의 mysqld에 대해 이러한 조치를 해야 한
다. 각각을 연결할 때에 접속 파라미터의 값을 적당히 변경한다. 계정 이름의 호스트 이름 부분은 반드시 여러분이 구동 시
키고자 하는 mysqld_multi가 있는 호스트에서 multi_admin를 접속할 수 있게 해 주어야 한다.
• ------------------------------------------------------------
• MY_PWD=`pwd`
• -x ./bin/mysqld
• ------------------------------------------------------------
이 라인이 수행하는 테스트는 성공을 해야 하는데, 그렇지 않을 경우에는 문제가 생기게 된다. See Section 5.4.1,
“mysqld_safe — MySQL 서버 스타트업 스크립트”을 참조.
● 여러분은 mysqld을 위해 --user 옵션을 사용하고자 하겠지만, 이렇게 하기 위해서는 유닉스 root 사용자로서
mysqld_multi 스크립트를 구동 시킬 필요가 있다. 옵션 파일에 옵션을 가지고 있는 것은 아무 문제가 없다; 여러분이 슈퍼
유저가 아니고 mysqld 프로세스가 여러분 자신의 유닉스 계정 아래에서 시작될 경우에는 단지 경고만 받게 된다.
아래의 예제에서는 여러분이 mysqld_multi를 가지고 옵션 파일을 어떻게 설정을 하는지를 보여 주고 있다. mysqld 프로그램이 시
작되거나 또는 종료하는 순서는 옵션 파일에 어떤 순서로 되어 있는지에 달려 있다. 그룹 번호는 깨지지 않는 시퀀스(unbroken
sequence)를 구성하는데 필요 없다. 첫 번째와 다섯 번째의 [mysqldN] 그룹은 이 예제에서는 의도적으로 생략 되었는데, 이것은
여러분이 옵션 파일에서 “갭(gap)”을 가질 수 있음을 알려 주기 위해서이다. 이것은 여러분에게 보다 많은 유연성을 제공한다.
# or /etc/my.cnf
[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = multipass
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2
language = /usr/local/share/mysql/english
user = john
[mysqld3]
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3
language = /usr/local/share/mysql/swedish
user = monty
[mysqld4]
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/var4/hostname.pid4
datadir = /usr/local/mysql/var4
language = /usr/local/share/mysql/estonia
제목검색
5.5.1 MySQL 인스턴스 관리자를 가지고 MySQL 서버 구동하기 5.5.4. MySQL 인스턴스 관리자 구성 파일
5.5.2 MySQL 인스턴스 관리자에 접속하기와 사용자 계정 생성하기 5.5.5. MySQL 인스턴스 관리자가 인식하는 명령어
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=5&scate=0&idx=14612006-08-03 오후 4:18:25
:::MySQL Korea:::
제목검색
이와 같은 경우에 있는 인스턴스 관리자는 MySQL 구성 파일에 주어진 옵션에 따라 동작을 한다. 만약에 구성 파일
이 존재하지 않으면, MySQL 인스턴스 관리자는 creates a server instance named mysqld이라는 이름의 서버 인
스턴스를 생성하게 되며, 디폴트 구성 값을 가지고 서버를 시작하려고 시도한다. 이것은 만약에 mysqld이 디폴트 위
치에 저장되어 있지 않다면, IM은 mysqld 의 저장 위치를 추정하지 못한다는 것을 의미한다. 만약에 여러분이
MySQL 서버를 표준 위치가 아닌 곳에 설치를 하였다면, 여러분은 구성 파일을 사용해야만 한다. Section 2.1.5,
“설치 레이 아웃”을 참조.
구성 파일이 존재한다면, IM은 [mysqld] 섹션(예를 들면, [mysqld], [mysqld1], [mysqld2], 등등)을 찾기 위해
이것을 읽게 된다. 이러한 섹션들 각각은 인스턴스를 지정한다. 인스턴스 관리자가 시작될 때, IM은 자신이 발견하
는 모든 서버 인스턴스를 시작하려고 시도한다. 디폴트로, IM은 자신이 셧다운될 때 모든 서버 인스턴스를 종료한
다.
활성화 된 MySQL 인스턴스 관리자를 가진 MySQL 서버를 위한 전형적인 스타트업/셧다운 사이클은 다음과 같다:
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=5&scate=2&idx=14632006-08-03 오후 4:18:33
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 IM은 자신의 사용자 정보를 패스워드 파일에 저장한다. 패스워드의 디폴트 이름은 /etc/mysqlmanager.passwd이다.
5.5. mysqlmanager — MySQL 인스턴스 관
리자 패스워드 엔트리는 아래의 포맷을 가지고 있다:
새로운 엔트리를 생성하기 위해서는, IM을 --passwd 옵션과 함께 호출한다. 그렇게 하면, 새로운 사용자를 추가 하기 위해 그 결
과 값이 /etc/mysqlmanager.passwd 파일에 덧 붙여지게 된다. 아래에 예제가 있다:
mike:*00A51F3F48415C7D4E8908980D443C29C69B60C9
제목검색
5. 데이터 베이스 관리 서버의 상태를 모니터 하기 위해서, MySQL 인스턴스 check_connection의 패스워드를 가지고 있는
5.5. mysqlmanager — MySQL 인스턴스 관리자 MySQL_Instance_Manager@localhost 사용자 계정을 사용해서 레귤러 인터벌(regular interval) 동안 MySQL 서버
5.5.2 MySQL 인스턴스 관리자에 접속하기와 사용자 계정 인스턴스에 접속을 시도할 것이다.
생성하기
5.5.2.1 인스턴스 관리자 사용자 및 패스워드 여러분은 MySQL 인스턴스 관리자가 서버의 상태를 모니터 하도록 하기 위해 MySQL_Instance_M@localhost user 계
5.5.2.2 상태 모니터를 위한 MySQL 서버 계정 정을 만들 필요가 없는데, 그 이유는 동작 중인 서버를 구분하는데에는 로그인 실패(failure)만으로도 충분하기 때문이
다. 하지만, 만약에 계정이 존재하지 않으면, 실패한 접속 시도는 서버에 의해 자신의 일반 쿼리 로그에 등록 되어진다.
(Section 5.12.2, “일반 쿼리 로그”).
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=5&scate=2&idx=14652006-08-03 오후 4:18:35
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 MySQL 인스턴스 관리자는 여러 가지의 명령어 라인 옵션을 지원한다. 간단하게 리스트를 하자면, mysqlmanager를 --help
5.5. mysqlmanager — MySQL 인스턴스 관리자 옵션을 가지고 호출한다.
● --help, -?
● --bind-address=IP
연결할 IP 주소.
● --default-mysqld-path=path
● --defaults-file=file_name
주어진 파일에서 인스턴스 관리자와 MySQL 서버의 설정 값을 읽음. 인스턴스 관리자가 변경하는 모든 구성 내용이
이 파일에 기록됨. 이 파일을 사용할 경우에는 반드시 명령어 라인의 맨 처음에 나와야 함.
● --install
윈도우에서, 윈도우 서비스 형태로 인스턴스 관리자를 설치함. 이 옵션은 MySQL 5.0.11에 추가 됨.
● --log=file_name
● --monitoring-interval=seconds
● --passwd, -P
● --password-file=file_name
● --pid-file=file_name
● --port=port_num
들어오는(incoming) 접속을 위해 사용할 TCP/IP 포트 번호. (IANA가 할당하는 디폴트 번호는 2273).
● --print-defaults
현재의 디폴트 값을 출력하고 마침. 이 옵션을 사용할 경우에는, 반드시 명령어 라인 매 처음에 나와야 함.
● --remove
윈도우에서, 윈도우 서비스 형태의 인스턴스 관리자를 제거. 이것은 인스턴스 관리자가 이전에 –install와 함께 구동
되었다고 가정한다. 이 옵션은 MySQL 5.0.11에 추가 됨.
● --run-as-service
엔젤(angel)프로세스를 시작하고 데몬화(Daemonize) 시킴. 실패할 경우, 이것은 인스턴스 관리자를 재 구동 시킴.
● --socket=path
● --standalone
● --user=user_name
● --version, -V
버전 정보를 보여 주고 마침.
제목검색
5. 데이터 베이스 관리 인스턴스 관리자는 표준 my.cnf 파일을 사용한다. 이것은 자신을 위한 옵션을 읽기 위해 [manager] 섹션을 사용하고 인스턴스를
5.5. mysqlmanager — MySQL 인스턴스 관 생성하기 위해서는 [mysqld] 섹션을 사용한다. [manager] 섹션은 Section 5.5.3, “MySQL 인스턴스 관리자 명령어 옵션”에
리자 있는 모든 옵션을 가지고 있다. 아래에 [manager] 섹션의 예가 있다:
5.5.4 MySQL 인스턴스 관리자 구성 파일
# MySQL Instance Manager options section
[manager]
default-mysqld-path = /usr/local/mysql/libexec/mysqld
socket=/tmp/manager.sock
pid-file=/tmp/manager.pid
password-file = /home/cps/.mysqlmanager.passwd
monitoring-interval = 2
port = 1999
bind-address = 192.168.1.5
MySQL 5.0.10 이전에는, MySQL 인스턴스 관리자는 /etc/my.cnf, ~/.my.cnf등을 포함해서 MySQL 서버와 동일한 구성 파일
을 읽었다. MySQL 5.0.10 이후에는, MySQL 인스턴스 관리자는 유닉스에서만 /etc/my.cnf 파일을 읽고 관리한다, 윈도우에서
는, MySQL 인스턴스 관리자가 설치되어 있는 디렉토리내의 my.ini 파일만 읽는다. 디폴트 옵션 파일은 --defaults-
인스턴스 섹션은 스타트업 시점에 각 인스턴스에 대한 옵션을 지정한다. 이러한 옵션들은 주로 일반적인 MySQL 서버 옵션이지
만, 몇가지는 IM에만 관련된 옵션들이 있다:
● mysqld-path = path
● shutdown-delay = seconds
인스턴스가 셧다운되기 위해 IM이 대기해야 하는 시간(초). 디폴트는 35초다. 이 대기시간이 끝나게 되면, IM은 인스턴스
가 행(hang) 상태가 된것으로 간주하고 재차 종료를 시도한다. 큰 테이블에서 InnoDB를 사용한다면, 이 값을 늘리도록
한다.
● nonguarded
[mysqld]
mysqld-path=/usr/local/mysql/libexec/mysqld
socket=/tmp/mysql.sock
port=3307
server_id=1
skip-stack-trace
core-file
skip-bdb
log-bin
log-error
log=mylog
log-slow-queries
[mysqld2]
nonguarded
port=3308
server_id=2
mysqld-path= /home/cps/mysql/trees/mysql-5.0/sql/mysqld
socket = /tmp/mysql.sock5
pid-file = /tmp/hostname.pid5
datadir= /home/cps/mysql_data/data_dir1
language=/home/cps/mysql/trees/mysql-5.0/sql/share/english
log-bin
log=/tmp/fordel.log
제목검색
5. 데이터 베이스 관리 일단 여러분이MySQL 인스턴스 관리자에 대한 패스워드를 설정하였고 IM이 구동 중이면, 여러분은 IM에 접속할 수가 있다. 여러분은
5.5. mysqlmanager — MySQL 인스턴 mysql 클라이언트 툴을 사용해서 표준 MySQL API를 통해 접속을 할 수가 있다. 아래의 명령어 리스트는 현재 MySQL 인스턴스 관리자
스 관리자 가 수용하는 것들이며, 예문을 함께 보여준다.
5.5.5 MySQL 인스턴스 관리자가 인식하는
명령어 ● START INSTANCE instance_name
● SHOW INSTANCES
+---------------+---------+
| instance_name | status |
+---------------+---------+
| mysqld3 | offline |
| mysqld4 | online |
| mysqld2 | offline |
+---------------+---------+
+---------------+--------+---------+
+---------------+--------+---------+
+---------------+--------+---------+
+---------------+---------------------------------------------------+
| option_name | value |
+---------------+---------------------------------------------------+
| instance_name | mysqld3 |
| mysqld-path | /home/cps/mysql/trees/mysql-4.1/sql/mysqld |
| port | 3309 |
| socket | /tmp/mysql.sock3 |
| pid-file | hostname.pid3 |
| datadir | /home/cps/mysql_data/data_dir1/ |
| language | /home/cps/mysql/trees/mysql-4.1/sql/share/english |
+---------------+---------------------------------------------------+
인스턴스가 사용한 모든 로그 파일을 보여준다. 결과 셋은 로그 파일의 경로와 크기를 가지고 있다. 만약에 구성 파일에 아무런
로그 파일 경로도 지정되지 않았다면 (예를 들어, log=/var/mysql.log), IM은 그 로그 파일의 위치를 추정하게 된다. 만일 IM이
로그 파일의 위치를 추정할 수 없다면, 여러분은 구성 파일의 인스턴스 섹션에 적절한 로그 옵션을 사용해서 로그 파일의 위치를
지정해야 한다.
+-------------+------------------------------------+----------+
+-------------+------------------------------------+----------+
+-------------+------------------------------------+----------+
이 명령어는 지정된 로그 파일의 부분(portion)을 추출(retrieve)한다. 대부분의 사용자는 마지막 로그 메시지에 관심을 가지기
때문에, size 파라미터는 여러분이 로그 끝에서 시작해서 추출하고자 원하는 바이트의 크기를 정의한다. 여러분은
offset_from_end 파라미터를 사용해서 로그 파일의 중간에서 데이터를 읽어올 수도 있다. 아래의 예제에서는, 로그 파일의 끝으
로부터 23 바이트에서 시작해서 끝의 2바이트까지의 21바이트를 추출하는 것을 보여 준다:
+---------------------+
| Log |
+---------------------+
+---------------------+
● SET instance_name.option_name=option_value
이 명령어는 지정된 인스턴스 구성 파일을 편집해서 인스턴스 옵션을 변경하거나 또는 추가하게끔 한다. IM은 구성 파일이 /etc/
my.cnf에 저장되어 있다고 가정한다. 여러분은 이 파일이 실제로 있는지와 적당한 권한이 허용되었는지를 검사해야 한다.
구성 파일의 변경은 MySQL 서버가 재 구동되기 까지는 영향을 주지 않는다. 또한, 이러한 변경은 FLUSH INSTANCES 명령어
가 실행되기 까지는 인스턴스 관리자의 로컬 캐시에 저장되지 않는다.
● UNSET instance_name.option_name
구성 파일의 변경은 MySQL 서버가 재 구동되기 까지는 영향을 주지 않는다. 또한, 이러한 변경은 FLUSH INSTANCES 명령어
가 실행되기 까지는 인스턴스 관리자의 로컬 캐시에 저장되지 않는다.
● FLUSH INSTANCES
이 명령어는 IM이 구성 파일을 다시 읽도록 만들고 내부 구조를 다시 만들도록 한다. 이 명령어는 구성 파일을 편집한 후에 수행
해야 한다. 이 명령어는 인스턴스 재 구동 시키지 않는다.
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=6&scate=0&idx=15082006-08-03 오후 4:18:58
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 MySQL의 몇몇 버전들은 새로운 권한을 추가하거나 또는 새로운 기능을 지원하기 위해 mysql 데이터 베이스에 있는 시스
5.6. 설치-관련 프로그램 템 테이블의 구조를 변경한다. 여러분이 새로운 버전으로 업데이트를 할 경우, 시스템 테이블을 업데이트하는 것은 물론이
5.6.1 mysql_fix_privilege_tables — MySQL 시스템 테 고, 여러분은 그 테이블의 구조가 업그레이드 되었는지를 살펴 보아야 한다. 우선, 여러분의 mysql 데이터 베이스를 백업
이블 업그레이드 한 다음에, 아래와 과정을 진행한다.
Note: A MySQL 5.0.19 이후에는, mysql_fix_privilege_tables은 mysql_upgrade가 지원을 하는데, 이것을 대신 사용해
야 한다. Section 5.6.2, “mysql_upgrade — MySQL 업그레이드를 위한 테이블 검사”를 참조.
유닉스 또는 이와 비슷한 시스템에서는, 시스템 테이블 업데이트는 mysql_fix_privilege_tables 스크립트 구동을 통해서
한다:
shell> mysql_fix_privilege_tables
이 스크립트는 서버가 구동 중에 있을 때 해야 한다. 이것은 로컬 호스트 상에서 구동하고 있는 서버에 root로 접속을 시도
한다. 만일 root 계정에 패스워드가 필요하면, 명령어 라인에서 아래와 같이 패스워드를 지정한다:
mysql_fix_privilege_tables 스크립트는 여러분의 시스템 테이블을 현재의 포맷으로 변환하기 위한 모든 필요한 조치를 수
행한다. 여러분은 이것을 실행할 때 Duplicate column name 경고와 같은 것을 보게 되는데, 이것들은 무시해도 된다.
윈도우 시스템에서는, MySQL 배포판은 mysql_fix_privilege_tables.sql SQL 스크립트를 포함하는데, 여러분은 mysql
클라이언트를 사용해서 이것을 구동할 수가 있다. 예를 들면, 만약에 여러분이 MySQL을 C:₩Program Files₩MySQL
유닉스 프로시저가 진행되면서, Duplicate column name 경고문과 같은 것을 볼 수 있을 것이데, 무시해도 된다.
제목검색
5. 데이터 베이스 관리 mysql_upgrade은 여러분이 MySQL을 업그레이드할 때마다 실행해야 한다. 이것은 모든 데이터 베이스의 테이블과 업그레이드하
5.6. 설치-관련 프로그램 는 MySQL 버전과의 비 호환성을 검사한다. 만약에 하나의 테이블이 호환되지 않을 가능성이 있다면, 체크를 하게 되며, 어떤 문제
5.6.2 mysql_upgrade — MySQL 업그레이드를 가 발견될 경우에는 그 테이블을 치료한다. mysql_upgrade은 또한 시스템 테이블을 업그레이드 해서 여러분이 새로운 권한 또는
위한 테이블 검사 기능들을 사용할 수 있게끔 해 준다.
검사와 치료를 받은 모든 테이블은 현재의 MySQL 버전 번호로 표시가 된다. 이것을 통해 여러분이 다음에 서버의 동일한 버전을
가지고 mysql_upgrade를 구동을 시킬 때, 더 이상 검사 또는 치료를 해야할 테이블이 있는지를 알게 된다.
시스템 테이블을 검사, 치료, 그리고 업그레이드를 하기 위해서는, mysql_upgrade를 아래와 같이 실행한다:
mysql_fix_privilege_tables
어떤 것이 검사 되었는지 보다 자세히 보기 위해서는, CHECK TABLE 명령문의 FOR UPGRADE 옵션에 있는 내용을 보기 바란
다. (Section 13.5.2.3, “CHECK TABLE 신텍스”를 참조).
mysql_upgrade를 사용하기 위해서는, 서버가 구동 되고 있는지를 확인한 다음에, 아래와 같이 호출을 한다:
mysql_upgrade은 명령어 라인과 옵션 파일의 [mysqld] 및 [mysql_upgrade] 그룹에서 옵션을 읽는다. 이것이 지원하는 옵션
은 다음과 같다:
● --basedir=path
● --datadir=path
● --force
mysql_upgrade이 이미 현재 버전에 대해 실행이 되었다고 하더라도 강제로 mysqlcheck를 실행 시킴. (달리 표현 하면,
이 옵션은 mysql_upgrade.info 파일을 무시하게끔 만든다.)
● --user=user_name, -u user_name
● --verbose
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=7&scate=0&idx=15112006-08-03 오후 4:19:13
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 인터넷에 연결되어 있는 컴퓨터에서 MySQL을 사용하고 있는 사용자들은 모두 대부분의 공통적인 보안 실수를 피하기 위해서는
5.7. 일반적인 보안 이슈 이 섹션을 읽기 바란다.
● user 테이블에 대해서는 누구도 접근을 허용하지 말 것(MySQL root 계정은 제외)! 이 테이블은 매우 중요한 것이다.
MySQL에서는 패스워드가 암호화 된다. 테이블에 있는 패스워드를 알게 되면, 누구라도 쉽게 다른 사용자 계정에 접근할
수가 있다.
● MySQL 접근 권한 시스템에 대해 공부한다. GRANT 및 REVOKE 명령문은 MySQL에 대한 접근을 제어하는데 사용된
다. 필요 이상의 권한을 부여하지 말도록 한다.
체크 리스트:
❍ mysql -u root을 시도한다. 만약에 패스워드를 넣지 않고도 서버에 쉽게 접속이 된다면, 모든 사람들이 전체 권한
을 가지고 root 사용자로서 여러분의 MySQL 서버에 접속할 수가 있다는 것을 의미한다! MySQL 설치 설명을 다
시 한번 보고 root 패스워드 설정에 대한 사항을 숙지하기 바란다. Section 2.9.3, “초기 MySQL 계정 보안 작업
하기”를 참조.
❍ 어떤 계정이 접속을 하고 있는지 보기 위해서는 SHOW GRANTS 명령문을 사용해서 검사한다. 그 다음에는 필요
없는 권한을 삭제하기 위해 REVOKE 명령문을 사용한다.
● 여러분의 데이터 베이스에서 평범한 패스워드는 저장하지 말 것. 대신에, MD5(), SHA1(), 또는 다른 한 방향(one-
way) 해싱(hashing) 함수를 사용해서 해시(hash) 값을 저장하도록 한다.
체크 리스트:
❍ nmap과 같은 툴을 사용해서 인터넷에서 여러분의 포트를 스캔하여 본다. MySQL 은 디폴트로 3306 포트를 사용
한다. 이 포트는 인가 받지 못한 호스트는 접근하지 못하게 한다. 여러분의 포트가 열리는지 아닌지를 검사 하는 다
른 간단한 방법은 리모트 머신에서 아래의 명령어를 시도해 보는 것이다. 여기에서 server_host는 여러분의
MySQL 서버가 구동되고 있는 호스트의 이름 또는 IP 번호가 된다:
이것을 사용해서 접속이 되고 이상한 문자가 나오게 되면, 여러분의 포트는 열려 있는 것이며, 방화벽 또는 라우
터를 사용해서 닫아야 한다. 만일 telnet이 행(hang) 상태가 되거나 또는 접속이 거절되면, 포트는 블로킹 된 것
이다.
● 많은 어플리케이션 프로그래밍 인터페이스는 데이터 값에서 탈출(escaping) 특수 문자의 수단을 제공한다. 제대로만 사용
한다면, 이것은 어플리케이션 사용자가 여러분이 의도하는 것과는 다른 효과를 발생시키는 명령문을 어플리케이션이 만들
지 못하도록 할 수 있다:
❍ MySQL C API: mysql_real_escape_string() API 호출을 사용한다.
❍ MySQL++: 쿼리 스트림을 위해 escape 와 quote 수정자(modifier)를 사용한다.
❍ PHP: mysql_escape_string() 함수를 사용하는데, 이것은 MySQL C API에 있는 동일한 이름의 함수를 기초로
한다. (PHP 4.0.3 이전에는, addslashes()를 대신 사용함.) PHP 5에서는, mysqli 확장자를 사용할 수가 있는데,
이것은 MySQL 승인 프로토콜과 패스워드, 그리고 플레이스홀더(placeholder)가 있는 프리페어드 명령문을 지원
한다.
❍ Perl DBI: quote() 방식을 사용하거나 또는 플레이스홀더를 사용한다.
❍ Ruby DBI: 플레이스홀더를 사용한다.
❍ Java JDBC: PreparedStatement 오브젝트와 플레이스홀더를 사용한다.
● tcpdump 과 strings 유틸리티 사용법을 배운다. 대부분의 경우, 아래와 같은 명령어를 입력해서 MySQL 데이터 스트림이
암호화가 되어 있지 않은지를 검사할 수가 있다:
(위의 것은 리눅스 환경에서만 동작을 하는 명령문이며 다른 시스템에서는 약간 수정을 해야 한다.) 경고: 만약에 여러분
이 일반 텍스트 데이터를 보지 못한다고 하더라도, 이것이 데이터가 실제로 암호화 되었다는 것을 항상 의미하는 것은 아
니다.
제목검색
5. 데이터 베이스 관리 여러분이 MySQL 서버에 접속을 할 때에는, 패스워드를 사용하도록 한다. 클라이언트 접속 시퀀스 동안 패스워드 다루기는
5.7. 일반적인 보안 이슈 MySQL 4.1.1에서 많은 업그레이드가 되었다. 만약에 여러분이 아직도 4.1.1 이전 버전 형태의 패스워드를 사용한다면, 암호화 알
5.7.2 공격으로부터 MySQL 보안 설정하기 고리즘이 새 버전의 알고리즘 만큼 튼튼하지 못한 것이다. 명석한 공격자는, 약간의 노력만 가지고도 클라이언트와 서버간의 통신
을 가로채서 패스워드를 해석할 수가 있다. (Section 5.8.9, “MySQL 4.1 이후의 패스워드 해싱(Hashing)”,을 참조할 것.)
다른 모든 정보는 텍스트 형태로 전송되는데, 이것은 접속을 지켜보는 사용자라면 누구라도 읽을 수가 있는 것이다. 만약에 클라이
언트와 서버간의 접속이 신뢰도가 떨어지는 네트워크를 통해 이루어 진다면, 그리고 여러분이 이에 대해 걱정을 한다면, 압축 프로
토콜을 사용해서 통신을 해석하는 것을 더욱 어렵게 만들 수도 있다. 또한 MySQL의 내부 SSL을 사용해서 보안성을 보다 좋게 만
들 수도 있다. Section 5.9.7, “보안 접속 사용하기”를 참조할 것.
MySQL 시스템의 보안성을 좋게 하기 위해서는, 여러분은 아래의 내용을 정확하게 숙지해야 한다:
● 유닉스 root 사용자로는 절대로 MySQL 서버를 구동하지 말 것. 이것은 매우 위험한 일인데, 그 이유는 FILE 권한을 가진
사용자라면 누구라도 서버가 root로 파일을 생성할 수 있게끔 할 수가 있다(예를 들면, ~root/.bashrc). 이것을 방지하기
위해서, mysqld은 --user=root 옵션을 사용해서 명확하게 지정을 하지 않는 root로 구동되는 것을 거부한다.
mysqld은 대신에 권한이 없는 일반 사용자로서 구동 시킬 수가 있다. 여러분은 별도의 유닉스 계정 mysql을 생성해서 일
을 처리하는 것이 보다 안전하다. 이 계정은 MySQL을 관리하는 용도로만 사용한다. 다른 유닉스 사용자로서 mysqld을
구동 시킬 때에는, 여러분이 서버 옵션을 지정하는 my.cnf 옵션 파일에 있는 [mysqld] 그룹에 사용자 이름을 지정하는
user 옵션을 추가한다. 예를 들면:
[mysqld]
user=mysql
보다 자세한 사항은 Section 5.7.5, “일반 사용자 자격으로 MySQL 구동시키는 방법”을 참조할 것.
Mysqld을 root가 아닌 다른 유닉스 사용자로서 구동시킨다는 것은 여러분이 user 테이블에 있는 root 사용자 이름을
the 변경해야 한다는 것을 의미하는 것이 아니다. MySQL 계정에 대한 사용자 이름은 유닉스 계정에 대한 사용자 이름과
는 아무 상관이 없다.
● 테이블에 대한 심볼릭 링크를 허용하지 말 것.(이 기능은 --skip-symbolic-links 옵션을 사용해서 비활성화 시킬 수가
있다.) 만약에 여러분이 mysqld을 root 자격으로 구동 시킬 때 특히 중요한 사항인데, 그 이유는 서버의 데이터 디렉토리
에 쓰기 접근 권한을 가지는 사용자는 시스템의 모든 파일을 삭제할 수 있기 때문이다! Section 7.6.1.2, “유닉스에서 심
볼릭 링크 사용하기”를 참조.
● 데이터 디렉토리에서 읽기 또는 쓰기 권한을 가지고 있는 유닉스 사용자만이 mysqld을 구동 시킬 수 있는 사용자가 되도
록 한다.
● 비-관리 사용자에게 PROCESS 또는 SUPER 권한을 주지 말 것. mysqladmin processlist 과 SHOW PROCESSLIST
의 결과는 현재 실행되고 있는 모든 명령문의 텍스트를 보여준다. 따라서 서버 프로세스 리스트를 볼 수 있는 사용자는
UPDATE user SET password=PASSWORD('not_secure')와 같은 사용자가 입력하는 명령문도 볼 수가 있게 된다.
Mysqld은 SUPER 권한을 가지고 있는 사용자를 위해 여분의 접속을 유지하는데, 그 이유는 일반 접속이 모두 사용되는
중일 지라도 MySQL root 사용자가 로그인하여 서버의 동작을 검사할 수 있도록 하기 위해서다.
SUPER 권한은 클라이언트 접속을 종료시키고, 시스템 변수 값을 변경해서 서버 동작을 변경시키고, 리플리케이션 서버
를 제어하기 위해 사용할 수가 있다.
● 비-관리 사용자에게 FILE 권한을 주지 말 것. 이 권한을 가지고 있는 사용자는 mysqld 데몬에 대한 권한을 가지고서 파
일 시스템에 있는 어떤 파일에도 쓰기를 할 수가 있다.
● 만약에 여러분의 DNS를 신뢰하지 못한다면, 그랜트 테이블에서 호스트 이름을 사용하지 말고 IP 번호를 사용하도록 한다.
또한, 와일드 카드를 가지는 호스트 이름을 사용해서 그랜트 테이블 엔트리를 생성할 경우에는 세심한 주의를 한다.
● 하나의 계정이 접속할 수 있는 숫자를 제한하고자 한다면, mysqld에 있는 max_user_connections 변수를 설정하면 된다.
GRANT 명령문을 사용해서도 하나의 계정에게 허용된 서버 사용 확장에 대한 자원 제어 옵션을 지정할 수가 있다.
Section 13.5.1.3, “GRANT 신텍스”를 참조.
제목검색
이 옵션은 주 함수에 대해 xxx 심볼만 가지고 있는 사용자 정의 함수를 로드할 수 있는지 없는지를 제어한다. 디폴트로는
오프(off)이며, 최소 한 개의 보조 심볼을 가지고 있는 UDF만을 로드할 수가 있다; 이것은 규칙에 맞는 UDF를 가지고 있
는 파일에서가 아니고 공유 오브젝트 파일에서 함수를 로드하려는 시도를 못하게 한다. 이 옵션은 5.0.3에 추가 되었다.
See Section 24.2.4.6, “사용자 정의 함수 보안 유의 사항”을 참고할 것.
● --local-infile[={0|1}]
● --old-passwords
새로운 패스워드에 대해 서버가 짧은(pre-4.1) 패스워드 해시를 만들도록 한다. 이것은 서버가 이전 버전의 클라이언트
프로그램을 지원해야 하는 경우에 유용하다. Section 5.8.9, “MySQL 4.1이후의 패스워드 해싱(Hashing)”을 참조할
것.
● --safe-show-database (없어짐)
이전 버전의 MySQL에서, 이 옵션은 SHOW DATABASES 명령문이 사용자가 권한을 가지고 있는 데이터 베이스의 이
름을 출력하게끔 한다. 5.0 이후에는 이 옵션은 더 이상 사용되지 않는다. Section 13.5.1.3, “GRANT 신텍스”를 참조
할 것.
● --safe-user-create
만약에 이 옵션이 활성화되면, 사용자는 mysql.user 테이블에 대한 INSERT 권한을 가지고 있지 않는 GRANT 명령문
을 사용해서 새로운 MySQL 사용자를 만들 수가 없다. 만약에 사용자에게 이러한 권한을 가지는 새로운 사용자를 생성할
수 있도록 하고자 한다면, 여러분은 그 사용자에게 아래의 권한을 승인해야 한다:
이것은 사용자가 권한이 있는 컬럼을 직접은 변경하지 못하도록 만들며, 대신에 GRANT 명령문을 사용해서 다른 사용자
에게 권한을 주도록 만든다.
● --secure-auth
● --skip-grant-tables
이 옵션은 서버가 권한 테이블을 전혀 사용할 수 없도록 만든다. 이것은 누구라도 제한 없이 서버와 모든 데이터 베이스에
접근할 수 있도록 만든다. 여러분은 mysqladmin flush-privileges을 실행 시키거나 또는 시스템 쉘에서 mysqladmin
reload 명령어를 실행하거나, 또는 MySQL FLUSH PRIVILEGES 명령문을 입력해서 구동 중인 서버가 그랜트 테이블
을 사용해서 재 구동 되도록 할 수가 있다. 이 옵션은 또한 사용자 정의 함수를 로딩하지 못하도록 한다.
● --skip-name-resolve
호스트 이름을 해석하지 않는다. 그랜트 테이블에 있는 모든 Host 컬럼값은 반드시 IP 번호 또는 localhost 이어야 한다.
● --skip-networking
네트워크를 통한 TCP/IP 접속을 허용하지 않음. 모든 접속은 유닉스 소켓 파일을 통해서 이루어져야 한다.
● --skip-show-database
이 옵션을 사용하면, SHOW DATABASES 명령문은 SHOW DATABASES 권한을 가지고 있는 사용자에게만 허용되
며, 그리고 명령문은 모든 데이터 베이스 이름을 출력한다. 이 옵션이 없으면, SHOW DATABASES은 모든 사용자가 사
용할 수 있으나, 사용자가 SHOW DATABASES 권한을 가지고 있는 데이터 베이스 이름만 디스플레이 한다. 모든 글로
벌 권한은 데이터 베이스에 대한 권한임을 알기 바란다.
제목검색
5. 데이터 베이스 관리 LOAD DATA 명령문은 서버 호스트에 있는 파일을 로드할 수 있으며, 또는 LOCAL 키워드가 지정이 되면 클라이언트에 있는 파
● 클라이언트 호스트에서 서버 호스트로 파일을 전송하는 것은 MySQL 서버가 초기화 한다. 이론적으로는, 클라이언트가
LOAD DATA 명령문에서 지정하는 파일이 아닌 서버가 선택한 파일을 클라이언트 프로그램이 전송하도록 서버를 구축할
수가 있다. 그러한 서버는 클라이언트 사용자가 읽기 접근을 가지는 클라이언트 호스트에 있는 모든 파일을 접근할 수가 있
다.
● 클라이언트가 웹 서버를 통해 접속하는 웹 환경에서는, 웹 서버 프로세스가 일기 접근을 가지고 있는 모든 파일을 사용자
는 LOAD DATA LOCAL를 사용해서 읽을 수가 있게 된다 (사용자가 SQL 서버에 대응하는 명령문을 구동 시킨다고 가정
한다). 이러한 환경에서, MySQL 서버와 관련된 클라이언트는 실제로는 웹 서버가 되며, 웹 서버에 접속을 한 사용자가 구
동하는 리모트 프로그램은 아니다.
이러한 문제를 다루기 위해서, 우리는 LOAD DATA LOCAL를 처리하는 방법을 변경하였다:
• [client]
• loose-local-infile=1
● 만약에 LOAD DATA LOCAL INFILE이 비활성화 되었다면, 서버 또는 클라이언트에서, 이러한 명령문을 입력하고자 하
는 클라이언트는 아래의 에러 메시지를 받게 된다:
• ERROR 1148: The used command is not allowed with this MySQL version
제목검색
5. 데이터 베이스 관리 윈도우에서는, 여러분은 일반 사용자 계정을 사용해서 MySQL 서버를 윈도우 서비스 형태로 구동 시킬 수가 있다.
5.7. 일반적인 보안 이슈
5.7.5 일반 사용자 자격으로 MySQL 구동시키는 유닉스에서는, MySQL 서버 mysqld는 모든 사용자가 시작 및 구동을 할 수가 있다. 하지만, 보안상의 이유로, 여러분은 서버를 유
방법 닉스 root 사용자로는 구동 시키지 말아야 한다. Mysqld를 권한이 없는 일반 유닉스 사용자 user_name가 구동할 수 있도록 변경
하기 위해서는, 아래의 사항을 따르기 바란다:
만약에 여러분이 이렇게 하지 않으면, user_name로 서버를 구동 시킬 때 서버는 데이터 베이스 또는 테이블에 접근을 하
지 못하게 된다.
만약에 MySQL 데이터 디렉토리 안에 있는 디렉토리 또는 파일이 심볼릭 링크라면, 여러분은 또한 그 링크를 따라야 하
고 링크가 가리키는 디렉토리와 파일도 변경을 해야 한다. chown –R은 여러분을 위한 심볼릭 링크를 따르지 않을 것이
다.
4. 사용자user_name로 서버를 시작한다. 만약에 여러분이 MySQL 3.22 또는 그 이후 버전을 사용한다면, 사용할 수
있는 다른 방법은 mysqld를 유닉스 root 사용자로 시작하고 --user=user_name 옵션을 사용하는 것이다. mysqld 은
시작이 된 후에, 다른 접속을 받아들이기 전에 유닉스 사용자 user_name로 구동을 변경한다.
5. 시스템 스타트업 시점에, 지정한 사용자로서 서버를 자동으로 시작하기 위해서는, user 옵션을 추가해서 사용자의 이
름을 /etc/my.cnf 옵션 파일의 [mysqld] 그룹 또는 서버의 데이터 디렉토리에 있는 my.cnf 옵션 파일에 지정한다. 예를
들면:
6. [mysqld]
7. user=user_name
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=8&scate=0&idx=15172006-08-03 오후 4:19:34
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 MySQL 권한 시스템의 주된 기능은 주어진 호스트에서 접속을 하는 사용자를 승인하고 그 사용자를 SELECT, INSERT,
5.8. MySQL 권한 시스템 UPDATE, and DELETE와 같은 데이터 베이스에 있는 권한에 연결을 시키는 것이다.
5.8.1 권한 시스템이 하는 일
또 다른 기능으로는 익명의 사용자를 가질 수 있으며 LOAD DATA INFILE과 같은 MySQL-특성 함수와 관리 동작에 대한 권한
을 허용하는 것이다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=8&scate=1&idx=15182006-08-03 오후 4:19:40
:::MySQL Korea:::
제목검색
만약에 접속을 하고 있는 동안에 여러분의 권한이 변경된다면, 여러분이 입력하는 그 다음 명령문에 대해서는 변경된 내용이 즉시 효과를 나타내지 못한다. Section 5.8.7, “권한 변경시의 효
과”를 참조할 것.
서버는 mysql 데이터 베이스의 그랜트 테이블에 권한 정보를 저장한다. MySQL 서버는 시작을 할 때 이 테이블에 있는 컨텐츠를 메모리로 읽어 들이고 또한 Section 5.8.7, “권한 변경시의 효
과”에서 지정하는 환경 아래일 경우에도 다시 한번 그것들을 읽어 들인다. 접근-제어 결정은 그랜트 테이블의 메모리 복사본을 근거로 이루어 진다.
일반적으로, 여러분은 GRANT 와 REVOKE와 같은 명령문을 사용해서 계정을 설정하고 각 사용자가 그 권한을 사용할 수 있도록 그랜트 테이블의 컨텐츠를 사용할 수 있다. Section 13.5.1,
“계정 관리 명령문”을 참조할 것. 여기에서는 그랜트 테이블의 하부 구조와 서버가 클라이언트와 상호 통신을 할 때 그 컨텐츠를 어떻게 사용하는지에 대해 설명을 하도록 한다.
서버는 접근 제어의 두 단계 모두에서 mysql 데이터 베이스에 있는 user, db, 그리고 host 테이블을 사용한다. 아래에 user 와 db 테이블에 있는 컬럼들이 있다. host 테이블은 db 테이블과 유사
하지만, Section 5.8.6, “접근 제어, Stage 2: 요청 검증”에서 설명한 것과 같은 특별한 쓰임새를 가지고 있다.
User Db
Password User
Insert_priv Insert_priv
Update_priv Update_priv
Delete_priv Delete_priv
Index_priv Index_priv
Alter_priv Alter_priv
Create_priv Create_priv
Drop_priv Drop_priv
Grant_priv Grant_priv
Create_view_priv Create_view_priv
Show_view_priv Show_view_priv
Create_routine_priv Create_routine_priv
Alter_routine_priv Alter_routine_priv
Execute_priv Execute_priv
Create_tmp_table_priv Create_tmp_table_priv
Lock_tables_priv Lock_tables_priv
References_priv References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
Show_db_priv
Super_priv
Repl_slave_priv
Repl_client_priv
제목검색
5. 데이터 베이스 관리 계정 권한에 대한 정보는 mysql데이터 베이스에 있는 the user, db, host, tables_priv, columns_priv, 그리고 procs_priv테이블
5.8. MySQL 권한 시스템 에 저장된다. MySQL 서버는 시작될 때 이러한 테이블의 내용을 메모리로 읽어 들이고 Section 5.8.7, “권한변경시의효과”에서
5.8.3 MySQL이 제공하는 권한 기술한 환경이 되면 그것들을 다시 읽어 들인다. 접근-제어 결정은 그랜트 테이블의 메모리 복사본을 근거로 이루어진다.
권한을 참조하기 위한The names used in the GRANT와 REVOKE명령문에서 사용된 이름이 아래의 테이블에 있는데, 이것은 그
랜트 테이블에 있는 각각의 권한과 관련된 컬럼 이름과 그 권한이 적용되는 문장(context)와 함께 나타난다. 각 권한이 의미하는
정보에 대해서는 Section 13.5.1.3, “GRANT를 참고하기 바란다. 신텍스”
MySQL의 몇몇 릴리즈판에는 그랜트 테이블의 구조를 변경해서 새로운 권한 또는 기능을 추가할 수 있도록 하고 있다. 여러분이
새로운 버전의 MySQL로 업데이트를 하는 경우에는, 항상 그랜트 테이블이 새로운 버전의 기능을 포함할 수 있도록 그랜트 테이블
에 대한 갱신도 함께 해야 한다. Section 5.6.2, “mysql_upgrade를 참조할 것. —MySQL 업그레이드에대한테이블검사”
CREATE VIEW와 SHOW VIEW는 MySQL 5.0.1에서 추가 되었다. CREATE USER, CREATE ROUTINE, 그리고 ALTER
ROUTINE은 MySQL 5.0.3에 추가 되었다. 비록 5.0에 EXECUTE가 존재하기는 하지만, MySQL 5.0.3 이후부터 그 기능을 발휘
한다.
바이너리 로그가 활성화 되어 있을 때 스토어드 루틴을 생성 또는 변경하기 위해서는, 여러분은 Section 17.4, “스토어드루틴과트
리거에대한바이너리로깅”에서 언급하듯이, SUPER권한도 역시 필요할 수도 있다.
CREATE와 DROP권한은 여러분이 새로운 데이터 베이스와 테이블을 생성할 수 있게 하거나, 또는 존재하는 데이터 베이스와 테
이블을 제거할 수 있게 한다. 만약에 여러분이 사용자가 mysql데이터 베이스에 대한 DROP권한을 가지도록 승인한다면, 그 사용자
는 MySQL 접근 권한이 저장되어 있는 데이터 베이스를 제거할 수가 있다.
SELECT, INSERT, UPDATE, 그리고 DELETE권한은 여러분이 데이터 베이스에 존재하는 테이블에 있는 열에서 동작을 수행
할 수 있도록 한다.
SELECT명령문은 테이블에서 열을 실제로 추출하는 경우에만 SELECT권한을 필요로 한다. 어떤 SELECT명령문은 테이블에 접
근할 수는 없으나 데이터 베이스에 대한 권한이 없이도 실행될 수도 있는 것이 있다. 예를 들면, 여러분은 테이블을 참조하지 않는
수식을 계산하기 위해 mysql 클라이언트를 단순한 계산기로 사용할 수가 있다:
SELECT 1+1;
SELECT PI()*2;
INDEX권한은 여러분이 인덱스를 생성 또는 제거할 수 있도록 한다. INDEX는 존재하고 있는 테이블에 적용된다. 만약에 여러분
이 테이블에 대해 CREATE권한을 가지고 있다면, 여러분은 CREATE TABLE명령문안에 인덱스 정의문을 포함 시킬 수가 있다.
ALTER권한은 여러분이 테이블의 구조를 변경하거나 또는 이름을 바꿀 수 있는 ALTER TABLE을 사용할 수 있도록 한다.
CREATE ROUTINE권한은 스토어드 루틴(함수 및 프로시저)를 생성하기 위해 필요한 것이다. ALTER ROUTINE권한은 스토어
드 루틴을 변경 또는 제거하기 위해 필요하며, 또한 EXECUTE는 스토어드 루틴 실행을 위해 필요하다.
GRANT권한은 여러분 자신이 가지고 있는 권한을 다른 사용자에게 줄 수 있게끔 한다. 이것은 데이터베이스, 테이블, 그리고 스토
어드 루틴을 위해 사용될 수 있다.
FILE권한은 여러분이 서버 호스트에서 LOAD DATA INFILE and SELECT ... INTO OUTFILE명령문을 사용해서 파일을 읽고
쓸 수 있도록 해 준다. FILE권한을 가지고 있는 사용자는 서버 호스트에 있는 모든 파일을 읽을 수 있다. (이것은 그 사용자가 모
든 데이터베이스 디렉토리에 있는 모든 파일을 읽을 수가 있다는 것을 의미하는데, 그 이유는 서버가 이러한 파일들에 접근할 수 있
기 때문이다.) FILE권한은 또한 사용자가 MySQL 서버가 쓰기 권한을 가지고 있는 모든 디렉토리에 새로운 파일을 생성할 수 있
도록 해 준다. 보안상의 이유로, 서버는 현재 존재하는 파일에 덮어 쓰기를 하지는 않는다.
이제 남은 권한은 관리 동작을 위한 것이다. 대부분의 이 권한들은 mysqladmin 프로그램의 사용 또는 SQL 명령문 입력을 통해서
수행될 수 있다. 아래의 테이블은 mysqladmin 명령어를 사용해서 여러분이 실행할 수 있는 각 관리 권한을 보여 준다.:
SHUTDOWN Shutdown
PROCESS Processlist
SUPER Kill
reload명령어는 서버가 그랜트 테이블의 내용을 메모리로 다시 읽어 들이도록 만든다. flush-privileges는 reload과 동일한 기능
을 한다. Refresh명령어는 로그 파일을 닫은 다음에 다시 열고 모든 테이블을 플러시한다. 또 다른 flush-xxx명령어는 refresh와
유사한 기능을 수행하지만, 좀더 구체적이며 어떤 인스턴스에서는 보다 많이 사용되기도 한다. 예를 들면, 만일 여러분이 로그 파일
만을 플러시 하고자 한다면, flush-logs를 사용하는 것이 refresh보다 나은 선택이 된다.
shutdown audfudd는 서버를 셧다운 시킨다. 이것과 대응되는 SQL 명령문은 없다.
processlist명령어는 서버 안에서 실행되는 쓰레드에 대한 정보를 디스플레이 한다 (즉, 클라이언트가 실행하는 명령문에 대한 정
보). kill명령어는 서버 쓰레드를 종료 시킨다. 여러분은 항상 여러분 소유의 쓰레드를 디스플레이 또는 종료 시킬 수가 있으나, 하
지만 여러분은 다른 사용자가 초기화 시킨 쓰레드를 디스 플레이 하기 위해서는 PROCESS권한이 필요하며, 그러한 쓰레드를 종
료 시키기 위해서는 SUPER권한이 있어야 한다. Section 13.5.5.3, “KILL를 참조할 것. 신텍스”
CREATE TEMPORARY TABLES권한은 CREATE TABLE명령문에 있는 키워드 TEMPORARY를 사용할 수 있도록 해 준다.
LOCK TABLES권한은 여러분이 SELECT권한을 가지고 있는 테이블을 잠그기 위해LOCK TABLES명령문을 사용할 수 있도록
한다. 이것은 쓰기 잠금을 포함하고 있는데, 이것은 누구라도 잠겨 있는 테이블을 읽지 못하도록 해준다.
REPLICATION CLIENT권한은 SHOW MASTER STATUS와 SHOW SLAVE STATUS를 사용할 수 있도록 해 준다.
REPLICATION SLAVE권한은 슬레이브 서버가 현재의 서버를 자신의 마스터로 접속하기 위해 사용하는 계정을 승인한다.. 이 권
한이 없다면, 슬레이브는 마스터 서버에 있는 데이터 베이스에서 이루어지는 업데이트를 요청할 수가 없게 된다.
SHOW DATABASES권한은 사용하는 계정이 SHOW DATABASE명령문을 이용해서 데이터 베이스의 이름을 볼 수 있도록 해
준다. 이 권한을 가지고 있지 않는 계정은 자신이 소유한 권한내의 데이터 베이스만을 볼 수 있고, 만약에 서버가 --skip-show-
database옵션을 가지고 시작되었다면, 명령문을 전혀 사용할 수가 없게 된다. 모든 글로벌 권한은 데이터 베이스에 대한 권한을 가
지고 있음을 알아두기 바란다.
계정에게는 꼭 필요한 권한만을 부여하는 것이 좋다. 여러분은 FILE과 관리 권한을 승인할 경우에는 매우 주의를 기울여야 한다:
● FILE권한은 MySQL 서버가 서버 호스트에 있는 파일을 데이터 베이스 테이블 속으로 읽어 들이기 위해 자칫 남용될 수가
있다. 이것은 서버의 데이터 디렉토리에 있는 모든 파일에 해당된다. 그런 다음에는 SELECT를 사용해서 테이블에 접근을
해서 테이블의 내용을 클라이언트 호스트에 전달할 수가 있다.
● GRANT권한은 사용자가 자신의 권한을 다른 사용자에게 줄 수 있도록 한다. 서로 다른 권한을 가지고 있는 두 명의 사용자
는 GRANT권한을 가지고 권한을 조합할 수가 있다.
● ALTER권한은 테이블의 이름을 바꾸어 줌으로서 권한 시스템을 없애 버리는데 사용할 수가 있다.
● SHUTDOWN권한은 서버를 종료 시킴으로서 다른 사용자에 대한 모든 서비스를 거부하도록 만들 수가 있다.
● PROCESS권한은 패스워드 설정 또는 변경을 진행하는 명령문을 포함해서, 현재 실행 중에 있는 명령문의 텍스트를 보기
위해 사용될 수 있다.
● SUPER권한은 다른 클라이언트를 종료시키거나 또는 서버의 동작을 변경시키는데 사용할 수 있다.
● Privileges granted for the mysql데이터 베이스 자체에 대해 승인된 권한은 패스워드와 다른 접근 권한 정보를 변경시키
는데 사용될 수 있다. 패스워드는 암호로 저장된다. 하지만, However, a user with write access to the user테이블의
Password컬럼에 쓰기 접근을 할 수 있는 사용자는 계정의 패스워드를 변경할 수 있으며, 그리고 그 계정을 사용해서
MySQL 서버에 접속을 할 수가 있게 된다.
● 여러분은 특정 사용자의 접근을 거부하도록 확정적으로 지정할 수가 없다. 즉, 여러분은 어떤 사용자와 접속 거부를 명백하
게 매치(match)시킬 수가 없다.
● 여러분은 어떤 사용자가 데이터 베이스 자체를 생성 또는 삭제하지 않고, 데이터 베이스에 들어 있는 테이블을 생성 또는
삭제할 수 있는 권한을 가지도록 지정할 수는 없다.
● 패스워드는 글로벌하게 하나의 계정에 적용된다. 여러분은 패스워드를 데이터 베이스, 테이블, 또는 루틴과 같은 특정 오브
젝트에 연관 시킬 수가 없다.
제목검색
따라서, joe라는 로그인 이름을 가지고 있는 유닉스 사용자에 대해서는, 아래의 모든 명령어가 동일한 것이 된다:
shell> mysql
● 여러분은 옵션 파일의 [client]섹션에 접속 파라미터를 지정할 수가 있다. 이 파일에 관련된 섹션은 아래와 같다:
• [client]
• host=host_name
• user=user_name
• password=your_pass
제목검색
ID 검사는 세 가지의 user테이블 범위 컬럼을 사용해서 수행된다 (Host, User, 그리고 Password). 서버는 user테이블에 있는
Host와 User컬럼의 열이 클라이언트의 호스트 이름 및 사용자 이름과 일치할 경우에만 접속을 허용하고, 클라이언트는 그 열에서
지정되어 있는 패스워드를 주게 된다.
user테이블에 있는 Host값은 아래와 같이 지정될 수 있다:
위의 예에서 보면, david는 아래의 조건이 일치하는 경우에는 IP 번호 client_ip를 가지고 있는 어떤 호스트에서도 접속을
할 수가 있게 된다:
192.168.0.1/255.255.255.240
Password컬럼은 비워둘 수가 있다. 이것은 와일드카드 문자가 아니며 모든 패스워드와 매칭을 한다는 것을 의미하는 것은 아니
다. 이것은 사용자가 반드시 패스워드를 지정하지 않고 접속을 해야 한다는 것을 의미한다.
user테이블에 비어 있지 않는(Non-Blank) Password값은 암호화 되어 있게 된다. MySQL은 무든 사람이 볼 수 있는 평범한 문
장으로 패스워드를 저장하지는 않는다. 반면에, 접속을 시도하는 사용자가 입력한 패스워드는 암호화가 된다 (PASSWORD()함수
를 사용한다). 암호화된 패스워드는 접속이 이루어지는 동안 계속 사용된다. 암호화된 패스워드는 관리자 이외에는 절대로 알려 주
지 말아야 한다.
MySQL 5.0은 접속 프로세스가 진행되는 동안 패스워드를 보호하기 위해 이전 버전에 비해 보다 강력한 인증 방식을 구현하였다.
이 방식은 TCP/IP 패킷 또는 mysql데이터 베이스가 해킹을 당하더라도 안전을 보장한다. Section 5.8.9, “MySQL 4.1 이후의패
스워드해싱”을 참조할 것.
아래의 테이블은 user테이블에 있는 Host와 User값의 조합이 들어오는 접속에 대해 얼마나 다양하게 적용될 수 있는지를 보여준
다.
'%.loc.gov' 'fred' fred, connecting from any host in the loc.gov domain
'144.155.166.177' 'fred' fred, connecting from the host with IP address 144.155.166.177
'144.155.166.%' 'fred' fred, connecting from any host in the 144.155.166 class C subnet
다중 매치가 가능할 경우, 서버는 반드시 어떤 것을 사용할지를 결정해야 한다. 서버는 이 문제를 다음과 같이 해결한다:
+-----------+----------+-
+-----------+----------+-
|% | root | ...
|% | jeffrey | ...
| localhost | | ...
+-----------+----------+-
서버가 테이블의 내용을 메모리로 읽어 올 때, 서버는 Host값 중에서 가장 명확하게 사용되고 있는 것을 가지고 열을 정렬한다. 문
자로 된 호스트 이름과 IP 번호가 가장 명확한 것이다. 패턴 '%'는 “모든 호스트(any host)”를 의미하며 가장 일반적인 것이 된
다. 동일한 Host값을 가지는 열은 가장 명확한 User값을 가지고 우선 정렬이 된다 (빈 User값은 “모든 사용자(any user)”를 의
미하며 가장 일반적인 것이 된다). user테이블에서 보듯이, 정렬의 결과는 다음과 같이 보이게 된다:
+-----------+----------+-
+-----------+----------+-
| localhost | | ...
|% | jeffrey | ...
|% | root | ...
+-----------+----------+-
클라이언트가 접속을 시도할 때, 서버는 정렬된 열을 검사하고 처음으로 매치되는 값을 사용한다. For a connection from by
jeffrey가 localhost에서 한 접속의 경우, 테이블의 열 중에 두 개가 일치를 한다: 하나는 'localhost'와 ''의 Host와 User열이고, 다
른 하나는 '%'와 'jeffrey'의 열이다. 'localhost'열이 정렬된 순서에서 처음으로 나타나며, 따라서 서버는 이것을 사용한다.
여기에 다른 예가 있다. user테이블이 아래와 같다고 가정하자:
+----------------+----------+-
+----------------+----------+-
|% | jeffrey | ...
| thomas.loc.gov | | ...
+----------------+----------+-
+----------------+----------+-
+----------------+----------+-
| thomas.loc.gov | | ...
|% | jeffrey | ...
+----------------+----------+-
+----------------+
| CURRENT_USER() |
+----------------+
| @localhost |
+----------------+
여기에 나타나 있는 결과는 매칭된 user테이블의 열이 빈 User컬럼 값을 가지고 있다는 것을 가리킨다. 달리 표현하면, 서버는
jeffrey를 익명의 사용자로 취급하고 있다는 것이다.
여러분이 인증 문제를 진단하기 위해 할 수 있는 방법 중의 하나는 user테이블을 출력해서 일일이 손으로 첫 번째 매칭되는 것을
찾는 것이다.
제목검색
● 와일드카드 문자 ‘%’ 와 ‘_’ 는 각 테이블의 Host와 Db컬럼에서 사용할 수 있다. 이 문자들은 LIKE연산자와 함께 실
행되는 패턴-매칭 동작과 동일한 의미를 가진다. 만약에 여러분이 권한을 승인할 때 이들 문자를 사용하고자 한다면, 백슬
레시를 가지고 문자를 종료 시켜야 한다. 예를 들면, 데이터 베이스 이름에 (‘_’)문자를 포함 시키고자 한다면, GRANT
명령문에서 이름을 ‘₩_’형태로 지정한다.
● db테이블에 있는 '%'Host값은 “모든 호스트( any host)”를 의미한다. Host값을 비어 두면 “host테이블을 나중에 참
조”한다는 의미가 된다.
● host테이블의 '%'또는 비어 있는 Host값은 “모든 호스트(any host)”를 의미한다.
● db 또는 host테이블의 값이 '%'또는 비어 있는 Db값이 되면 “모든 데이터 베이스(any database)”를 의미하게 된다.
● 두 테이블에서 User값이 비게 되면 익명의 사용자를 매치하게 된다.
서버는 db와 host테이블을 메모리로 읽어 오며 서버가 user테이블을 읽을 때 동시에 메모리로 읽어온 내용을 정렬한다. 서버는 db
테이블을 Host, Db, 그리고 User범위 컬럼을 근거로 정렬하며, host테이블은 Host및 Db범위 컬럼을 근거로 정렬한다. user테이
블을 사용하기 때문에, 정렬은 가장 특징적인 값을 우선 사용하고 가장 일반적인 값을 맨 나중에 사용하며, 그리고 서버가 매칭된
엔트리를 검사할 때, 처음으로 매칭된 것을 사용하게 된다.
tables_privcolumns_priv, 그리고 proc_priv테이블은 테이블-특성(table-specific), 컬럼-특성(column-specific), 그리고 루
틴-특성(routine-specific) 권한을 승인한다. 이러한 테이블내의 범위 컬럼에 있는 값은 아래의 형태를 따르게 된다:
● 와일드카드 문자 ‘%’ 와 ‘_’ 는 Host컬럼에서 사용할 수 있다. 이 문자들은 LIKE연산자와 함께 실행되는 패턴-매칭
동작과 동일한 의미를 가진다
● '%'또는 비어 있는Host값은 “모든 호스트(any host)”를 의미한다.
● Db, Table_name, 그리고 Column_name컬럼은 와일드카드 또는 비어있는 값을 가질 수가 없다.
서버는 Host, Db, 그리고 User컬럼을 근거로 tables_priv, columns_priv, 그리고 procs_priv테이블을 정렬한다. 이것은 db테이
블을 정렬하는 것과 비슷하지만, Host컬럼만이 와일드 카드 문자를 가질 수 있기 때문에 보다 단순하게 진행된다.
서버는 들어오는 각각의 요청을 검증하기 위해 정렬된 테이블을 사용한다. SHUTDOWN또는 RELOAD와 같은 관리적인 권한을
요구하는 요청에 대해서, 서버는 user테이블의 열만을 검사하는데, 그 이유는 이 테이블만이 관리적인 권한을 지정하기 때문이다.
서버는 그 열이 요청된 동작을 허용할 경우에 접근을 승인하며, 그 반대일 경우에는 거절을 한다. 예를 들면, 만일 여러분이
mysqladmin shutdown를 실행하고자 원하지만 여러분의 user테이블 열이 여러분의 SHUTDOWN권한을 승인하지 않을 경우, 서
버는 db또는 host테이블에 대한 검사를 하지도 않고 거절을 하게 된다. (이 테이블들에는 Shutdown_priv컬럼이 없으므로, 이것들
을 검사할 필요가 없게 된다.)
데이터 베이스에 관련된 요청 (INSERT, UPDATE, 등등)에 대해서는, 서버는 우선 사용자의 글로벌 (superuser) 권한을 user테
이블 열을 가지고 검사를 한다. 만일 그 열이 요청된 동작을 허용할 경우, 접근이 승인된다. 만약에 이 테이블에 있는 글로벌 권한
이 충분하지 않다면, 서버는 db와 host테이블을 검사해서 사용자의 데이터 베이스 관련 권한을 판단한다:
1. 서버는 Host, Db, 그리고 User컬럼의 매치를 위해 db테이블을 검사한다. Host와 User컬럼은 사용자의 호스트 이름
과 MySQL 사용자 이름간의 연결에 매치된다. Db컬럼은 사용자가 접근하고자 하는 데이터 베이스와 매치가 된다. 만약
에 Host와 User를 위한 열이 없다면, 접근은 거부된다.
2. 만약에 매칭되는 db테이블 열이 있고 그 열의 Host컬럼이 비어 있지 않다면, 그 열은 사용자의 데이터 베이스-특성
권한을 정의하는 것이다.
3. 만약에 매칭되는 db테이블 열의 Host컬럼이 비어 있다면, 이것은 host테이블이 데이터 베이스에 접근이 허용된 호
스트를 모두 열거한다는 것을 의미한다. 이와 같은 경우, Host와 Db컬럼에 매치되는 것을 host테이블에서 찾는 동작이 진
행된다. 아무런 host테이블 열도 매치가 되지 않으면, 접근은 거부된다. 만약에 매치되는 것이 있으면, 사용자의 데이터 베
이스-특성 권한은 db와 host테이블 엔트리에 있는 권한의 교집합(intersection)의 형태로 계산된다 (합집합(union)이
아님); 즉, 양쪽 엔트리엣 'Y'인 권한.
db와 host테이블 엔트리가 승인한 데이터베이스-특성 권한을 결정한 후에, 서버는 이 권한들을 user테이블이 승인하는 글로벌 권
한에 추가한다. 만일 그 결과가 요청 받은 동작을 허용하면, 접근이 승인된다. 그렇지 않으면, 서버는 tables_priv와 columns_priv
테이블에 있는 사용자 테이블과 컬럼 권한을 계속해서 검사를 하며, 그것들을 사용자의 권한에 추가하고, 그리고 그 결과를 가지고
승인 또는 거절을 한다. 스토어드 루틴 동작의 경우, 서버는 tables_priv와 columns_priv가 아닌 procs_priv테이블을 사용한다.
불리안 형식의 수식을 사용하면, 위에서 설명한 사용자 권한을 계산하는 동작 방식은 아래와 같이 정리할 수가 있다:
global privileges
OR table privileges
OR column privileges
OR routine privileges
글로벌 user열 권한이 요청 받은 동작에 대해 초기에 만족스럽지 못한 경우, 서버가 그러한 권한을 데이터 베이스, 테이블, 그리고
컬럼 권한에 나중에 추가하는 이유에 대해서는 분명하지 않을 수도 있다. 그 이유는 요청 동작이 하나 이상의 권한 형태를 요구하
기 때문이다. 예를 들면, 만약에 여러분이 INSERT INTO ... SELECT명령문을 실행한다면, 여러분은 INSERTSELECT에 대한
권한이 필요하게 된다. 여러분의 권한은 user테이블의 열이 하나의 권한을 승인하고 db테이블의 열이 다른 권한을 승인하는 형태
가 될 것이다. 이와 같은 경우, 여러분은 요청 받은 동작을 수행할 수 있는 충분한 권한을 가지게 되지만, 서버는 양 쪽 테이블에 이
러한 것을 알려줄 수가 없게 된다; 양쪽 테이블의 엔트리가 승인한 권한들은 반드시 연결이 되어야 한다.
host테이블은 GRANT또는 REVOKE명령문이 영향을 주지 않는데, 따라서 대부분의 MySQL 설치에서는 사용되지 않는다. 만약
에 여러분이 이것을 직접 수정한다면, 여러분은 이것을 보안 서버 리스트 관리와 같은 몇몇 특별한 목적으로 사용할 수가 있다. 예
를 들면, TcX에서, host테이블은 로컬 네트워크에 있는 모든 머신의 리스트를 가지고 있다. 이것들은 모든 권한을 승인한다.
여러분은 또한 host테이블을 사용해서 안전하지 못한 호스트를 가리킬 수도 있다. 여러분이 안전하지 못하다고 생각하는 공중망에
존재하는 public.your.domain라는 머신을 가지고 있다고 가정하자. 여러분은 아래와 같은 host테이블을 사용하여 그 머신을 제외
한 모든 호스트가 접근을 할 수 있도록 만들 수가 있다:
+--------------------+----+-
| Host | Db | ...
+--------------------+----+-
+--------------------+----+-
제목검색
5. 데이터 베이스 관리 Mysqld이 시작이 될 때, 서버는 모든 그랜트 테이블의 내용을 메모리로 읽어 온다. 메모리에 있는 테이블은 그 시점부터 접근 제어
5.8. MySQL 권한 시스템 에 효력을 나타낸다.
5.8.7 권한 변경시의 효과
서버가 그랜트 테이블을 다시 읽어 올 때, 현재 존재하는 클라이언트 접속에 대한 권한은 아래와 같이 영향을 받는다:
만약에 여러분이 GRANT, REVOKE, 또는 SET PASSWORD와 같은 명령문을 사용해서 간접적으로 그랜트 테이블을 수정한다
면, 서버는 이러한 변경 사항을 인지하게 되고 그랜트 테이블을 메모리고 즉시 다시 읽어 온다.
만약에 INSERT, UPDATE, 또는 DELETE와 같은 명령문을 사용해서 그랜트 테이블을 직접 수정한다면, 여러분이 서버를 다시
시작하거나 또는 서버가 그랜트 테이블을 다시 읽어 오도록 만들 때까지 변경 사항이 적용되지 않는다. 그랜트 테이블을 수동으로
읽어 오기 위해서는 FLUSH PRIVILEGES 명령문을 입력하거나 또는 mysqladmin flush-privileges 또는 mysqladmin reload
명령어를 실행한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=8&scate=7&idx=15312006-08-03 오후 4:20:04
:::MySQL Korea:::
제목검색
5.8. MySQL 권한 시스템 ● 서버가 구동되고 있는지를 확인한다. 만약에 아래와 같은 에러가 나오는 원인 중의 하나는, 서버가 구동을 하고 있지 않는
· shell> mysql
· shell> mysql
· '/tmp/mysql.sock' (111)
서버는 구동을 하고 있다고 한다면, TCP/IP 포트, 네임드 파이프, 또는 유닉스 소켓 파일등을사용해서 서버에 접속을 다
시 시도해 본다. 클라이언트 프로그램을 호출할 때 이 문제를 해결하기 위해서는, --port옵션을 사용해서 포트 번호를 지
정하고, 또는 --socket옵션을 사용해서 네임드 파이프 또는 유닉스 소켓 파일의 이름을 지정한다. 소켓 파일이 있는 곳
을 알아내기 위해서는, 아래의 명령어를 사용한다:
● 서버가 접근 제어를 하는데 올바르게 사용할 수 있도록 그랜트 테이블이 정확히 설정되어야 한다. 몇몇 배포판의 경우 (윈
도우상의 바이너리 배포판, 또는 리눅스의 RPM 등), 설치 과정에서 그랜트 테이블을 가지고 있는 mysql데이터 베이스를
초기화 시킨다. 이러한 일을 하지 못하는 배포판의 경우, 여러분은 mysql_install_db 스크립트를 사용해서 수동으로 그랜
트 테이블에 대한 초기화를 해 주어야 한다 Section 2.9.2, “유닉스설치후처리프로세스”를 참조.
여러분이 그랜트 테이블을 초기화 시켜야 하는지를 판단할 수 있는 한 가지 방법은 데이터 디렉토리 밑에 있는 mysql디렉
토리를 검사하는 것이다. (데이터 디렉토리는 보통 data또는var라는 이름으로 되어 있고 MySQL 설치 디렉토리 아래에
있다.) mysql데이터 디렉토리에 user.MYD라는 이름의 파일을 가지고 있는지 확인한다. 만약에 없다면,
mysql_install_db스크립트를 실행한다. 이 스크립트를 실행하고 서버를 재 시작한 다음에, 아래의 명령어를 실행해서 초
기 권한을 테스트한다:
● MySQL 설치를 갱신한 후에는, 여러분은 서버에 접속을 해서 여러분의 사용자와 사용자들의 접근 허용을 설정해야 한다:
● 만약에 이미 설치되어 있는 MySQL을 새로운 버전으로 업그레이드를 하였다면, 여러분은 mysql_upgrade 스크립트를 다
시 실행하였는가? 만약에 하지 않았다면, 이것을 실행한다. 그랜트 테이블의 구조는 새로운 기능이 추가되면 변경이 되며,
따라서 버전 업그레이드를 한 후에는, 여러분은 항상 테이블이 새로운 버전의 구조를 가지고 있도록 만들어야 한다. 이렇
게 하는 방법은 Section 5.6.2, “mysql_upgrade를 참조하기 바란다. —MySQL 업그레이드를위한테이블검사하기”
● 만약에 클라이언트 프로그램이 서버에 접속을 할 때 아래와 같은 에러 메시지를 받게 된다면, 이것은 클라이언트가 만들어
내는 포맷이 아닌 새로운 포맷의 패스워드를 서버가 요청한다는 것을 의미한다:
· shell> mysql
이것을 다루는 방법에 대해서는 Section 5.8.9, “MySQL 4.1 이후의패스워드해싱”, 및Section A.2.3, “Client does
not support authentication protocol”를 참조하기 바란다.
● 만약에 여러분이 root사용자로 접속을 시도할 때 아래와 같은 에러를 받게 되면, 이것은 user테이블에서 'root'값의 User
컬럼을 가지고 있는 열을 여러분이 가지고 있지 않다는 것과 mysqld이 여러분의 클라이언트를 위한 호스트 이름을 해석하
지 못하고 있다는 것을 의미한다:
만약에 여러분이 아무런 패스워드도 지정하지 않았는데도 위와 같은 에러가 나온다면, 이것은 여러분이 옵션 파일들 중에
한곳에 잘못된 패스워드를 넣어 두었다는 것을 의미한다. 위에 나온 것을 가지고 --no-defaults옵션을 사용해서 다시
한번 시도한다.
만약에 root패스워드를 잊었다면, 패스 워드 변경을 위해 mysqld를 --skip-grant-tables옵션을 사용해서 재 시작한
다. Section A.4.1, “How to Reset the Root Password”를 참조.
● 만약에 SET PASSWORD, INSERT, 또는 UPDATE를 사용해서 패스워드를 변경한다면, 여러분은 반드시 PASSWORD
()함수를 사용해서 패스워드를 암호화 해야 한다. 만약에 PASSWORD()를 사용하지 않는다면, 패스워드는 동작을 하지
않게 된다. 예를 들면, 아래의 명령문은 패스워드를 설정하기는 하지만, 암호화를 하지 못하며, 따라서 사용자는 접속을 할
수가 없게 된다:
● localhost는 여러분의 로컬 호스트 이름과 동의어이며, 이것은 또한 여러분이 호스트를 명확하게 지정하지 않을 경우에 클
라이언트가 접속을 시도하는 디폴트 호스트가 된다.
● 만약에 여러분이 mysql -u user_name를 사용해서 데이터 베이스에 접속을 시도할 때 Access denied라는 에러가 생긴
다면, 여러분은 user테이블에 문제를 가지고 있는 것이다. mysql -u root mysql를 실행하고 아래의 SQL 명령문을 입력
해서 이 이 테이블을 검사한다:
결과 값에는 여러분의 시스템 호스트 이름과 MySQL 사용자 이름에 매치되는 Host와 User컬럼을 가지는 열이 있을 것이
다.
● Access denied에러는 여러분이 어떤 사용자 이름으로 로그인을 시도하고 있는지, 어떤 클라이언트 호스트에서 접속을 하
고자 하는지, 그리고 패스워드를 사용하고 있는지를 알려준다. 일반적으로, 여러분은 에러 메시지에 나와 있는 호스트 이름
과 사용자 이름에 정확히 매치되는 열을 user테이블에 가지고 있어야 한다. 예를 들면, 만약에 여러분이 using password:
NO가 포함된 에러 메시지를 받게 된다면, 이것은 여러분이 패스워드 없이 로그인을 시도하였다는 것을 의미한다.
● 만약에 MySQL 서버가 구동되고 있는 서버가 아닌 다른 호스트에서 접속을 시도할 때 아래와 같은 에러가 발생한다면, 이
것은 클라이언트 호스트와 매치되 Host값을 가진 user테이블 열이 존재하지 않는다는 것을 의미한다:
여러분은 접속을 시도할 때 클라이언트의 호스트 이름과 사용자 이름에 대한 계정을 설정해서 이 문제를 해결할 수가 있
다.
만약에 접속을 시도하는 시스템의 IP 번호 또는 호스트 이름을 모른다면, user 테이블에 있는 Host컬럼 값에 '%'를 넣는
다. 클라이언트 머신에서 접속을 시도한 후에는, SELECT USER()쿼리를 사용해서 여러분이 실제로 접속을 했는지 확인
한다. (그런 다음에 user테이블 열의 '%'값을 로그에서 찾은 실제 호스트 이름으로 바꾼다. 그렇지 않으면, 서버는 모든 호
스트가 접속을 할 수 있도록 허용을 하기 때문에 시스템의 보안에 문제가 생기게 된다.)
리눅스에서는, 이러한 에러가 생기는 또 다른 이유는 여러분이 사용하는 버전과 다른 glibc라이브러리 버전을 사용해서 컴
파일된 MySQL 바이너리 버전을 여러분이 사용할 경우에 발생하기도 한다. 이와 같은 경우, 여러분은 OS 또는 glibc를 업
그레이드 해야 하거나, 또는 MySQL 소스 버전을 다운로드 해서 여러분 스스로 컴파일 해서 사용해야 한다.
● 만약에 접속을 시도할 때 호스트 이름을 지정하였으나, 호스트 이름이 보이지 않고 IP 번호만 나오는 에러를 가지게 되면,
이것은 MySQL 서버가 IP 번호를 호스트 이름으로 해석하는데 있어서 에러가 발생했다는 것을 의미하는 것이다:
이것은 DNS 문제를 가리키는 것이다. 이것을 해결하기 위해서는, mysqladmin flush-hosts를 실행해서 내부 DNS 호스
트 이름 캐시를 리셋 시킨다. Section 7.5.6, “MySQL DNS 사용방법”을 참조.
영구적인 해결 방법은:
호스트 이름 . (period)에 접속을 한다. 호스트 .에 대한 접속은 TCP/IP가 아닌 네임드 파이프를 사용한다.
● 만약에 mysql -u root test가 동작은 하지만 mysql -h your_hostname -u root test의 결과로 Access denied
(your_hostname은 로컬 호스트의 실제 호스트 이름)가 발생한다면, 여러분은 아마도 user테이블에 있는 호스트에 대해
정확한 이름을 가지고 있지 않는 것이다. 여기에서의 일반적인 문제는 in the user테이블 열에 있는 Host값이 검증되지 않
은 호스트 이름을 지정하고 있으나, 시스템의 이름 해석 루틴은 완전히 검증된 도메인 이름을 돌려준다는 것이다(혹은 그
반대). 예를 들면, 만약에 user테이블에 호스트'tcx'를 가지는 엔트리가 있으나, DNS가 MySQL에게 호스트 이름은 'tcx.
subnet.se'라고 알려줄 경우, 그 엔트리는 동작을 하지 않게 된다. 엔트리를 Host컬럼 값을 호스트의 IP 번호로 가지고 있
는 user테이블에 추가하도록 해본다. (다른 방법으로는, 와일드 카드를 가지고 있는 Host값이 있는 user테이블에 엔트리
를 추가해 본다; 예를 들면, 'tcx.%'. 하지만, ‘%’로 끝나는 이름을 가진 것을 사용하는 것은 보안에 문제가 생기기 때문
에 권장하지는 않는다!)
● 만약에 mysql -u user_name test는 동작은 하지만 mysql -u user_name other_db_name이 동작을 하지 않는다면, 여
러분은 주어진 사용자의 other_db_name에 대한 데이터 베이스 접근 권한을 승인하지 않은 것이다.
● 만약에 mysql -u user_name가 서버 호스트에서 실행될 때 제대로 동작은 하지만, 리모트 클라이언트 호스트에서 실행
할 때에는 mysql -h host_name -u user_name가 동작하지 않는다면, 리모트 호스트에서 주어진 사용자 이름에 대한 서
버 접근을 활성화 시키지 않은 것이다.
● 만약에 여러분이 Access denied에러가 발생한 이유를 모른다면, 와일드 카드를 가지고 있는 Host값이 있는 모든 엔트리
( ‘%’ 또는 ‘_’를 가지고 있는 엔트리)를 the user테이블에서 삭제를 한다. 가장 일반적인 에러는 Host='%'와
User='some_user’를 가지고 새로운 엔트리를 삽입하는 것이다. 이것이 동작을 하지 않는 이유는 디폴트 권한이
Host='localhost'와 User=''를 가지고 있는 엔트리를 포함하고 있기 때문이다. 엔트리가 '%'보다 구체적인 Host값인
'localhost'를 가지고 있기 때문에, localhost에서 접속을 할 때 새로운 엔트리를 위해 이것이 우선적으로 사용된다. 올바른
진행 과정은 Host='localhost'와 User='some_user'를 가지고 두번째 엔트리를 삽입하거나, 또는 Host='localhost'와
User=''를 가지고 있는 엔트리를 삭제하는 것이다. 엔트리를 삭제한 후에는, 그랜트 테이블을 다시 읽어 오기 위해
FLUSH PRIVILEGES명령문을 입력하는 것을 잊지 말기 바란다.
● 만약에 여러분이 아래의 에러를 가지게 된다면, 아마도 db또는 host테이블에 문제가 있는 것이다:
만약에 db테이블에서 선택된 엔트리가 Host컬럼에 빈 값을 가지고 있다면, db테이블이 적용되는 호스트를 지정하는 host
테이블에 있는 엔트리가 하나 또는 그 이상이 있는지를 확인한다.
● 만일 여러분이 MySQL 서버에 접속을 할 수는 있지만, SELECT ... INTO OUTFILE또는 LOAD DATA INFILE명령문
을 입력할 때마다 Access denied에러 메시지를 가지게 되면, user테이블에 있는 여러분의 엔트리가 활성화된 FILE권한
을 가지고 있지 않다는 것이다.
● 만일 여러분이 직접 그랜트 테이블을 변경하였지만 변경된 내용이 무시되고 있다고 판단되면 execute a FLUSH
PRIVILEGES명령문 또는 mysqladmin flush-privileges 명령어를 실행 시켜서 서버로 하여금 권한 테이블을 다시 읽어
오도록 만들어야 한다. 그렇지 않으면, 서버가 재 구동되기까지 변경한 내용이 적용되지 않는다. UPDATE명령어를 가지
고 root패스워드를 변경한 후에는, 여러분이 권한을 플러시하기 전까지는 새로운 패스워드를 지정할 필요가 없는데, 그 이
유는 서버가 변경된 패스워드를 아직 모르고 있기 때문이다
● 만약에 여러분의 권한이 세션 도중에 변경되었다고 판단되면, 이것은 관리자가 변경을 한 것으로 생각할 수가 있다. 그랜
트 테이블을 다시 읽어 오는 것은 새로운 접속에 영향을 미치지만, 이것은 또한 Section 5.8.7, “권한변경시의효과”에서
설명하고 있는 것처럼 현재 존재하고 있는 접속에도 영향을 미치게 된다.
● 만약에 Perl, PHP, Python, 또는 ODBC 프로그램 접속에 문제가 있다면, mysql -u user_name db_name또는 mysql -
u user_name -pyour_pass db_name를 사용해서 서버에 접속해 본다. 만약에 mysql 클라이언트를 사용해서 접속할 수
가 있다면, 문제는 접근 권한에 있는 것이 아니라 프로그램에 있는 것이다.
● 테스트를 위해, mysqld서버를 --skip-grant-tables옵션과 함께 시작한다. 그런 다음에 MySQL의 그랜트 테이블을 변
경하고 mysqlaccess 스크립트를 사용해서 여러분이 변경시킨 내용이 원하는 형태로 진행되는지를 검사한다. 변경 내용이
제대로 동작되면, mysqladmin flush-privileges를 실행해서 mysqld 서버가 새로운 그랜트 테이블을 사용해서 시작되도
록 만든다.
만약에 모든 것이 실패를 할 경우에는, mysqld서버를 디버깅 옵션을 사용해서 구동 시킨다 (예를 들면, --debug=d,general,
query). 이것은 접속을 시도한 호스트와 사용자에 대한 정보를 출력해 주고, 또한 입력된 각 명령어에 대한 정보도 보여 준다.
Section E.1.2, “Creating Trace Files”를 참조.
제목검색
5. 데이터 베이스 관리 MySQL 사용자 계정은 mysql 데이터 베이스의 user 테이블에 리스트 되어 있다. 각 MySQL 계정에는 패스워드가 할당되는데,
5.8. MySQL 권한 시스템 user 테이블의 Password 컬럼에 저장되는 패스워드는 일반적인 문장이 아닌 해시 값으로 저장된다. 패스워드 해시 값은
● 클라이언트가 서버에 접속을 시도할 때, 클라이언트가 사용하고자 하는 계정을 위한 user 테이블에 저장된 해시 값과 매칭
되는 해싱 값을 갖고 있는 패스워드를 클라이언트가 표현해야 하는 초기 인증 절차가 있다.
● 클라이언트는 접속을 한 후에는, 클라이언트는 user 테이블에 있는 계정에 대한 패스워드 해시를 설정 또는 변경할 수가 있
게 된다. 클라이언트는 패스워드 해시를 만들기 위한 PASSWORD() 함수를 사용하거나, 또는 GRANT 또는 SET
PASSWORD 명령문을 사용해서 이 일을 수행한다.
달리 표현하면, 서버는 클라이언트가 처음으로 접속을 시도할 때 인증을 하는 동안에 이 해시 값을 사용한다. 서버는 접속된 클라이
언트가 PASSWORD() 함수를 호출하거나 또는 GRANT 또는 SET PASSWORD 명령문을 사용해서 명령문을 설정 또는 변경하
는 경우에 해시 값을 생성한다.
패스워드 해싱 매커니즘은 MySQL 4.1에서 개선되어 보다 우수한 보안성을 제공해 주었다. 하지만, 이 새로운 매커니즘은 4.1(그
리고 그 이후 버전)의 서버와 클라이언트에서만 사용이 가능하며, 그 결과 이전 버전과의 호환성에 문제가 생기게 되었다. 4.1 또
는 그 이후 버전의 클라이언트는 이전 버전의 서버에 접속을 할 수는 있으나, 4.1 이전 버전의 클라이언트가 4.1 이후의 서버에 접
속하는 것은 문제를 가지게 된다. 예를 들면, 5.0 서버에 접속을 시도하는 3.23 mysql 클라이언트는 아래와 같은 에러를 가질 수
가 있다:
아래의 내용은 구형과 새로운 패스워드 매커니즘간의 차이점에 대한 설명이며, 여러분이 서버를 업그레이드하는 경우에 4.1 이전
버전과의 호환성을 유지하기 위해서 취해야 할 일들에 대해 알려주고 있다. 부가적인 정보는 Section A.2.3, “Client does not
support authentication protocol”을 참고하기 바란다. 이 정보는 4.0 또는 이전 버전을 4.1 또는 그 이후 버전으로 업그레이드
를 하고자 하는 PHP 프로그래머에게 특히 중요한 사항이다.
Note: 여기에서는 4.1 이전 버전과 4.1 버전과의 차이점에 대해 주로 설명을 하는데, 4.1의 특성은 실제로는 4.1.1 이후 버전에 관
한 것이다. MySQL 4.1.0은 4.1.1 이후 버전과는 다소 차이가 있는 매커니즘을 사용하고 있기 때문에 “odd” 릴리즈라고 간주된
다.
MySQL 4.1 이전 버전에서는, PASSWORD() 함수가 계산하는 패스워드 해시는 16 바이트이다. 그러한 해시는 다음과 같이 보인
다:
+--------------------+
| PASSWORD('mypass') |
+--------------------+
| 6f8c114b58f2ce9e |
+--------------------+
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
● 만약에 여러분이 5.0을 새롭게 설치한다면, Password 컬럼은 자동적으로 41 바이트 길이로 만들어 진다.
● MySQL 4.1 (4.1.1 또는 4.1 시리즈의 나중 버전)에서 MySQL 5.0로 업그레이드할 때에는, 두 버전이 모두 동일한 매커
니즘을 사용하고 있기 때문에 별도로 해야 할 일이 없다. 하지만, 4.1 이전 버전에서 5.0으로 업그레이드를 하고자 한다면,
우선 4.1로 업그레이드를 한 후에 5.0으로 업그레이드를 해야 한다.
확장된 Password 컬럼은 구형 및 신형의 패스워드 해시 포맷 값을 저장할 수가 있다. 주어진 패스워드 해시 값의 구분은 두 가지
방법으로 판단된다:
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=9&scate=0&idx=15342006-08-03 오후 4:22:58
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 MySQL 계정은 사용자 이름(username) 과 사용자가 서버에 접속을 할 수 있는 클라이언트 호스트 또는 호스트라는 용어로 정의
5.9. MySQL 사용자 계정 관리 된다. 계정에는 패스워드도 있다. MySQL이 사용하는 사용자 이름 및 패스워드와 OS가 이것들을 다루는 방식에는 뚜렷한 차이점
● MySQL이 인증의 목적으로 사용하는 사용자 이름은 윈도우 또는 유닉스가 사용하는 사용자 이름(로그인 이름)과는 아무
런 상관이 없다. 유닉스에서는, 대부분의 MySQL 클라이언트는 디폴트로 MySQL이 사용하는 사용자 이름을 현재의 유닉
스 사용자 이름으로 사용해서 로그인을 시도하지만, 이것은 단지 편의상의 이유 때문이다. 디폴트는 쉽게 변경 시킬 수가
있는데, 그 이유는 클라이언트 프로그램은 사용자 이름을 -u 또는 --user 옵션을 사용해서 지정할 수 있도록 하기 때문
이다. 이것은 누구라도 어떤 사용자 이름을 가지고도 서버에 접속을 할 수 있다는 것을 의미하는 것이기 때문에, 모든
MySQL 계정이 패스워드를 가지지 않는 한 여러분은 데이터 베이스를 안전하게 만들지 못하게 된다.
● MySQL 사용자 이름은 최대 16 문자 길이로 만들 수가 있다. 이 제한은 MySQL 서버와 클라이언트에는 엄격하게 적용되
며, mysql 데이터 베이스에 있는 테이블의 정의를 수정해서 이 제한을 없앨 수는 없다.
OS가 사용하는 사용자 이름은 MySQL의 사용자 이름과는 전혀 관련이 없으며 최대 가능길이도 서로 틀리다. 예를 들면,
유닉스에서는 전형적으로 문자 길이가 8로 제한된다.
● MySQL 패스워드는 여러분이 OS에 로그인할 때 사용하는 패스워드와는 아무런 상관이 없는 것이다.
● MySQL는 자신의 고유 알고리즘을 사용해서 패스워드를 암호화 한다. MySQL이 사요하는 암호화 기법은 PASSWORD
() SQL 함수이며, 유닉스에서는 ENCRYPT() SQL 함수를 사용해서 암호화를 한다.
여러분이 MySQL을 설치할 때, 그랜트 테이블은 초기 계정 셋을 가지게 된다. 이러한 계정들은 초기 Section 2.9.3, “초기
MySQL 계정 보안 설정하기”에서 설명하는 이름과 접근 권한을 가지게 된다. 그 후에, 여러분은 GRANT 와 REVOKE와 같은 명
령문을 사용해서 MySQL 계정을 설정, 수정, 그리고 제거할 수가 있게 된다. Section 13.5.1, “계정 관리 명령문”을 참조.
명령어 라인의 클라이언트를 가지고 서버에 접속을 할 때에는, 여러분은 사용하고자 하는 사용자 계정을 위한 사용자 이름과 패스
-p 옵션과 패스워드 값 사이에는 스페이스가 없다. Section 5.8.4, “MySQL 서버에 접속하기”를 참조.
위의 명령어에는 패스워드 값이 명령어 라인에 보이게 되기 때문에 보안의 문제가 생긴다. See Section 5.9.6, “패스워드 보안 유
지하기”를 참조. 이것을 피하기 위해서는, --password 또는 -p 옵션을 아래와 같이 사용한다:
패스워드 옵션이 패스워드 값을 가지지 않으면, 클라이언트 프로그램은 프롬프트를 발생시켜서 여러분이 패스워드를 입력하기를
기다리게 된다. (이 경우에, db_name는 패스워드 값으로 인식되지 않는데, 그 이유는 패스워드 옵션과 뒤의 값 사이에 스페이스가
있기 때문이다.)
어떤 시스템에서는, MySQL이 패스워드를 위한 프롬프트로 사용하는 라이브러리 루틴이 자동적으로 패스워드의 길이를 8 문자로
한정한다. 이것은 시스템 라이브러리에 관련된 문제이며, MySQL과는 관련이 없다. 내부적으로는, MySQL은 패스워드의 길이를
제한하지 않는다. 이 문제를 피하기 위해서는, 여러분의 MySQL 패스워드를 8 또는 그보다 작은 값으로 변경을 하거나, 또는 옵션
파일에 패스워드를 넣어두면 된다.
제목검색
5.9.2 MySQL에 새로운 사용자 계정 추가하기 ● CREATE USER or GRANT와 같이 계정 생성을 진행하는 명령문을 사용한다
● INSERT, UPDATE, 또는 DELETE와 같은 명령문을 사용해서 MySQL 그랜트 테이블을 직접 편집한다
첫 번째 방법이 보다 간편하고 에러가 나올 확률이 적다. CREATE USER 와 GRANT는 Section 13.5.1.1, “CREATE USER 신
텍스”, 및 Section 13.5.1.3, “GRANT 신텍스”에서 설명을 하고 있다.
계정 생성을 위한 또 하나의 옵션은 MySQL 계정 관리 기능을 제공하는 타 회사의 제품을 사용하는 것이다. phpMyAdmin이 이런
제품 중에 하나이다.
아래의 예제는 mysql 클라이언트 프로그램을 사용해서 새로운 사용자를 설정하는 방법을 보여준다. 이 예제에서는 권한이
Section 2.9.3, “초기 MySQL 계정에 보안 작업하기”에서 설명하는 디폴트에 따라서 설정되어 있다는 가정을 한다. 이것은 변
경 작업을 하기 위해서는, 여러분이 반드시 MySQL 서버에 MySQL root 사용자로 접속을 해야 하고, 그리고 root 계정은 반드시
mysql 데이터 베이스에 대해서는 INSERT 권한을 가지고 RELOAD 관리 권한을 가지고 있어야 한다는 것을 의미한다.
우선, mysql 프로그램을 사용해서 MySQL root 사용자로 서버에 접속을 한다:
만약에 루트 계정에 패스워드를 할당하였다면, --password 또는 -p 옵션을 사용해서 mysql 명령어를 입력한다.
서버에 접속을 한 후에는, 여러분은 새로운 계정을 추가할 수가 있게 된다. 아래의 명령문은 GRANT 를 사용해서 새로운 계정을 설
정한다:
GRANT명령문에 대한 대안으로, 여러분은 동일한 계정을 INSERT 명령문을 입력해서 직접 생성할 수 있고 그런 다음에 FLUSH
PRIVILEGES를 사용해서 서버가 그랜트 테이블을 다시 읽어 오도록 만들 수가 있다.
-> VALUES('localhost','monty',PASSWORD('some_pass'),
-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
-> VALUES('%','monty',PASSWORD('some_pass'),
-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
-> VALUES('localhost','dummy','');
여러분이 INSERT를 사용해서 계정을 생성할 때 FLUSH PRIVILEGES를 사용하는 이유는 서버가 그랜트 테이블을 다시 읽어 오
도록 만들기 위해서이다. 그렇지 않으면, 여러분이 서버를 재 구동 시키기 전에는 변경 사항이 적용되지 않느다. GRANT를 사용하
는 경우는, FLUSH PRIVILEGES가 필요 없다.
PASSWORD() 함수를 INSERT와 함께 사용하는 이유는 패스워드를 암호화 하기 위해서다. GRANT 명령문은 패스워드를 암호
화 하며, 따라서 PASSWORD()가 필요 없게 된다.
'Y' 값은 계정의 권한을 활성화 시킨다. 여러분이 사용하는 MySQL 버전에 따라, 맨 처음 두 개의 INSERT 명령문에서 서로 다른
수의 'Y' 값을 사용할 것이다. admin 계정의 경우, 여러분은 SET을 사용하는 확장된 INSERT 신텍스를 추가할 수가 있을 것이다.
dummy 계정에 대한 INSERT 명령문의 경우, user 테이블 열의 Host, User, 및 Password 컬럼에만 값이 할당된다. 아무런 권
한 컬럼도 명확하게 설정이 되지 않았기 때문에, MySQL은 디폴트 값인 'N'을 모두 할당한다. 이것은 GRANT USAGE가 실행하
는 것과 같은 결과 값이다.
슈퍼유저 계정을 설정하기 위해서는, 권한 컬럼을 'Y'로 설정한 user 테이블 엔트리를 생성하기만 하면 된다는 점을 알아두자.
user 테이블 권한은 글로벌이며, 따라서 다른 그랜트 테이블의 어떤 엔트리도 필요가 없게 된다.
다음의 예제에서는 세 개의 계정을 생성하며 각 계정들이 특정 데이터 베이스에 접근할 수 있도록 하고 있다. 각각의 계정은 이름
이 custom이며 패스워드는 obscure가 된다.
-> ON bankaccount.*
-> TO 'custom'@'localhost'
-> ON expenses.*
-> TO 'custom'@'whitehouse.gov'
-> ON customer.*
-> TO 'custom'@'server.domain'
custom 계정을 GRANT 없이 설정하기 위해서는, 그랜트 테이블을 직접 수정하기 위해 아래와 같이 INSERT 명령문을 사용한다:
-> VALUES('localhost','custom',PASSWORD('obscure'));
-> VALUES('whitehouse.gov','custom',PASSWORD('obscure'));
-> VALUES('server.domain','custom',PASSWORD('obscure'));
-> (Host,Db,User,Select_priv,Insert_priv,
-> Update_priv,Delete_priv,Create_priv,Drop_priv)
-> VALUES('localhost','bankaccount','custom',
-> 'Y','Y','Y','Y','Y','Y');
-> (Host,Db,User,Select_priv,Insert_priv,
-> Update_priv,Delete_priv,Create_priv,Drop_priv)
-> VALUES('whitehouse.gov','expenses','custom',
-> 'Y','Y','Y','Y','Y','Y');
-> (Host,Db,User,Select_priv,Insert_priv,
-> Update_priv,Delete_priv,Create_priv,Drop_priv)
-> VALUES('server.domain','customer','custom',
-> 'Y','Y','Y','Y','Y','Y');
처음 세 개의 INSERT 명령문은 사용자 custom이 주어진 패스워드를 가지고 다양한 호스트에서 접속을 할 수는 있지만, 글로벌
권한을 승인하지 않는 user테이블 엔트리를 추가하고 있다 (모든 권한은 디폴트 값이
제목검색
5. 데이터 베이스 관리 계정을 제거하기 위해서는, DROP USER 명령문을 사용한다. Section 13.5.1.2, “DROP USER 신텍스”를 참조할
5.9. MySQL 사용자 계정 관리 것.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=9&scate=3&idx=15372006-08-03 오후 4:23:23
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 MySQL 서버의 자원 사용을 제한하는데 사용하는 방법 중의 하나는 max_user_connections 시스템 변수의 값을 0이 아니 값으
5.9. MySQL 사용자 계정 관리 로 설정하는 것이다. 하지만, 이 방법은 글로벌하게 적용되게 되며, 개별 사용자 계정을 관리하지는 못한다. 또한, 단일 계정을 사용
5.9.4 계정 자원 제한하기 해서 이루어지는 동시 접속의 숫자만을 제한하며, 접속을 한 클라이언트의 동작을 제한 하지는 못한다.
클라이언트가 입력하는 모든 명령문이 쿼리 제한치에 대해서 계산된다. 데이터 베이스 또는 테이블을 수정하는 명령문만이 업데이
트 제한치에 대해 계산된다.
MySQL 5.0.3 이후에는, 하나의 계정 당 서버에 동시에 접속할 수 있는 숫자를 제한할 수도 있게 되었다.
이 문장에서 표현되는 계정은 user 테이블에 있는 단일 열이다. 각 계정은 자신의 User 와 Host 컬럼 값을 가지고 서로 구분 된다.
이러한 기능을 사용하기 위한 필요 요건으로는, mysql 데이터 베이스에 있는 user 테이블은 반드시 자원-권련 컬럼을 가지고 있
어야 한다. 자원 제한은 max_questions, max_updates, max_connections, 그리고 max_user_connections 컬럼에 저장된다. 만
일 여러분의 user 테이블에 이러한 컬럼이 없다면, 이 테이블을 업그레이드 해야 한다; Section 5.6.2, “mysql_upgrade —
MySQL 업그레이드를 위한 테이블 검사”를 참조할 것.
GRANT 명령문을 사용해서 자원의 한계를 설정하기 위해서는, 제한되는 자원의 이름을 지정하고 재한 값을 가리키는 시간당 카운
트를 하는 WITH 구문을 사용한다. 예를 들면, customer 데이터 베이스에는 접근할 수는 있으나, 제한적인 범위에서만 가능한 계
정을 새로 만들기 위해서는, 아래와 같이 명령문을 입력한다:
-> MAX_UPDATES_PER_HOUR 10
-> MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 2;
제한 타입을 WITH 구문에 모두 거론할 필요는 없으나, 제한 타입의 이름들은 일정 순서로 표시될 수는 있다. 각각의 시간당 제한
치 값은 시간당 카운트 되는 정수 값이 되어야 한다. 만약에 GRANT 명령문이 WITH 구문을 가지고 있지 않다면, 제한치는 각각
디폴트 0으로 설정된다 (즉, 제한 없음). MAX_USER_CONNECTIONS의 경우, 제한치는 그 계정이 어느 한 시점에 동시에 접속
을 할 수 있는 최대 값을 나타내는 정수 값이 된다. 만일 이 값이 디폴트 0으로 설정되면, max_user_connections 시스템 변수 값
이 그 계정의 동시 접속 숫자가 된다.
현재 존재하는 계정의 제한치를 설정 또는 변경하기 위해서는, 글로벌 레벨 (ON *.*)에서 GRANT USAGE 명령문을 사용한다. 아
래의 명령문은 francis의 쿼리 한계를 100으로 변경한다:
현재의 제한 값을 제거하기 위해서는, 그 값을 0으로 설정한다. 예를 들면, francis가 한 시간에 접속할 수 있는 한계 값을 제거하
기 위해서는, 아래의 명령문을 사용한다:
서버는 구동을 하면서, 각 계정이 자원을 사용하는 횟수를 계산한다. 만일 한 계정이 시간당 접속 한계치에 도달하게 되면, 서버는
새로운 시간 단위가 발생하기 전까지 그 계정에 대한 접속을 거부한다. 그 계정이 쿼리나 업데이트 한계치에 도달할 경에도 마찬가
지로 동작을 한다. 이러한 모든 경우에는 에러 메시지가 나오게 된다.
자원 계산은 클라이언트 단위가 아닌 계정 단위로 이루어진다. 예를 들면, 만약에 여러분의 계정이 쿼리 한계를 50으로 하고 있다
면, 여러분은 서버에 두 개의 클라이언트를 동시에 접속을 시키는 방법으로 이 한계를 100으로 늘릴 수는 없다. 양쪽에서 일어나
는 쿼리는 같이 계산이 된다.
현재의 시간당 자원 사용 카운트는 모든 계정에 대해 전체적으로, 또는 주어진 계정에 대해서만 개별적으로 리셋 시킬 수가 있다:
● 모든 계정에 대해 현재의 카운트 값을 0으로 리셋 시키기 위해서는, FLUSH USER_RESOURCES 명령문을 사용한다. 이
카운트 값은 그랜트 테이블을 다시 읽어 와서 리셋 시킬 수도 있다 (예를 들면, FLUSH PRIVILEGES 명령문 또는
mysqladmin reload 명령어를 사용해서).
● 개별 계정에 대한 카운트 값은 그 제한 값 중의 하나를 재 승인함으로써 0으로 설정할 수가 있다. 이렇게 하기 위해서는, 앞
에서 설명한 방식으로 GRANT USAGE를 사용하고 제한 값을 그 계정이 현재 가지고 있는 값과 같이 지정을 한다.
제목검색
5. 데이터 베이스 관리 페스워드는 mysqladmin 명령어를 사용해서 명령어 라인에서 할당해 줄 수가 있다:
5.9. MySQL 사용자 계정 관리
이 명령어가 패스워드를 리셋 시키는 계정은 User 컬럼에 있는 user_name 과 매치되는 user 테이블 열과 Host 컬럼에 있는 클라
이언트 호스트를 가지고 있는 계정이 된다.
mysql 데이터 베이스에 업데이트 접근을 할 수 있는 root 사용자만이 다른 사용자의 패스워드를 변경 시킬 수가 있다. 만일 여러분
이 익명의 사용자로 접속을 할 수 없다면, FOR 구문을 생략해서 여러분 자신의 패스워드를 변경 시킬 수가 있게 된다:
여러분은 또한 글로벌 레벨(ON *.*)에서 GRANT USAGE 명령문을 사용해서 한 계정의 현재 권한에 영향을 미치지 않고 패스워
드를 할당할 수가 있다:
비록 위의 방법들을 사용해서 패스워드를 할당하는 것이 일반적인 방법이기는 하지만, 여러분은 user 테이블을 직접 수정을 해서
동일한 일을 처리할 수도 있다:
• -> VALUES('%','jeffrey',PASSWORD('biscuit'));
● 이미 존재하는 계정의 패스워드를 변경하고자 한다면, UPDATE를 사용해서 Password 컬럼의 값을 설정한다:
-> VALUES('%','jeffrey','biscuit');
위의 결과는 암호화된 값이 아닌 'biscuit'이 user 테이블에 패스워드로 저장이 된다. Jeffrey가 이 패스워드를 사용해서 서버에 접
속을 시도할 때, 입력하는 패스워드는 암호화가 되고 user 테이블에 저장되어 있는 패스워드 값과 비교를 하게 된다. 하지만, 저장
Access denied
만약에 여러분이 GRANT ... IDENTIFIED BY 명령문 또는 mysqladmin password 명령어를 사용해서 패스워드를 할당했다면,
이것들은 모두 패스워드를 암호화 한다. 이와 같은 경우, PASSWORD() 함수 사용은 불필요하게 된다.
제목검색
5. 데이터 베이스 관리 관리적인 차원에서, 관리자 계정이 아닌 사용자에게는 절대로 user 테이블에 대한 접근 권한을 승인하지 말아야 한다.
5.9. MySQL 사용자 계정 관리
5.9.6 패스워드 보안 유지하기 여러분이 클라이언트 프로그램을 구동해서 서버에 접속을 할 경우에는, 다른 사람이 볼 수 있도록 패스워드를 입력하는 방법은 그
리 좋은 것이 아니다. 여러분이 클라이언트 프로그램을 구동 시킬 때 패스워드를 지정할 수 있는 방법이 여기에 있는데, 각각의 방
법마다 위험 요소가 있게 된다:
이것은 편리하기는 하지만, 안전하지가 못하다. 왜냐하면, 다른 사용자가 명령어 라인에서 ps와 같은 시스템 상태 프로그
램을 사용하면 여러분의 패스워드를 볼 수가 있기 때문이다.
‘*’ 문자는 여러분이 입력하는 패스워드를 가리킨다. 이 패스워드는 여러분이 입력하는 문자로는 나타나지 않는다.
이 방법은 패스워드를 명령어 라인에 직접 입력하는 방법보다는 안전하다. 하지만, 이 방법은 여러분이 쌍방향
(interactive) 통신을 하는 프로그램을 사용할 경우에만 사용할 수 있다. 만약에 스크립트를 통해 클라이언트를 호출하는
경우에는, 터미널에서 패스워드를 입력할 수가 없게 된다.
● 패스워드를 옵션 파일에 저장한다. 예를 들면, 유닉스에서 여러분은 여러분의 홈 디렉토리에 있는.my.cnf 파일의[client]
섹션에 패스워드를 저장할 수가 있다:
• [client]
• password=your_pass
만약에 패스워드를 .my.cnf에 저장한다면, 그 파일은 여러분 이외의 사람이 접근할 수가 없게 된다. 이것을 확실하게 하
기 위해서, 파일 접근 모드를 400 또는 600으로 설정한다. 예를 들면:
● 패스워드를 환경 변수 MYSQL_PWD에 저장한다. 이 방법은 가장 보안에 취약하기 때문에 절대로 사용하지 말기 바란다.
Appendix F, Environment Variables를 참조할 것.
위의 방법 중에, 가장 안전한 방법은 프롬프트에서 패스워드를 입력하거나, 옵션 파일에 패스워드를 저장해서 사용하는 것이다.
제목검색
MySQL의 표준 구성은 가능하면 빠른 성능을 내도록 의도하고 있는데, 따라서 암호화 접속은 디폴트로 사용되지 않
는다. 이렇게 구성을 하면 클라이언트/서버 프로토콜이 더욱 느려지게 된다..
MySQL은 접속 당 암호화를 활성화 시킨다. 여러분은 각각의 어플리케이션에 따라서 암호화를 하거나 비 암호화 상
태의 접속을 선택할 수가 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=9&scate=7&idx=15412006-08-03 오후 4:23:33
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 MySQL이 SSL을 사용하는 방법을 이해하기 위해서는, SSL과 X509의 기본적인 개념을 알고 있어야 한다.
5.9. MySQL 사용자 계정 관리
5.9.7 보안 접속 사용하기 디폴트로, MySQL은 클라이언트와 서버간에는 암호화되지 않은 접속을 사용한다. 이것은 누군가 네트워크를 접근
할 수 있는 사람이라면 서로 통신을 하고 있는 데이터를 지켜 볼 수 있다는 것을 의미한다. 보안성을 좀더 개선하기
5.9.7.1 기본적인 SSL 개념
위해서, 여러분은 클라이언트/서버의 트래픽을 --compress 옵션을 사용해서 압축할 수가 있는데, 이 방법으로 모
5.9.7.2 OpenSSL을 사용해서 SSL 접속하기
든 공격자를 방어할 수는 없다.
5.9.7.3 yaSSL을 사용해서 SSL 접속하기
5.9.7.4 MySQL을 위한 SSL 인증 설정 하기
임호화는 모든 종류의 데이터를 읽을 수 없는 형태로 만드는 것이다. SSL은 공중망을 통해 받은 데이터가 신뢰할
5.9.7.5 SSL 명령어 옵션
수 있는 것이라는 확신을 주기 위해 서로 다른 암호화 알고리즘을 사용하는 프로토콜이다. 여기에는 데이터의 변경,
5.9.7.6 SSH를 사용해서 윈도우에서 원경으로 MySQL 접속하기
손실, 또는 재생성을 추적할 수 있는 매커니즘을 포함한다. SSL은 또한 X509 표준을 사용하는 ID 검증 알고리즘과
함께 동작을 한다.
X509는 인터넷상에서 누군가를 구분하는 것이 가능하게 만들어 준다. 이것은 전자 상거래에서 광범위하게 사용되
고 있다. 기본적인 용어로는, “인증 기관(Certificate Authority)” (또는 CA)라는 회사가 있게 되며 필요한 사람
들에게 전자 인증을 부여한다. 인증은 비대칭 암호화 알고리즘을 기반으로 하고 있으며 두 개의 암호화 키를 가지고
있다 (공중 키와 보안 키). 인증 소유자는 자신임을 증명하기 위해 다른 기관에게 인증서를 제출할 수 있다. 인증서
는 소유자의 공중 키로 구성이 된다. 이 공중 키를 가지고 암호화된 데이터는 대응하는 보안 키를 사용해야만 암호
가 풀리게 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=9&scate=7&idx=15422006-08-03 오후 4:23:34
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 MySQL 서버와 클라이언트 프로그램간의 SSL 접속을 사용하기 위해서는, 여러분의 시스템이 OpenSSL 또는 (MySQL 5.0.10 이
5.9. MySQL 사용자 계정 관리 후에는) yaSSL를 지원해야 한다. 이 섹션에서는 OpenSSL을 다루기로 한다. yaSSL의 사용에 대해서는, Section 5.9.7.3,
4. mysql.user 테이블에 SSL-관련 컬럼이 포함되도록 그랜트 테이블을 업그레이드 해 두어야 한다. 그랜트 테이블이
4.0.0 이전 버전일 경우에는 업그레이드가 필요하다. 업그레이드 과정은 Section 5.6.2, “mysql_upgrade —MySQL 업
그레이드를 위해 테이블 검사하기”를 참조할 것.
5. 구동되는 mysqld 서버가 OpenSSL을 지원하는지를 검사하기 위해서는, have_openssl 시스템 변수의 값을 조사한
다:
7. +---------------+-------+
8. | Variable_name | Value |
9. +---------------+-------+
11. +---------------+-------+
제목검색
5. 데이터 베이스 관리 MySQL이 내부적으로 가지고 있는 yaSSL 를 사용하면 보다 간단하게 보안 접속을 할 수가 있다. 여러분은
5.9. MySQL 사용자 계정 관리 Section 5.9.7.2, “OpenSSL을 사용해서 SSL 접속하기”에서 설명한 OpenSSL 설치를 위한 과정을 진행하지 않아도 된
5.9.7 보안 접속 사용하기 다. 또한, MySQL와 yaSSL는 동일한 라이센스 모델을 사용하고 있다.
MySQL을 소스를 가지고 설치를 할 때 yaSSL를 활성화 시키기 위해서는, 아래와 같이 MySQL를 구성한다:
유닉스 플랫폼에서의 yaSSL 지원은 트루 랜덤(true random) 번호를 추출하기 위해 /dev/urandom 또는 /dev/random가 설
치되어야 한다는 것을 알아두자. 보다 자세한 정보(특히 솔라리스 2.8 이전 버전 또는 HP-UX에서의 yaSSL에 관한 것)는,
Bug #13164를 참조하기 바란다.
MySQL 서버가 yaSSL 지원하도록 시작하기 위해서는, OpenSSL를 지원하기 위한 옵션과 동일한 것을 사용하고 보안 접속
을 만들기 위해 필요한 인증서를 식별한다:
--ssl-cert=server-cert.pem ₩
--ssl-key=server-key.pem
MySQL 서버가 yaSSL를 지원하는 보안 접속을 형성하기 위해서는, 클라이언트를 아래와 같이 시작한다:
--ssl-cert=server-cert.pem ₩
--ssl-key=server-key.pem
제목검색
# directory (optional)
touch $DIR/index.txt
-config $DIR/openssl.cnf
# Sample output:
# ................++++++
# .........++++++
# -----
# or a DN.
# There are quite a few fields but you can leave some blank
# -----
# Sample output:
# ..++++++
# ..........++++++
# -----
# or a DN.
# There are quite a few fields but you can leave some blank
# -----
# Sample output:
# Signature ok
# countryName :PRINTABLE:'FI'
# (365 days)
# Sample output:
# .....................................++++++
# .............................................++++++
# -----
# or a DN.
# There are quite a few fields but you can leave some blank
# -----
# Sample output:
# Signature ok
# countryName :PRINTABLE:'FI'
# (365 days)
# Create a my.cnf file that you can use to test the certificates
cnf=""
cnf="$cnf [client]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/client-cert.pem"
cnf="$cnf ssl-key=$DIR/client-key.pem"
cnf="$cnf [mysqld]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/server-cert.pem"
cnf="$cnf ssl-key=$DIR/server-key.pem"
SSL 접속을 테스트 하기 위해서는, 서버를 아래와 같이 시작하는데, 여기에서 $DIR은 샘플 my.cnf 옵션 파일이 저장되어 있는 디
렉토리의 경로 이름이다:
여러분이 MySQL 소스 배포판을 가지고 있다면, 위에 있는 my.cnf 파일이 배포판의 SSL 디렉토리에 있는 데모 인증서와 키 파일
을 참조하도록 설정을 변경해서 테스트 할 수도 있다.
제목검색
5. 데이터 베이스 관리 아래에 있는 리스트는 SSL, 인증서 파일, 그리고 키 파일의 사용을 지정하기 위해 사용되는 옵션을 설명하는 것이다. 이
5.9. MySQL 사용자 계정 관리 옵션들은 명령어 라인 또는 옵션 파일에서 지정될 수 있다.
5.9.7 보안 접속 사용하기
● --ssl
5.9.7.1 기본적인 SSL 개념
5.9.7.2 OpenSSL을 사용해서 SSL 접속하기
서버의 경우, 이 옵션은 서버가 SSL 접속을 허용한다는 것을 가리킨다. 클라이언트 프로그램에 대해서는, 이 옵
5.9.7.3 yaSSL을 사용해서 SSL 접속하기
션은 클라이언트가 SSL을 사용해서 서버에 접속할 수 있다는 것을 나타낸다. 이 옵션 자체만을 가지고는 SSL
5.9.7.4 MySQL을 위한 SSL 인증 설정 하기
접속을 만들 수가 없다. 여러분은 반드시 --ssl-ca, --ssl-cert, 그리고 --ssl-key 옵션을 함께 지정해야
5.9.7.5 SSL 명령어 옵션
한다.
5.9.7.6 SSH를 사용해서 윈도우에서 원경으로 MySQL 접속
이 옵션은 SSL을 사용하지 말도록 가리키기 위한 형태로 보다 많이 사용된다. 이렇게 지정하기 위해서는, 옵션
하기
을 --skip-ssl 또는 --ssl=0와 같이 지정한다.
--ssl 의 사용은 SSL 접속을 요구하지 않는다는 것을 알아두자. 예를 들면, 만일 서버 또는 클라이언트가 SSL
을 지원하지 않고 컴파일 되었다면, 일반적인 암호화 되지 않은 접속이 사용된다.
SSL 접속이 사용되고 있다는 것을 확인하는 방법은 GRANT 명령문 안에 REQUIRE SSL 구문을 포함하고 있
는 계정을 서버에서 생성하는 것이다. 그런 다음에 이 계정을 사용해서 서버에 접속을 하는데, 이때 서버와 클라
이언트가 모두 SSL 지원을 활성화 되어 있어야 한다.
● --ssl-ca=file_name
● --ssl-capath=directory_name
● --ssl-cert=file_name
● --ssl-cipher=cipher_list
SSL 암호화를 위해 사용되는 암호 리스트. cipher_list는 openssl ciphers 명령어와 동일한 포맷이다.
예: --ssl-cipher=ALL:-AES:-EXP
● --ssl-key=file_name
제목검색
5. 데이터 베이스 관리 여기에서는 원격 MySQL 서버를 SSH를 사용해서 보안 접속을 하는 방법을 설명한다 (by David Carlson
5.9. MySQL 사용자 계정 관리 <dcarlson@mplcomm.com>):
5.9.7 보안 접속 사용하기
1. SSH 클라이언트를 여러분의 윈도우 머신에 설치한다. 무료 버전이 아닌 것 중에 가장 좋은 것은 http://
5.9.7.1 기본적인 SSL 개념
www.vandyke.com/에 있는 SecureCRT이다. 또 다른 옵션은 http://www.f-secure.com/에 있는 f-secure이
5.9.7.2 OpenSSL을 사용해서 SSL 접속하기
다. 무료 버전의 경우, http://directory.google.com/Top/Computers/Security/Products_and_Tools/
5.9.7.3 yaSSL을 사용해서 SSL 접속하기
Cryptography/SSH/Clients/Windows/에서 찾을 수가 있다.
5.9.7.4 MySQL을 위한 SSL 인증 설정 하기
2. 윈도우를 SSH 클라이언트와 함께 시작한다. Host_Name = yourmysqlserver_URL_or_IP를 설정한다. 서
5.9.7.5 SSL 명령어 옵션
버에 로그인 하기 위해 userid=your_userid를 설정한다. userid 값은 MySQL 계정의 사용자 이름과 동일하지 않
5.9.7.6 SSH를 사용해서 윈도우에서 원경으로 MySQL 접
을 수도 있다.
속하기
3. 포트를 전방향(forwarding)으로 설정한다. 원격 전방향(remote forward) (local_port: 3306,
remote_host: yourmysqlservername_or_ip, remote_port: 3306 ) 또는 로컬 전방향(local forward) (port:
3306, host: localhost, remote port: 3306)으로 설정한다.
4. 모든 것을 저장한다, 그렇지 않으면, 다음에 위의 모든 것을 다시 실행해야 한다.
5. 지금 막 생성한 SSH 세션을 가지고 서버에 로그인 한다.
6. 윈도우 머신에서, ODBC 어플리케이션을 시작한다 (Access와 같은 것).
7. 윈도우에서 새로운 파일을 생성하고 여러분이 일반적으로 하는 방식대로 ODBC 드라이버를 사용해서
MySQL에 링크를 하되, MySQL 호스트 서버에 대한 localhost 에는 yourmysqlservername를 타이핑하지 않는
다.
이때, 여러분은 SSH를 사용한 암호화를 통해 MySQL에 ODBC 접속을 가지게 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=9&scate=7&idx=15472006-08-03 오후 4:25:32
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆ 5.10. 백업 및 복구
5.10.1. 데이터 베이스 백업
5. 데이터 베이스 관리 5.10.2. 백업 및 복구 전략 예제
5.10. 백업 및 복구 5.10.3. 시점(Point-in-Time) 복구
5.10 백업 및 복구 5.10.4. 테이블 관리와 크래시(Crash) 복구
5.10.3 시점(Point-in-Time) 복구 명을 하기로 한다. 여기에서 설명하는 SQL 명령문의 신텍스는 Chapter 13, SQL 명령문 신텍스 에서 설명을 한다. 여기에
서 설명하는 것들은 주로 MyISAM에 관련되어 있다. InnoDB 백업 과정에 대한 설명은 Section 14.2.8, “InnoDB 데이터
5.10.3.1 복구 시간 지정하기
베이스 백업 및 복구”에서 하기로 한다.
5.10.3.2 복구 위치 지정하기
5.10.4 테이블 관리와 크래시(Crash) 복구
5.10.4.1 크래시 복구를 위해 myisamchk 사용하기
5.10.4.2 에러에 대해 MyISAM 테이블을 검사하는 방법
5.10.4.3 테이블 치료하는 방법
5.10.4.4 테이블 최적화
5.10.4.5 테이블 정보 가져오기
5.10.4.6 테이블 관리(Maintenance) 스케줄 설정
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=10&scate=0&idx=14692006-08-03 오후 4:26:12
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 MySQL 테이블은 파일 형태로 저장되기 때문에, 백업을 하기가 쉽다. 일관된 백업을 하기 위해서는, 연관된 테이블에 FLUSH
5.10. 백업 및 복구 TABLES 다음에 LOCK TABLES을 한다. Section 13.4.5, “LOCK TABLES 및 UNLOCK TABLES 신텍스”, 그리고
5.10.1 데이터 베이스 백업 Section 13.5.5.2, “FLUSH 신텍스”를 참조할 것. 여러분은 읽기 잠금만 하면 된다; 이렇게 하면 여러분이 데이터 베이스 디렉
토리에 파일 복사를 하는 동안에도 다른 클라이언트가 테이블에 쿼리를 계속 할 수 있도록 해 준다. 여러분이 백업을 시작하기 전
에 모든 액티브 인덱스 페이지를 디스크에 쓰기 위해서는 FLUSH TABLES 명령문이 필요하다.
테이블의 SQL-레벨 백업을 만들기 위해서는, SELECT INTO ... OUTFILE를 사용한다
데이터 베이스 백업에 대한 또 다른 방법은 mysqldump 프로그램 또는 mysqlhotcopy script 스크립트를 사용하는 것이다.
Section 8.10, “mysqldump — 데이터 베이스 백업 프로그램”, 및 Section 8.11, “mysqlhotcopy — 데이터 베이스 백업 프로
그램”을 참조할 것.
또는:
여러분은 서버가 아무것도 업데이트를 하지 않는 다면, 간단하게 전체 테이블 파일(*.frm, *.MYD, 및 *.MYI 파일)을 복사
해서 바이너리 백업을 만들 수도 있다. mysqlhotcopy 스크립트는 이 방법을 사용한다. (하지만, 데이터 베이스가
InnoDB 테이블을 가지고 있다면, 이 방법을 사용할 수가 없다. InnoDB는 데이터 디렉토리에 테이블 컨텐츠를 저장하지
않으며, 또한 mysqlhotcopy은 MyISAM 테이블에 대해서만 동작을 한다.)
3. mysqld이 구동 중이라면 종료를 시키고, 그런 다음에 그것을 --log-bin[=file_name] 옵션을 사용해서 다시 구동
시킨다. Section 5.12.3, “바인리 로그” 참조. 바이너리 로그 파일은 여러분이 mysqldump를 실행 시킨 시점에 만들어
진 변경 사항을 데이터 베이스에 리플리케이트 시키는데 필요한 정보를 제공해 준다.
InnoDB 테이블의 경우, 테이블에 잠금을 하지 않고 온라인 백업을 실행할 수가 있다; Section 8.10, “mysqldump — 데이터 베
이스 백업 프로그램”을 참조할 것.
MySQL은 증분(incremental) 백업을 지원한다: 여러분은 --log-bin 옵션을 사용해서 서버를 구동 시켜서 바이너리 로깅을 활성
화 시킬 필요가 있다; Section 5.12.3, “바이너리 로그”를 참조. 여러분이 증분 백업을 하고자 원할 경우에는 (마지막 전체 또는
증분 백업을 한 이후에 변경된 모든 것을 포함), FLUSH LOGS를 사용해서 바이너리 로그를 바꿔야(rotate) 한다. 이것을 실행하
고 나면, 모든 바이너리 로그를 백업 위치에 복사할 필요가 있게 된다. 이러한 바이너리 로그들은 증분 백업본이다; 복원(restore)
시점이 되면, 여러분은 이후의 섹션에서 설명하는 방법으로 이것들을 사용한다. 그 다음으로 전체 백업을 하고자 한다면, 여러분은
역시 FLUSH LOGS, mysqldump --flush-logs, 또는 mysqlhotcopy --flushlog를 사용해서 바이너리 로그를 바꿔야 한다.
Section 8.10, “mysqldump — 데이터 베이스 백업 프로그램”, and Section 8.11, “mysqlhotcopy — 데이터 베이스 백업 프
로그램”을 참조.
여러분의 서버가 슬레이브 리플리케이션 서버라면, 여러분이 선택한 백업 방법에 관계없이, 슬레이브의 데이터를 백업할 때에는,
master.info 와 relay-log.info 파일도 함께 백업해야 한다. 이 파일들은 여러분이 슬레이브의 데이터를 복원한 후에 리플리케이션
을 다시 시작하기 위해 항상 필요한 것들이다. 만약에 슬레이브가 LOAD DATA INFILE 명령어를 리플리케이트 해야 한다면, 여
러분은 --slave-load-tmpdir 옵션이 지정하는 디렉토리에 있는 모든 SQL_LOAD-* 파일들도 함께 백업해야 한다. (이 위치가
지정이 되지 않으면, tmpdir 변수 값이 디폴트로 사용된다.) 슬레이브는 인터럽트된 LOAD DATA INFILE 동작의 리플리케이션
재 구동을 위해 이 파일들이 필요하게 된다.
만약에 MyISAM 테이블을 복원 해야 한다면, 우선 REPAIR TABLE 또는 myisamchk –r를 사용해서 테이블을 복구하도록 해본
다. 이렇게 하면 99.9%가 복구 된다. 만약에 myisamchk가 실패한다면, 아래의 프로시저를 시도해 본다. 여러분이 --log-bin 옵
션을 사용해서 MySQL을 구동 시켜서 바이너리 로깅을 활성화 시켰을 경우에만 이것이 동작한다는 것을 명심하기 바란다.
어떤 경우에는, 특정 위치에 있는 특정 바이너리 로그만을 재구동 시키고자 할 것이다. Section 8.8, “mysqlbinlog — 바
이너리 로그 파일을 처리하기 위한 유틸리티”에서, mysqlbinlog 유틸리티와 활용법에 대해 보다 자세히 알아보기 바란
다.
● 테이블을 덤프하기 위해서는, SELECT * INTO OUTFILE 'file_name' FROM tbl_name를 사용한다.
● 테이블을 재 로드하기 위해서는, LOAD DATA INFILE 'file_name' REPLACE .... 를 사용한다. 열 중복을 피하기 위해서
는, 테이블은 반드시 PRIMARY KEY 또는 UNIQUE 인덱스를 가지고 있어야 한다. REPLACE 키워드는 고유의 키 값에
이전 열을 새로운 열로 중복시킬 때 이전 열이 새로운 열로 대체되도록 만든다.
백업을 진행하는 중에 시스템의 성능에 문제가 발생한다면, 한가지 전략은 리플리케이션을 설정을 한 다음에 서버가 아닌 슬레이브
에서 백업을 실행 시키는 것이다. Section 6.1, “리플리케이션 소개”를 참조.
제목검색
상위메뉴리스트 ◆ 5.10.2. 백업 및 복구 전략 예제
5.10.2 백업 및 복구 전략 예제 5.10.2.3. 백업 전략 정리
이 섹션은 여러 가지의 데이터 크래시가 발생한 후에 데이터를 복구할 수 있는 백업을 실행하는 과정을 설명한다:
● OS 크래시
● 파워(Power) 문제
● 파일 시스템 크래시
● 하드웨어 문제 (하드 드라이브, 마더 보드, 및 기타 등등)
예제의 명령어들은 mysqldump 와 mysql 프로그램에 대해 --user 와 --password 와 같은 옵션을 포함하고 있지 않다. 여러분
이 MySQL 서버에 접속을 하기 위해서는 필요한 옵션들을 함께 넣어야 한다.
우리는 데이터가 InnoDB 스토리지 엔진에 저장되어 있다고 가정하는데, 이 엔진은 트랜젝션과 자동 크래시 복구를 지원한다. 우리
는 또한 크래시가 되는 시점에 MySQL 서버가 로드중에 있다는 가정을 한다. 그런 상황이 아니라면, 아무런 복구도 필요 없게 된
다.
OS 크래시 또는 시스템 파워 문제의 경우, MySQL의 디스크 데이터는 서버를 재 구동 시키면 사용 가능하다고 가정할 수 있다.
InnoDB 데이터 파일은 크래시로 인해 일관된 데이터를 가지고 있지 않을 수도 있으나, InnoDB는 자신의 로그를 읽고, 그 로그에
서 데이터 파일에 플러시 되지 않은 실행된(committed) 트랜젝션과 실행되지 않고(non-committed) 지연 된 트랜젝션의 리스트
를 찾게 된다. InnoDB 는 자동으로 실행되지 않은 트랜젝션으로 롤백 되고, 이미 실행된 트랜젝션을 자신의 데이터 파일에 플러시
한다. 이러한 복구 과정에 대한 정보는 MySQL 에러 로그를 통해 사용자에게 전달 된다. 아래의 것은 예제 로그에서 발췌한 것이
다:
...
InnoDB: Started
파일 시스템 크래시 또는 하드웨어 문제의 경우, 우리는 MySQL의 디스크 데이터는 서버를 재 구동 시켜도 사용할 수 없을 것이라
고 생각한다. 이와 같은 경우에는, 디스크를 재 포맷시키거나, 다른 디스크를 설치하거나, 또는 다른 조치를 취할 필요가 있게 된
다. 그런 다음에 백업 파일에서 복구를 해야 한다. 이러한 경우를 대비하기 위해, 우리는 백업 정책을 만들어 두어야 한다.
제목검색
5.10.3 시점(Point-in-Time) 복구
5.10.3.1 복구 시간 지정하기 MySQL 서버가 바이너리 로그를 활성화 시키기 위해 --log-bin 옵션을 가지고 시작되었다면, 여러분은 mysqlbinlog 유틸리티
를 사용하여 지정된 시점에서부터 바이너리 로그 파일에서 데이터를 복구할 수가 있다. 바이너리 로그 활성화와 mysqlbinlog의 사
5.10.3.2 복구 위치 지정하기
용에 대한 정보는 Section 5.12.3, “바이너리 로그” 와 Section 8.8, “mysqlbinlog — 바이너리 로그 파일 처리를 위한 유틸리
티”를 참조할 것.
바이너리 로그에서 데이터를 복구하기 위해서는, 현재의 바이너리 로그의 정확한 이름과 저장 위치를 알고 있어야 한다. 디폴트로,
서버는 바이너리 로그를 데이터 디렉토리에 생성하지만, 다른 위치에 파일을 저장하기 위해서는 --log-bin 옵션을 사용해서 경
로 이름을 지정해야 한다. 전형적으로 옵션은 옵션 파일에서 주게 된다 (즉, my.cnf 또는 my.ini). 옵션은 서버가 시작될 때 명령
어 라인에서도 줄 수가 있다. 현재의 디렉토리 이름을 알아 보기 위해서는, 아래의 명령어를 사용한다:
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=10&scate=3&idx=14722006-08-03 오후 4:26:26
:::MySQL Korea:::
제목검색
5.10.3.1. 복구 시간 지정하기
상위메뉴리스트 ◆
5. 데이터 베이스 관리 복구 시작 시점과 종료 시점을 지정하기 위해서는, DATETIME 포맷에서 mysqlbinlog에 대한--start-date 와 --stop-date
5.10. 백업 및 복구 옵션을 지정한다. 예를 들면, 정확히 2005년 4월 20일 오전 10시 정각에 테이블을 삭제하는 SQL 명령문을 실행했다고 가정하자.
5.10.3 시점(Point-in-Time) 복구 이 테이블과 데이터를 복구하기 위해서는, 여러분은 전날 밤에 백업해 놓은 파일을 복원한 다음에, 아래의 명령어를 실행한다:
5.10.3.1 복구 시간 지정하기
shell> mysqlbinlog --stop-date="2005-04-20 9:59:59" ₩
5.10.3.2 복구 위치 지정하기
이 명령어는 --stop-date 옵션이 지정하는 날짜와 시간 이전의 모든 데이터를 복구한다. 만약에 여러분이 10시 이후에 잘못 입
력한 SQL 명령문을 검사하지 않았다면, 여러분은 아마도 그 후에 발생한 서버의 동작도 함께 복구하고 싶을 것이다. 이러한 가정하
에, 여러분은 아래와 같이 시작 날짜와 시간을 다시 입력하여 mysqlbinlog을 재 구동 시킬 수가 있다.
이 명령어에서 보면, 10시 1초에 로그된 SQL 명령문이 재 동작할 것이다. 전날 밤에 덤프한 파일과 두 개의 mysqlbinlog 명령어
를 조합하면 10시 1초 전까지의 모든 것과 10시 1초 후의 모든 것을 복구하게 된다. 명령어에 지정할 시간을 정확히 하기 위해서
는 로그를 조사해야 한다. 로그 파일을 실행하지 않고 내용물을 보기 위해서는, 아래의 명령어를 실행한다:
제목검색
5.10.3.2. 복구 위치 지정하기
상위메뉴리스트 ◆
5. 데이터 베이스 관리 날짜와 시간을 지정하는 대신에, mysqlbinlog에 대한 --start-position 과 --stop-position 옵션을 사용하여 로그 위치를 지
5.10. 백업 및 복구 정할 수가 있다. 이것들은 시작 일자와 종료 일자 지정 옵션과 동일한 동작을 하는데, 이때 여러분은 일자 대신에 로그의 위치 번호
5.10.3 시점(Point-in-Time) 복구 를 지정 해주어야 한다. 로그의 위치를 사용하는 것은 복구할 로그의 부분을 보다 정확하게 지정할 수 있게끔 해 주는 것인데, 특히
5.10.3.1 복구 시간 지정하기 옳지 못한 SQL 명령문으로 인해 동시에 많은 트랜젝션이 발생하는 경우에 유용하게 사용된다. 로그의 위치 번호를 알아내기 위해
5.10.3.2 복구 위치 지정하기 서는, 원하지 않은 트랜젝션이 발생했던 시간 전후에 대해 mysqlbinlog을 구동 시킨다. 결과는 텍스트 파일 형태로 나온다. 아래와
같이 실행할 수가 있다:
--stop-date="2005-04-20 10:05:00" ₩
이 명령어는 /tmp 디렉토리 안에 작은 텍스트 파일을 하나 생성하는데, 이 파일은 옳지 않은 SQL 명령문이 실행 되었던 시점 주변
의 SQL 명령문을 가지게 된다. 텍스트 편집기를 사용해서 이 파일을 연 다음에 반복되지 말아야 할 명령문을 찾아낸다. 바이너리
로그에서 종료를 하고 다시 구동 시킬 위치를 찾아 낸다. 로그의 위치는 log_pos 다음에 숫자를 사용해서 레이블 되어 있다. 이전
백업 파일을 복원한 다음에, 이 위치 번호를 사용해서 바이너리 로그 파일을 처리한다. 예를 들면, 여러분은 아래와 비슷한 명령어
를 사용할 것이다:
| mysql -u root -p
| mysql -u root -p
첫 번째 명령어는 지정된 종료 위치 전까지 나타난 모든 트랜젝션을 복구한다. 두 번째 명령어는 지정된 시작 시점에서부터 바이너
리 로그의 끝까지의 모든 트랜젝션을 복구한다. mysqlbinlog의 결과 값에는 SQL 명령문이 기록되기 전의 SET TIMESTAMP 명
령문을 포함하고 있기 때문에, 복구된 데이터와 이에 관련된 MySQL로그는 트랜젝션이 실행된 원래의 시점에 반영이 된다.
제목검색
여러분은 myisamchk를 사용해서 데이터 베이스 테이블에 대한 정보를 얻거나, 이 테이블을 검사, 치료, 또는 최적화를 할 수
가 있다. 다음에 나오는 섹션에서는 이러한 동작을 어떻게 실행 시키는지 그리고 테이블 관리 스케쥴을 어떻게 설정하는지에
대해 설명하기로 한다.
myisamchk를 사용하는 테이블 치료가 안전하기는 하지만, 테이블을 치료하거나 또는 테이블의 내용을 많이 변경시키는 관
리 동작 이전에 백업을 받아 두는 것이 현명하다.
인덱스에 영향을 주는 Myisamchk FULLTEXT 인덱스가 MySQL 서버가 사용하는 값들과 호환성을 갖지 못하는 전체-텍
스트 파라미터를 재 구축하게끔 한다. 이러한 문제를 피하기 위해서는, Section 8.2.1, “myisamchk 일반 옵션”에 나와 있
는 가이드 라인을 따르기 바란다..
많은 경우에, 여러분은 myisamchk 동작을 하는 SQL 명령문을 사용해서 MyISAM 테이블을 관리하는 것이 보다 손 쉽다는
것을 알게 될 것이다:
이러한 명령문들은 직접 또는 mysqlcheck 클라이언트 프로그램을 통해서 사용할 수가 있다. 이러한 명령문들이
myisamchk에 비해 가지고 있는 하나의 장점은 서버가 모두 실행할 수 있다는 것이다. Myisamchk를 사용한다면,
myisamchk과 서버 사이에 원하지 않는 상호 작용이 발생하지 않도록 하기 위해서 서버는 동시에 테이블을 사용할 수 없다
는 것을 알고 있어야 한다. Section 13.5.2.1, “ANALYZE TABLE 신텍스”, Section 13.5.2.3, “CHECK TABLE 신텍
스”, Section 13.5.2.5, “OPTIMIZE TABLE 신텍스”, 그리고 Section 13.5.2.6, “REPAIR TABLE 신텍스”를 참조
할 것.
제목검색
5. 데이터 베이스 관리
5.10. 백업 및 복구 이 섹션은 MySQL 데이터 베이스의 데이터 깨짐을 검사하고 처리하는 방법에 대해 설명을 한다. 여러분의 테이블이 자주 깨
5.10.4 테이블 관리와 크래시(Crash) 복구 진다면, 그 이유를 분명히 알아 두어야 한다. Section A.4.2, “What to Do If MySQL Keeps Crashing”를 참조할 것.
만약에 서버를 외부 잠금 활성화 상태로 구동 시킨다면, 어느 때라도 myisamchk를 사용해서 테이블을 검사할 수가 있다. 이
와 같은 경우, 만약에 서버가 myisamchk가 사용하고 있는 테이블을 업데이트 하고자 시도하면, 서버는 myisamchk가 마치
기를 기다리게 된다.
만약에 myisamchk를 사용해서 테이블을 치료 또는 최적화 시킨다면, 여러분은 반드시 mysqld 서버는 그 테이블을 사용하
고 있지 않음을 항상 확인해야 한다 (이것은 외부 잠금이 비활성화된 상태에도 동일하게 적용된다). 만약에 Mysqld을 종료
하지 않는다면, 여러분은 최소한 myisamchk를 구동하기 전에는 a mysqladmin flush-tables를 실행해야 한다. 만약에 서
버와 myisamchk가 동시에 테이블에 접근을 한다면, 테이블은 깨지게 될 것이다.
크래시 복구를 할 때에는, 데이터 베이스에 있는 각 MyISAM 테이블 tbl_name 은 데이터 베이스 디렉토리에 있는 세 개의
파일에 대응한다는 것을 이해하는 것이 중요하다:
File Purpose
tbl_name.frm 정의문(포맷) 파일
tbl_name.MYD 데이터 파일
tbl_name.MYI 인덱스 파일
이 세 개의 파일 타입은 각각 다양한 방식의 데이터 깨짐과 관련을 가지고 있으나, 대부분의 깨짐은 데이터 파일과 인덱스 파
일에서 발생하게 된다.
Myisamchk은 .MYD 데이터 파일을 줄 별로 복사를 하면서 동작을 한다. 이것은 구형 .MYD파일을 제거 하고 새로운 파일
을 원래의 파일 이름으로 변경을 한 다음에 치료 과정을 종료한다. 만약에 여러분이 –quick 옵션을 사용한다면, myisamchk
은 임시 .MYD파일을 생성하지 않으며, 대신에 .MYD 파일이 정확하다고 가정으로 하고 .MYD 파일을 손 대지 않고 새로운
인덱스 파일을 만들게 된다. 이런 동작은 안전한데, 그 이유는 myisamchk은 자동적으로 .MYD파일이 깨졌는지 그리고 치료
를 해야 하는지를 검사하기 때문이다. 여러분은 --quick 옵션을 myisamchk에 두 번 사용할 수도 있다. 이 경우에,
myisamchk는 어떤 에러(중복-키 에러 와 같은)에서는 종료를 하지 않는 대신에 .MYD 파일을 수정해서 문제를 해결하려
는 시도를 하게 된다. 일반적으로 --quick 옵션을 두 번 사용하는 것은, 만약에 일반적인 치료를 진행하기에는 여유 공간이
너무 부족한 경우에, 매우 유용하게 된다. 이와 같은 경우, 여러분은 myisamchk를 구동하기 전에 최소한 한번은 백업을 해
두는 것이 좋다.
제목검색
● myisamchk -e tbl_name
이것은 모든 데이터를 완벽하고 철저하게 검사한다 (-e는 “확대 검사(extended check)”를 의미함). 이것은 모
든 키가 올바른 열을 가리키고 있는지를 검증하기 위해 각 열에 대한 모든 키 값을 검사-읽기(check-read) 한다.
이것은 많은 인덱스를 가지고 있는 대형 테이블의 경우에는 많은 시간이 걸리게 된다. 일반적으로, myisamchk는
첫 번째 에러가 발견되면 즉시 종료를 한다. 만약에 보다 많은 정보를 얻고자 한다면, -v (verbose) 옵션을 추가한
다. 이것은 myisamchk이 20개의 에러를 발견할 때 까지 계속 진행을 하도록 만든다.
● myisamchk -e -i tbl_name
이것은 앞의 명령어와 비슷한 것이지만, -i 옵션은 myisamchk이 추가적인 통계 정보를 프린트 하도록 만든다.
대부분의 경우, 테이블 이름을 사용하지 않고 단순히 myisamchk 명령어를 사용해서도 충분히 테이블을 검사할 수 있다.
제목검색
5. 데이터 베이스 관리
5.10. 백업 및 복구 이 섹션에서는 MyISAM 테이블(확장자 .MYI 와 .MYD)에서 myisamchk를 사용하는 방법을 설명하기로 한다.
에러에 대해 보다 많은 정보를 얻기 위해서는, perror nnn를 구동 시키는데, nnn 는 에러 번호가 된다. 아래의 예제는 테이블 문제
를 가리키는 가장 일반적인 에러 번호의 의미를 알아 내기 위해 perror를 어떻게 사용하는지를 보여 준다:
shell> perror 126 127 132 134 135 136 141 144 145
에러 135 (no more room in record file)과 에러 136 (no more room in index file)는 간단한 수정으로 처리될 수 있는 것임을
알기 바란다. 이와 같은 경우에는, ALTER TABLE을 사용해서 MAX_ROWS 와 AVG_ROW_LENGTH 테이블 옵션 값을 늘려주
어야 한다:
다른 에러에 대해서는, 여러분은 테이블을 치료해야 한다. Myisamchk는 테이블에서 발생된 에러들을 검사하고 치료하는데 일반적
으로 사용할 수 있는 것이다.
치료 과정에는 네 단계가 있다. 시작을 하기 전에, 데이터 디렉토리로 이동을 해서 테이블 파일을 검사할 수 있는 권한을 검사하기
로 한다.
만약에 명령어 라인에서 테이블을 치료하고자 한다면, 우선 mysqld 서버를 종료 시켜야 한다. 리모트 서버에서 mysqladmin
shutdown을 실행하면, mysqld 서버는 모든 명령문 프로세스가 종료를 하고 모든 인덱스 변경이 디스크에 플러시 될 때까지,
mysqladmin가 리턴 된 후에도 당분간 살아 있게 된다는 점을 알기 바란다.
myisamchk *.MYI 또는 myisamchk -e *.MYI를 구동 시킨다. -s (silent) 옵션을 사용해서 불필요한 정보를 없애도록 한다.
만약에 mysqld 서버가 종료 되면, --update-state 옵션을 사용해서 myisamchk가 테이블을 “checked”로 표시하도록 만든
다.
여러분은 myisamchk에 의해 에러가 있다고 표시된 테이블만 치료해야 한다. 그런 테이블에 대해서만 Stage 2를 진행한다.
만약에 검사를 하는 도중에 예상하지 못한 에러가 나오게 되거나(out of memory 에러와 같은), 또는 myisamchk가 크래시가 되
면, Stage 3를 실행한다.
우선, myisamchk -r -q tbl_name (-r –q은 “quick recovery mode”를 의미함)를 시도해 본다. 이것은 데이터 파일을 손대
지 않고 인덱스 파일을 치료하고자 한다. 만약에 데이터 파일이 모든 것을 가지고 있고 삭제 링크가 데이터 파일 안에 있는 올바른
위치를 가리키고 있다면, 이것은 제대로 동작을 하 것이고, 테이블은 수정이 된다. 다음 테이블을 치료하도록 한다. 그렇지 않은 경
우에는, 아래의 과정을 진행한다:
Note: 만약에 치료 동작을 보다 빠르게 하고자 한다면, myisamchk을 구동 시킬 때 여러분이 사용 가능한 메모리의 약 25% 정도
를 sort_buffer_size 와 key_buffer_size 변수에 각각 할당하면 된다
치료를 하는 도중에 예상하지 못한 에러를 만나게 되거나 (out of memory 에러와 같은), 또는 myisamchk가 크래시 되면, Stage
3으로 간다.
만약에 인덱스 파일의 처음 16KB블록이 깨졌거나 또는 잘못된 정보를 가지고 있거나, 또는 인덱스 파일이 빠져 있는 경우에만 이
단계의 과정을 진행한다. 아래와 같이 진행을 한다:
6. mysql> quit
7. 이전 데이터 파일을 새로운 데이터 파일로 복사한다. (단순히 이동을 하지 말고, 복사를 하기 바란다. 다른 에러에 대
비해서 복사본은 계속 보관을 해야 한다.)
여러분은 REPAIR TABLE tbl_name USE_FRM SQL 명령문을 사용할 수도 있는데, 이것은 자동으로 전체 과정을 수행한다.
Section 13.5.2.6, “REPAIR TABLE 신텍스”를 참조.
이 단계는 .frm 설명 파일이 크래시 되었을 경우에만 해당한다. 그런 일은 결코 일어 나지 않는데, 왜냐하면 설명 파일은 테이블이
생성된 후에는 변경되지 않기 때문이다:
1. 백업에서 설명 파일을 복원한 다음에 Stage 3로 돌아 간다. 인덱스 파일을 복원한 다음에 Stage 2으로 갈 수도 있
다. 두 번째 경우, 여러분은 myisamchk –r을 가지고 시작해야 한다.
2. 만약에 여러분이 백업을 가지고 있지는 않지만, 테이블을 어떻게 생성했는지 정확히 알고 있다면, 다른 데이터 베이
스에 있는 테이블을 복사한다. 새로운 데이터 파일을 삭제하고, 다른 데이터 베이스에 있는 .frm 설명 파일과 .MYI 인덱
스 파일을 깨진 데이터 베이스로 복사한다. 이렇게 하면 새로운 설명 파일과 인덱스 파일은 만들어 지지만, .MYD 데이터
파일은 남게 된다. Stage 2로 갓 인덱스 파일을 재 구축하도록 한다.
제목검색
5. 데이터 베이스 관리 To 열을 삭제하거나 업데이트를 하면서 생기는 소비 공간을 없애고 조각나 있는 열을 합치기 위해서는, myisamchk를 복구
5.10. 백업 및 복구 모드로 실행한다:
● --analyze, -a
● --sort-index, -S
● --sort-records=index_num, -R index_num
모든 사용 가능한 옵션을 보기 위해서는 Section 8.2, “myisamchk — MyISAM 테이블-관리 유틸리티”를 참조할 것.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=10&scate=4&idx=14792006-08-03 오후 4:26:42
:::MySQL Korea:::
제목검색
테이블에서 가장 중요한 정보만을 보이도록 한다. 이것은 테이블 전체를 읽어야만 하기 때문에 속도가 느
리게 된다.
myisamchk -d 결과 샘플:
Recordlength: 226
table description:
1 2 8 unique double
193 1 text
myisamchk -d -v 결과 샘플:
File-version: 1
Status: checked
Recordlength: 226
table description:
193 1 text
Packed: 0%
Blocks/Record: 1.00
- check file-size
- check delete-chain
block_size 1024:
index 1:
index 2:
index 3:
index 4:
index 5:
index 6:
index 7:
index 8:
index 9:
No recordlinks
myisamchk가 만들어 내는 정보 타입에 대한 설명이 아래에 있다. “Keyfile”은 인덱스 파일을 참조한
다. “Record” 와 “row”는 동의어다.
● MyISAM file
● File-version
● Creation time
● Recover time
● Data records
테이블에 있는 열의 수.
● Deleted blocks
삭제된 블록이 여전히 점유하고 있는 공간의 크기. 이 공간을 최소로 만들어서 테이블을 최적화 시킨다.
Section 5.10.4.4, “테이블 최적화”참조.
● Datafile parts
동적-열 포맷의 경우, 이것은 데이터 블록이 얼마나 있는지를 가리킨다. 조각나 있는 열이 없는 최적화
된 테이블의 경우, 이것은 Data records과 같게 된다.
● Deleted data
● Datafile pointer
● Keyfile pointer
● Recordlength
● Record format
● table description
❍ Key
이 키의 번호.
❍ Start
❍ Len
인덱스의 이 부분의 길이. 팩(packed) 숫자일 경우, 이것은 항상 컬럼의 전체 길이가 된다. 스트링의 경
우, 이것은 인덱스된 컬럼의 전체 길이보다는 작게 된다. 그 이유는 스트링 컬럼의 접두사를 인덱스 하기
때문이다.
❍ Index
❍ Type
인덱스의 이 부분이 가지는 데이터 타입. 이것은 가능한 값으로 packed, stripped, 또는 empty를 가지
고 있는 MyISAM 데이터 타입이 된다.
❍ Root
❍ Blocksize
각 인덱스 블록의 크기. 디폴트로는 1024이지만, 소스를 가지고 MySQL을 구성할 때에는 컴파일시에
그 값이 변할 수도 있다.
❍ Rec/key
● Keyblocks used
● Packed
MySQL이 공통의 접미사를 가지고 있는 키 값들을 팩(pack)하려고 한다. 이것은 CHAR 와 VARCHAR
컬럼에 있는 인덱스에 대해서만 사용된다. 가장 왼쪽으로 치우쳐 있는 스트링을 인덱스 한 경우, 이것은
사용 공간을 현격하게 줄여 준다. 앞의 예제 중에 세 번째의 경우, 네 번째 키는 10개 문자 길이로 되어 있
고 사용 공간의 60%를 줄여 주고 있다.
● Max levels
● Records
테이블에 있는 열의 수.
● M.recordlength
● Packed
● Recordspace used
● Empty space
● Blocks/Record
● Recordblocks
● Deleteblocks
● Recorddata
● Deleted data
● Lost space
● Linkdata
제목검색
5. 데이터 베이스 관리 테이블 검사는 문제가 발생한 다음에 하는 것 보다 정상적인 상태에서 실행하는 것이 바람직하다. MyISAM 테이블을 검사하고 치
5.10. 백업 및 복구 료하는 한 가지 방법은 CHECK TABLE 과 REPAIR TABLE 명령문을 사용하는 것이다. Section 13.5.2.3, “CHECK TABLE
5.10.4 테이블 관리와 크래시(Crash) 복구 신텍스”, 그리고 Section 13.5.2.6, “REPAIR TABLE 신텍스”를 참조.
5.10.4.2 에러에 대해 MyISAM 테이블을 검사하 (--silent) myisamchk을 침묵 모드(silent mode)로 동작 시키며, 에러가 발생했을 때에만 메시지를 출력한다.
는 방법
자동으로 MyISAM 테이블 검사를 실행하도록 하는 것도 좋은 생각이다. 예를 들면, 시스템이 업데이트 도중에 재 시작을 할 때마
5.10.4.3 테이블 치료하는 방법
다, 일반적으로는 각 테이블을 검사해야 한다. MyISAM 테이블을 자동으로 검사하도록 하기 위해서는, --myisam-recover 옵
5.10.4.4 테이블 최적화
션을 가지고 서버를 구동한다. Section 5.2.1, “mysqld 명령어 옵션”을 참조할 것.
5.10.4.5 테이블 정보 가져오기
5.10.4.6 테이블 관리(Maintenance) 스케줄 설정
여러분은 서버의 정상적인 동작 중에도 주기적으로 테이블을 검사 해야 한다. MySQL AB의 경우, 우리는 cron 잡(job)을 돌려서
우리의 모든 중요 테이블을 일주일에 한번씩 검사하도록 하고 있다. crontab 파일에 아래와 같은 링크를 사용한다:
이것은 크래시된 테이블에 대한 정보를 출력하며, 필요할 경우 우리는 그러한 테이블을 검사하고 치료할 수가 있다.
우리는 여러분이 지난 24시간 동안 업데이트가 된 모든 파일에 대해서, 매일 밤마다 myisamchk -s 를 사용해서 검사하기를 권장
한다.
일반적으로는, MySQL 테이블은 거의 유지 관리가 필요 없다. 만약에 여러분이 동적 크기의 열을 가지고 있는 MyISAM 테이블에
많은 업데이트를 하거나 (VARCHAR, BLOB, 또는TEXT 컬럼을 가지고 있는 테이블) 또는 많은 열을 삭제한 테이블을 가지고 있
다면, 테이블의 공간을 계속해서 최적화 시킬 필요가 있다. 여러분은 의심이 가는 테이블에 OPTIMIZE TABLE을 가지고 최적화
를 할 수가 있다. 다른 방법으로는, mysqld 서버를 당분간 종료해 놓을 수 있다면, 데이터 디렉토리로 이동을 해서 서버가 멈추어
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=11&scate=0&idx=14822006-08-03 오후 4:27:16
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 디폴트로는, MySQL 은 latin1 (cp1252 서유럽) 문자 셋과 latin1_swedish_ci 콜레션(collation)을 사용하고 있다. 이 디폴트 값
5.11. MySQL 지역화(Localization)와 국제적 은 대부분의 서유럽과 미국 사용자들이 사용할 수 있는 문자 셋이다.
인 사용
5.11.1 데이터와 정렬을 위한 문자 셋 모든 MySQL 바이너리 배포판은 --with-extra-charsets=complex를 사용해서 컴파일 되어 있다. 이것은 모든 표준 배포판에
코드를 추가해서 배포판이 latin1과 바이너리에 포함되어 있는 모든 다중-바이트 문자 셋을 처리할 수 있도록 해준다. 다른 문자
셋은 필요할 경우에 문자-셋 정의문에서 로드할 수가 있다.
MySQL이 동작하고 있는 도중에 문자 셋을 변경 하고자 한다면, 정렬 순서도 함께 바꾸어야 한다. 결론적으로, 여러분은 반드시 모
든 테이블에 있는 myisamchk -r -q --set-collation=collation_name 를 구동 시켜야 하는데, 그렇지 않으면 올바르게 순서
가 지켜지지 않을 수도 있다.
클라이언트가 MySQL 서버에 접속을 할 때, 서버는 클라이언트에게 자신의 디폴트 문자 셋이 어떤 것인지를 알려 준다. 클라이언
트는 이 접속에 대해 서버가 알려주는 문자 셋으로 변환을 한다.
만약에 클라이언트가 서버가 설치된 것과는 다른 경로를 가지고 컴파일 되었고 MySQL 서버를 구성한 사용자가 MySQL 바이너리
에 있는 모든 문자 셋을 포함 시키지 않았다면, 여러분은 서버가 클라이언트와 다른 문자 셋을 사용할 경우에 클라이언트가 찾아야
하는 추가 문자 셋이 어디에 있는지를 반드시 클라이언트에게 알려 주어야 한다.
[client]
character-sets-dir=/usr/local/mysql/share/mysql/charsets
[client]
default-character-set=charset_name
제목검색
5. 데이터 베이스 관리 디폴트로, mysqld는 에러 메시지를 영어로 보여 주지만, 여러분은 이 메시지를 다른 언어로 나타나도록 할 수가 있다: Czech,
5.11. MySQL 지역화(Localization)와 국제적 Danish, Dutch, Estonian, French, German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Norwegian-ny,
인 사용 Polish, Portuguese, Romanian, Russian, Slovak, Spanish, 또는 Swedish.
5.11.2 에러 메시지 언어 설정
특정 언어를 사용해서 에러 메시지를 보여 주도록 mysqld을 시작하기 위해서는, --language 또는 -L 옵션을 사용한다. 이 옵션
값은 언어 이름 또는 에러 메시지 파일의 경로가 될 수 있다. 예를 들면:
또는:
여러분은 서버가 만들어 내는 에러 메시지의 내용도 변경할 수가 있다. http://dev.mysql.com/doc/를 참조할 것. 만약에 에러 메시
지를 변경한 후에 MySQL을 새로운 버전으로 업그레이드 한다면, 에러 메시지 변경 작업을 다시 하도록 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=11&scate=2&idx=14842006-08-03 오후 4:27:24
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 이 섹션은 MySQL에 새로운 문자 셋을 추가하는 과정에 대해 설명은 하고 있다. 이 과정을 진행하기 위해서는 반드시 MySQL 소
5.11. MySQL 지역화(Localization)와 국제적 스 배포판을 사용해야 한다. 올바른 과정을 선택하기 위해서는, 문자 셋이 단순한 것인지 아니면 복잡한 것인지를 알아야 한다:
인 사용
5.11.3 새로운 문자 셋 추가 ● 만약에 문자 셋이 특수 스트링 콜레션 루틴을 사용해서 정렬을 하지 않고 다중-바이트 문자 지원이 필요 없는 것이라면,
이 문자 셋은 단순한 것이다.
● 만약에 위의 특성 중에 하나라도 필요하게 되면, 복잡한 문자 셋이다.
5. /*
8. *
9. * .configure. number_MYSET=MYNUMBER
12. */
• my_strxfrm_MYSET()
• my_like_range_MYSET()
Section 5.11.5, “스트링 콜레팅(collating)지원”을 참조.
14. 문자 셋 이름을 configure.in에 있는CHARSETS_AVAILABLE 과 COMPILED_CHARSETS 리스트에 추가한다.
15. 재 구성하고, 재 컴파일하고, 테스트를 한다.
제목검색
상위메뉴리스트 ◆ 5.11.4. 문자 정의 배열
5. 데이터 베이스 관리 to_lower[] 와 to_upper[]은 각 문자 셋의 각 멤버에 대응하는 소문자와 대문자를 가지고 있는 단순 배열이다. 예를 들면:
5.11. MySQL 지역화(Localization)와 국제적인
사용 to_lower['A'] should contain 'a'
5.11.4 문자 정의 배열
to_upper['a'] should contain 'A'
ctype[]는 비트 값 배열로서, 하나의 문자에 하나의 요소를 가지고 있다. ( to_lower[], to_upper[], 그리고 sort_order[]는
문자 값으로 인덱스 되어 있으나, ctype[]는 문자 값 + 1로 인덱스 되어 있다. 이것은 EOF를 다루기 위한 구형 레가시 방식이
다)
#define _U 01 /* Uppercase */
#define _L 02 /* Lowercase */
각 문자에 대한 ctype[] 엔트리는 문자를 설명하는 적용 가능한 비트 마스크 값의 합집합(union)이 되어야 한다. 예를 들면,
'A'는 대문자일 뿐만 아니라(_U) 16진수 숫자이기도 한데(_X), 따라서 ctype['A'+1]는 다음의 값을 가지게 된다:
_U + _X = 01 + 0200 = 0201
제목검색
5. 데이터 베이스 관리 만약에 여러분이 사용하는 언어에 대한 정렬 규칙이 너무 복잡해서 단순 sort_order[] 테이블을 가지고서는 처리할 수가
5.11. MySQL 지역화(Localization)와 국제적인 사용 없다면, 스트링 콜레션 함수를 사용할 필요가 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=11&scate=5&idx=14872006-08-03 오후 4:27:30
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 만약에 다중-바이트 문자를 포함하는 새로운 문자 셋 지원을 추가 하고자 한다면, 다중-바이트 문자 함수를 사용할 필요
5.11. MySQL 지역화(Localization)와 국제적인 사용 가 있다.
5.11.6 다중-바이트 문자 지원
이에 대한 가장 좋은 설명서는 현존하는 문자 셋이 된다. euc_kr, gb2312, gbk, sjis, 그리고 ujis 문자 셋을 살펴 본다. 이
것들은 strings 디렉토리에 있는 ctype-charset_name.c 파일에서 구현되었다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=11&scate=6&idx=14882006-08-03 오후 4:27:31
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆ 5.11.7. 문자 셋 문제
5. 데이터 베이스 관리 여러분이 사용하는 바이너리 배포판에 컴파일 되어 있지 않은 문자 셋을 사용하고자 한다면, 아래의 문제를 만날 수도 있다:
5.11. MySQL 지역화(Localization)와 국제적
인 사용 ● 여러분이 사용하는 프로그램은 문자 셋이 저장되어 있는 곳을 알아 내기 위한 경로를 잘못 사용하게 된다. (디폴트는 /usr/
이와 같은 경우, 여러분은 새로운 Index 파일을 가져오거나 또는 수동으로 누락된 문자 셋 이름을 현재 파일에 추가해야
한다.
MyISAM 테이블의 경우, myisamchk -dvv tbl_name을 사용해서 테이블 번호와 문자 셋을 검사할 수가 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=11&scate=7&idx=14892006-08-03 오후 4:27:32
:::MySQL Korea:::
제목검색
5.11.8 MySQL 서버 타임존 지원 system_time_zone 시스템 변수를 설정한다. 이 값은 설정 후에는 변경되지 않게 된다.
● 서버의 현재 타임 존. 글로벌 time_zone 시스템 변수는 서버가 현재 동작하면서 사용하고 있는 타임 존을 나타낸다.
time_zone의 초기 값은 'SYSTEM'이며, 이것은 서버의 타임 존이 시스템 타임 존과 동일하다는 것을 나타낸다. 초기 값은
--default-time-zone=timezone 옵션을 사용해서 확정적으로 지정할 수가 있다. 여러분이 SUPER 권한을 가지고 있다
면, 아래의 명령문을 사용해서 런타임 시에 글로벌 값을 설정할 수가 있다:
timezone 값은 스트링으로 주어지며 '+10:00' 또는 '-6:00'와 같이 UTC에서 오프셋을 가리키게 된다. 만약에 mysql 데이터 베
이스에 타임 존 정보 테이블을 이미 가지고 있다면, 여러분은 'Europe/Helsinki', 'US/Eastern', 또는 'MET'와 같은 네임드 타임
존도 역시 사용할 수가 있다. 'SYSTEM'은 사용하는 타임 존이 시스템 타임 존과 동일한 것임을 가리킬 때 사용한다. 타임 존 이름
은 대소 문자를 구분하지 않는다.
MySQL 설치 과정은 mysql 데이터 베이스에 타임 존 테이블을 생성하지만, 그것을 로드 하지는 않는다. 여러분은 수동으로 그것
을 로드해야 한다. (만약에 여러분이 이전 버전을 4.1.3 또는 그 이후 버전으로 업그레이드 한다면, 여러분의 mysql 데이터 베이스
를 업그레이드 해서 테이블이 생성되도록 해야 한다. Section 5.6.2, “mysql_upgrade —MySQL 업그레이드에 대한 테이블 검
사”에 있는 방법을 따라 한다.)
만약에 여러분의 시스템이 자체 zoneinfo 데이터 베이스를 가지고 있다면 (타임 존을 설명하는 파일 셋), 타임 존 테이블을 채우기
위해 mysql_tzinfo_to_sql 프로그램을 사용해야 한다. 만약에 여러분의 시스템이 zoneinfo 데이터 베이스를 가지고 있지 않다면,
이 섹션 후반에서 설명하는 다운 로드 패키지를 사용한다.
● 만약에 여러분의 타임 존이 립 세컨드를 위한 계정을 필요하게 되면, 립 세컨드 정보를 아래와 같이 초기화 시킨다. 여기에
서 tz_file는 여러분이 사용하는 타임 존 파일의 이름이 된다:
만약에 여러분의 시스템이 zoneinfo 데이터 베이스를 가지고 있지 않다면 (예를 들어, 윈도우 또는 HP-UX), http://dev.mysql.
Warning: 여러분의 시스템이 zoneinfo 데이터 베이스를 가지고 있다면 다운 로드 패키지를 사용하지 말길 바란다. 대신에
mysql_tzinfo_to_sql 유틸리티를 사용한다. 그렇지 않으면, 시스템에서 다른 어플리케이션과 MySQL을 처리할 때 datetime의 차
이가 발생하게 된다.
리플리케이션 설정에서의 타임 존 설정에 관한 정보는 Section 6.7, “리프리케이션 특징과 알려져 있는 문제점들”을 참조할 것.
제목검색
5.12.1 에러 로그 5.12.5. 서버 로그 관리
5.13.1.2 서비스 형태로 여러 개의 윈도우 서버 시작하기 MySQL은 여러 개의 각기 다른 로그 파일을 가지고 있는데, 이것들은 사용하면 mysqld 내부에서 진행되고 있는 것을 알 수
디폴트로, 모든 로그 파일은 mysqld 데이터 디렉토리에 생성된다. 여러분은 로그를 플러시해서 강제로 mysqld을 닫고 로그
파일을 다시 열 수 있다. 로그 플러싱은 여러분이 FLUSH LOGS 명령문을 입력하거나, 또는 mysqladmin flush-logs 또는
mysqladmin refresh를 실행할 때 발생한다. Section 13.5.5.2, “FLUSH 신텍스”를 참조할 것.
만약에 여러분이 MySQL 리플리케이션을 사용한다면, 슬레이브 리플리케이션 서버는 릴레이 로그 라는 로그 파일을 관리하
게 된다. 이것에 대해서는 Chapter 6, “리플리케이션” 에서 다루기로 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=12&scate=0&idx=14912006-08-03 오후 4:27:44
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆ 5.12.1. 에러 로그
5. 데이터 베이스 관리 에러 로그 파일은 mysqld의 시작 및 종료 시점을 가리키는 정보와 서버의 동작 중에 발생한 치명적인 에러에 대한 정보를 가
5.12. MySQL 서버 로그 지고 있다. 만약에 mysqld가 자동으로 검사 또는 치료해야 할 필요가 있는 테이블을 발견하게 되면, 메시지를 에러 로그에
만약에 mysqld가 예상하지 못하게 멈추고 mysqld_safe을 통해 이것을 재 구동해야만 할 경우, mysqld_safe는 restarted
mysqld 메시지를 에러 로그에 기록한다.
여러분은 mysqld이 에러 로그를 저장하는 곳을 --log-error[=file_name] 옵션을 사용해서 지정할 수가 있다. 만약에 아
무런 file_name 값도 주어지지 않는다면, mysqld은 host_name.err라는 이름을 사용해서 데이터 디렉토리에 파일을 기록한
다. 만약에 여러분이 FLUSH LOGS를 실행한다면, 에러 로그는 -old라는 접미사가 붙은 이름으로 바뀌게 되고 mysqld은
새로운 빈 로그 파일을 만든다. (--log-error 옵션이 주어지지 않는다면, 파일 이름 변경은 생기지 않게 된다.)
만약에 여러분이 --log-error를 지정하지 않거나, 또는(윈도우에서) --console 옵션을 사용한다면, 에러는 표준 에러 결
과(output)인 stderr에 기록된다. 일반적으로, 이것은 여러분의 터미널이 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=12&scate=1&idx=14922006-08-03 오후 4:27:49
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 NT-기반 시스템에서, MySQL 서버는 윈도우 서비스 형태로 구동될 수 있다. 단일 MySQL 서비스를 설치, 제어, 그리고 제거하
5.12. MySQL 서버 로그 는 과정은 Section 2.3.11, “윈도우 서비스 형태로 MySQL 시작하기”에서 설명하고 있다.
5.12.1 에러 로그
5.13.1.2 서비스 형태로 여러 개의 윈도우 서버 시
작하기
여러분은 여러 개의 MySQL 서버를 서비스 형태로 설치할 수도 있다. 이와 같은 경우, 여러분은 반드시 각 서버가 별도의 서비스
이름을 사용하도록 해야 하며, 아울러 모든 다른 파라미터도 각 서버에 대해 고유의 값을 가지고 있어야 한다.
아래의 원칙은 MySQL 서비스를 --install or --install-manual 옵션을 가지고 설치할 때 적용된다:
● 여러분이 서비스 이름을 지정하지 않으면, 서버는 MySQL의 디폴트 서비스 이름을 사용하며, 표준 옵션 파일에 있는
[mysqld] 그룹에서 옵션을 읽게 된다.
● 만약에 --install 옵션 다음에 서비스 이름을 지정한다면, 서버는 [mysqld] 옵션 그룹을 무시하게 되며, 서비스와 동일한
이름을 가지고 있는 그룹에서 옵션을 대신 읽는다. 서버는 표준 옵션 파일에서 옵션을 읽는다.
● 만약에 서비스 이름 다음에 --defaults-file 옵션을 지정한다면, 서버는 표준 옵션 파일을 무시하게 되며 네임드 파일의
[mysqld] 그룹에서만 옵션을 읽게 된다.
위의 설명을 토대로, 여러분은 다중 서비스를 설정할 수 있는 여러 가지의 방법을 알게 될 것이다. 아래에서는 몇 가지 예를 설명하
고 있다. 이것들을 시도하기 전에, 우선 여러분은 MySQL 서버를 종료하고 이미 존재하는 서비스를 제거하도록 해야 한다.
름을 사용해서는 5.0.19 mysqld-nt를 구동시킨다고 가정을 하자. 이와 같은 경우, 4.1.8을 위해서는 [mysqld1] 그룹을
사용하고, 5.0.19를 위해서는 [mysqld2] 그룹을 사용할 수 있다. 예를 들면, 아래와 같이 C:₩my.cnf를 설정할 수가 있
다:
• [mysqld1]
• basedir = C:/mysql-4.1.8
• port = 3307
• enable-named-pipe
• socket = mypipe1
• [mysqld2]
• basedir = C:/mysql-5.0.19
• port = 3308
• enable-named-pipe
• socket = mypipe2
전체 서버경로 이름을 사용해서 윈도우가 각 서비스를 위한 정확한 실행 프로그램을 등록할 수 있도록 하기 위해, 아래와
같이 서비스를 설치한다:
서비스를 시작하기 위해, 서비스 관리자를 사용하거나, 또는 적당한 서비스 이름을 가지고 NET START를 사용한다:
서비스를 멈추기 위해서는, 서비스 관리자 또는 적당한 이름을 가진 NET STOP을 사용한다:
● Approach 2: 개별 파일에 있는 각 서버용 옵션을 지정하고 각 서버가 사용할 파일을 알려 주기 위해 서비스를 설치할 때
에 --defaults-file를 사용한다. 이와 같은 경우, 각 파일은 [mysqld] 그룹을 사용해서 옵션을 리스트 해야 한다.
이 단계에서, 4.1.8 mysqld-nt에 대한 옵션을 지정하기 위해서는, 아래와 같은 모습의 C:₩my-opts1.cnf를 생성한다:
[mysqld]
basedir = C:/mysql-4.1.8
port = 3307
enable-named-pipe
socket = mypipe1
[mysqld]
basedir = C:/mysql-5.0.19
port = 3308
enable-named-pipe
socket = mypipe2
--defaults-file=C:₩my-opts1.cnf
--defaults-file=C:₩my-opts2.cnf
MySQL 서버를 서비스로 설치할 때 --defaults-file 옵션을 사용하기 위해서는, 반드시 서비스 이름 앞에 옵션을 지정
해야 한다.
서비스를 설치한 다음에는, 위에서 설명한 방식으로 서비스를 시작하고 종료한다.
여러 개의 서비스를 제거하기 위해서는, 각 서버별로 mysqld –remove를 사용하고, 서비스 이름을 지정하고 뒤에 --remove 옵
션을 넣는다. 서비스 이름이 디폴트 (MySQL)라면, 이를 생략할 수 있다.
제목검색
5. 데이터 베이스 관리 일반적인 쿼리 로그는 mysqld이 실행한 것에 대한 일반 기록이다. 서버는 클라이언트가 접속을 하거나 또는 접속을 끊을 때 정보
5.12. MySQL 서버 로그 를 이 로그에 기록하며, 그리고 클라이언트에서 받는 각 SQL 명령문을 로그 한다. 일반적인 쿼리 로그는 클라이언트에서 에러를 의
5.12.2 일반적인 쿼리 로그 심할 경우와 클라이언트가 mysqld에 보내는 것이 무엇인지를 정확히 알고 싶을 때 매우 유용하게 사용된다.
일반적인 쿼리 로그를 활성화 시키기 위해서는, mysqld을 --log[=file_name] 또는 -l [file_name] 옵션과 함께 구동 시킨다. 만
약에 아무런 file_name 값도 주어지지 않는다면, 디폴트 이름은 데이터 디렉토리에 있는 host_name.log가 된다.
shell> rm host_name-old.log
윈도우에서는, 서버가 이 로그 파일을 열어 놓은 상태에서는 이름을 바꿀 수가 없다. 여러분은 서버를 종료 시킨 다음에 이름을 바
꾸어야 하고, 그런 다음에 서버를 재 시작하여 새로운 로그 파일을 만들도록 해야 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=12&scate=2&idx=14932006-08-03 오후 4:27:54
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 바이너리 로그는 데이터를 업데이트 하거나 또는 나중에 업데이트를 진행하는 모든 명령문을 가지고 있다. 명령문은 데이터 수정
5.12. MySQL 서버 로그 을 나타내는 “이벤트(event)” 형태로 저장된다. 바이너리 로그는 또한 각 명령문이 데이터를 업데이트하는데 얼마의 시간을 소
Note: 바이너리 로그는 이전(old)의 업데이트 로그를 대체하는데, 이 로그는 5.0 이후에는 더 이상 사용하지 않는다. 바이너리 로
그는 이전의 업데이트 로그에서 사용했던 모든 정보를 보다 편리한 형태와 트랜젝션에 보다 안정적인 형태로 가지고 있다. 만약에
여러분이 트랜젝션을 사용한다면, 반드시 이전 업데이트 로그가 아닌 바이너리 로그를 사용해서 백업을 진행해야 한다.
바이너리 로그는 데이터를 수정하지 않는 명령문은 가지지 않는다. 만약에 여러분이 모든 명령문을 로그하고 싶다면 (예를 들면, 문
제 쿼리를 구분하기 위해), 일반 쿼리 로그를 사용하기 바란다. Section 5.12.2, “일반 쿼리 로그”를 참조.
바이너리 로그의 주요 목적은 서버가 복원 작업을 하는 동안 가능한 한 전체적으로 데이터 베이스를 업데이트할 수 있도록 하는 것
인데, 왜냐하면 바이너리 로그는 백업이 만들어진 후에 발생한 모든 업데이트를 가지고 있기 때문이다. 바이너리 로그는 또한 마스
터 리플리케이션 서버에서는 슬레이브 서버에 보내져야 하는 명령문의 기록으로 사용되기도 한다. Chapter 6, 리플리케이션 를 참
조할 것.
Running the server with 바이너리 로그가 활성화된 상태로 서버를 구동하면 약 1%정도의 성능 저하가 발생한다. 하지만, 복원
작업과 리플리케이션을 설정할 수 있도록 해주는 바이너리 로그의 장점은 약간의 성능 저하 보다는 더 큰 이익을 준다.
서버가 --log-bin[=base_name] 옵션으로 시작되었을 때, mysqld는 데이터를 업데이트하는 모든 SQL 명령어를 가지고 있는
로그 파일을 작성한다. 만약에 아무런 base_name 값도 주어지지 않는다면, 디폴트 이름은 –bin이 붙어 있는 호스트 머신의 이름
을 사용하게 된다. 만일 베이스 이름을 주어지기는 하지만 절대 경로 이름(absolute pathname) 형태가 아닌 경우에는, 서버는 파
일을 데이터 디렉토리에 작성한다. 여러분이 베이스 이름을 지정할 것을 권장한다; Section A.8.1, “Open Issues in MySQL”에
서 그 이유를 참조하기 바란다.
Mysqld은 바이너리 로그 베이스 이름에 숫자로 된 확장자를 부여한다. 그 숫자는 서버가 새로운 로그 파일을 생성할 때 마다 증가
를 하게 되는데, 따라서 파일의 생성 순서가 만들어 진다. 서버가 시작되거나 또는 로그를 플러시할 때 마다 서버는 새로운 바이너
리 로그 파일을 생성한다. 서버는 또한 현재의 로그 크기가 max_binlog_size에 근접할 때에도 새로운 바이너리 로그 파일을 만들
기도 한다. 만약에 트랜젝션이 여러 개의 파일로 분리되지 않고 하나로 형성이 되기 때문에 어쩔 수 없이 큰 트랜젝션을 사용해야
할 경우에는 바이너리 로그의 크기가 max_binlog_size 보다 커질 수는 있다.
사용된 바이너리 로그 파일들을 관리하기 위해서, mysqld는 사용된 모든 바이너리 로그 파일의 이름을 가지고 있는 바이너리 로
그 인덱스 파일도 생성을 한다. 이 인덱스 파일은 바이너리 로그 파일과 동일한 베이스 이름을 디폴트로 가지게 되며, 확장자는 '.
index'가 된다. 여러분은 --log-bin-index[=file_name] 옵션을 사용해서 이 인덱스 파일의 이름을 변경할 수가 있다. mysqld
의 동작 중에는 수동으로 이 파일을 수정할 수가 없다; 이렇게 하면 mysqld이 혼동을 하게 된다.
Writes to 바이너리 로그 파일과 바이너리 로그 인덱스 파일에 기록을 하는 것은 MyISAM 테이블에 기록하는 방식과 동일하게 처
리가 된다. Section A.4.3, “How MySQL Handles a Full Disk”를 참조.
여러분은 RESET MASTER 명령문을 사용해서 모든 바이너리 로그 파일을 삭제할 수 있고, 또는 PURGE MASTER LOGS를 사
용해서 이 로그 파일의 일부분만을 삭제할 수도 있다. Section 13.5.5.5, “RESET 신텍스”, 및 Section 13.6.1, “마스터 서버
를 제어하기 위한 SQL 명령문”을 참조할 것.
바이너리 로그 포맷에는 백업에서 복원하는데 영향을 줄 수 있는 몇 가지 제약이 있다. Section 6.7, “리플리케이션 기능과 알려
진 문제점들”을 참조할 것.
스토어드 루틴과 트리거에 대한 바이너리 로깅은 Section 17.4, “스토어드 루틴과 트리거에 대한 바이너리 로깅”을 참조할 것.
여러분은 아래의 옵션을 사용해서 mysqld이 바이너리 로그에 로그 되는 것에 영향을 주도록 만들 수 있다.
만약에 여러분이 리플리케이션을 사용한다면, 여기에서 설명하는 옵션들은 마스터 서버가 자신의 슬레이브에 전달하는 명령문에
영향을 주게 된다. 마스터 서버가 보내주는 명령문을 실행 또는 무시할지를 제어하는 슬레이브 서버를 위한 옵션도 존재한다. 자세
한 사항은 Section 6.8, “리플리케이션 스타트업 옵션”을 참조할 것.
● --binlog-do-db=db_name
디폴트 데이터베이스 db_name (즉, USE가 선택한 데이터 베이스)에 대해 업데이트에 대한 바이너리 로깅을 제한하도록
서버에게 명령. 이름이 정확히 지정되지 않은 모든 다른 데이터 베이스는 무시된다. 이 옵션을 사용할 경우에는, 여러분이
디폴트 데이터 베이스에만 업데이트를 한다는 것을 확인해야 한다.
CREATE DATABASE, ALTER DATABASE, 및 DROP DATABASE 명령문에 대해서는 예외적이다. 서버는 명령문
을 로그 할지 말지를 결정하기 위해 명령문(디폴트 데이터 베이스가 아님)안에 적혀 있는 데이터 베이스를 사용한다.
여러분이 기대한 것과는 다르게 동작하는 예를 보자: 만약에 서버가 binlog-do-db=sales와 함께 구동되고, 여러분이
USE prices; UPDATE sales.january SET amount=amount+1000; 을 실행한다면, 이 명령문은 바이너리 로그에 기
록되지 않는다.
여러 개의 데이터 베이스에 로그 하기 위해서는, 각 데이터 베이스 별로 옵션을 지정하는, 다중옵션을 사용한다.
● --binlog-ignore-db=db_name
디폴트 데이터베이스 db_name (즉, USE가 선택한 데이터 베이스)에 대해 업데이트에 대한 바이너리 로깅을 하지 말도
록 서버에게 명령. 이 옵션을 사용할 경우에는, 여러분이 디폴트 데이터 베이스에만 업데이트를 한다는 것을 확인해야 한
다.
CREATE DATABASE, ALTER DATABASE, 및 DROP DATABASE 명령문에 대해서는 예외적이다. 서버는 명령문
을 로그 할지 말지를 결정하기 위해 명령문(디폴트 데이터 베이스가 아님)안에 적혀 있는 데이터 베이스를 사용한다.
여러분이 기대한 것과는 다르게 동작하는 예를 보자: 만약에 서버가 binlog-do-db=sales와 함께 구동되고, 여러분이
USE prices; UPDATE sales.january SET amount=amount+1000; 을 실행한다면, 이 명령문은 바이너리 로그에 기
록된다.
.
여러 개의 데이터 베이스를 무시하기 위해서는, 각 데이터 베이스 별로 옵션을 지정하는, 다중옵션을 사용한다.
서버는 아래의 규칙에 따라 바이너리 로그에 업데이트를 로그 또는 무시하기 위한 옵션을 평가한다. 앞에서 설명을 하였듯이,
CREATE DATABASE, ALTER DATABASE, 그리고 DROP DATABASE 명령문에 대해서는 예외적이다. 이 명령문들의 경
우, 아래의 규칙에 따라 created, altered, 또는 dropped 동작을 하는 데이터 베이스가 디폴트 데이터 베이스를 대신하게 된다.
예를 들면, --binlog-do-db=sales를 가지고만 구동되는 슬레이브는 바이너리 로그 디폴트 데이터 베이스가 sales와 다른 것에
대해서는 어떠한 명령문도 바이너리 로그에 기록을 하지 않는다(달리 말하면, --binlog-do-db 는 때때로 “다른 데이터 베이스
는 무시”의 의미를 가지기도 한다).
리플리케이션을 사용 중에 있다면, 어떠한 슬레이브도 구형(old) 바이너리 로그 파일을 사용하지 않는다고 확신하지 않는 한 그 바
이너리 파일들을 삭제할 수 없다. 예를 들면, 만약에 슬레이브가 3일 이상 동작하지 않았다면, 마스터에서 mysqladmin flush-
logs를 실행하고 3일 이상이 된 모든 로그를 제거한다. 여러분은 수동으로 이 파일들을 삭제할 수 있겠지만, PURGE MASTER
LOGS를 사용하는 것이 더욱 효과적이며, 바이너리 로그 인덱스 파일을 안전하게 업데이트 하는 방법이다. Section 13.6.1, “마스
터 서버 제어를 위한 SQL 명령문”을 참조할 것.
SUPER 권한을 가지고 있는 클라이언트는 SET SQL_LOG_BIN=0 명령문을 사용해서 자신의 명령문에 대한 바이너리 로깅을 비
활성화 시킬 수가 있다. Section 13.5.3, “SET 신텍스”를 참조.
여러분은 mysqlbinlog 유틸리티를 사용해서 바이너리 로그 파일의 내용물을 디스플레이 할 수 있다. 이것은 여러분이 로그에 있
는 명령문을 다시 실행하고자 할 때 유용하게 쓸 수 있다. 예를 들면, 아래와 같이 바이너리 로그에서 MySQL 서버를 업데이트 할
수가 있다:
Section 8.8, “mysqlbinlog — 바이너리 로그 파일 처리를 위한 유틸리티”를 참조하여 mysqlbinlog 유틸리티에 대한 정보와 사
용 방법을 알아두기 바란다. Mysqlbinlog은 또한 릴레이 로그 파일과 함께 사용될 수도 있는데, 왜냐하면 릴레이 로그 파일이 바이
너리 로그 파일과 동일한 포맷으로 작성되어 있기 때문이다.
바이너리 로깅은 명령문이 완료된 후에 하지만 모든 잠금이 풀리거나 모든 동작이 마치기 전에 즉시 종료가 된다. 이것은 로그가 실
행 순서에 따라 로그 되도록 하기 위해서이다.
논-트랜젝션 테이블에 대한 수정은 롤백 되지 않는다. 만약에 롤백된 트랜젝션이 논-트랜젝션 테이블에 대한 수정을 포함하고 있
다면, 전체 트렌젝션은 이러한 테이블에 대한 수정이 리플리케이트 되었음을 확신하기 위해 마지막에 ROLLBACK 명령문을 가지
고 로그된다.
Binlog_cache_use 상태 변수는 명령문을 저장하기 위해 이 버퍼(또는 임시 파일)를 사용한 트랜젝션의 숫자를 표시한다.
Binlog_cache_disk_use 상태 변수는 이 임시 파일을 실제로 사용한 트랜젝션의 숫자를 표시한다. 이 두 가지의 변수는 임시 파일
사용을 피하기 위해 binlog_cache_size의 크기를 튜닝하는데 사용된다.
max_binlog_cache_size 시스템 변수(디폴트 4GB)는 다중-명령문 트랜젝션을 캐시 하는데 사용되는 전체 크기를 제한하는데 사
용된다. 만약에 한 트랜젝션이 이것보다 크게 되면, 그 트랜젝션을 실패하게 되고 롤백된다,
만약에 여러분이 바이너리 로그를 사용하고 있다면, 동시 삽입은 CREATE ... SELECT 또는 INSERT ... SELECT 명령문에 대
한 정상 삽입으로 변환된다. 이것은 여러분이 백업 동작을 하는 도중에 로그를 적용해서 여러분의 테이블에 대한 정확한 복사본을
다시 생성할 수 있도록 하기 위해 실행되는 것이다.
5.0의 바이너리 로그 포맷은 리플리케이션의 속도를 개선하기 위해 이전의 MySQL 버전과는 달라졌다는 것을 알기 바란다.
디폴트로는, 바이너리 로그는 각각의 기록 시점에 디스크와 동기화가 되지는 않는다. 따라서, 만약에 OS 또는 머신(MySQL 서버
뿐만 아니라)이 크래시 된다면, 바이너리 로그의 마지막 명령문을 잃을 가능성이 생긴다. 이것을 방지하기 위해서는, sync_binlog
시스템 변수를 사용해서, 모든 N 이 바이너리 로그에 기록될 때마다 디스크와 동기화를 하도록 해야 한다. Section 5.2.2, “서버
시스템 변수”를 참조할 것. 1 은 sync_binlog에 대해서는 가장 안전한 값이기는 하지만 또한 가장 느린 값이기도 하다.
sync_binlog를 1로 설정하였다고 하더라도, 크래시가 발생할 경우에는 테이블 컨텐츠와 바이너리 로그 컨텐츠 간에는 여전히 불일
치가 나올 가능성이 있다. 예를 들면, 여러분이 InnoDB 테이블을 사용하고 MySQL 서버가 COMMIT 명령문을 처리 한다면, 모든
트랜젝션이 바이너리 로그에 기록되고 난 후에 이 트랜젝션을 InnoDB 안으로 넣게 된다. 만약에 서버가 이 두 개의 동작 사이에 크
래시 되면, 트랜젝션은 InnoDB에 의해 롤백 되지만 여전히 바이너리 로그에 남아 있게 된다. 이 문제는 --innodb-safe-binlog
옵션으로 해결할 수 있는데, 이 옵션은 InnoDB 테이블의 컨텐츠와 바이너리 로그의 컨텐츠간에 일관성을 추가한다 (Note: --
innodb-safe-binlog는 MySQL 5.0 이후에는 필요 없게 되었다; 이 옵션은 XA 트랜젝션 지원으로 인해 쓰지 않아도 되게 됨.)
이 옵션이 보다 완벽한 안전성을 제공하기 위해서는, MySQL 서버는 모든 트랜젝션 시점에도 바이너리 로그와 InnoDB 로그를 디
스크에 동기화 시키도록 구성되어야 한다. InnoDB 로그는 디폴트로 동기화 되며, sync_binlog=1는 바이너리 로그를 동기화 하기
위해 사용된다. 이 옵션의 효과는 크래시 후에 재 구동하는 시점에, 트랜젝션 롤백을 한 후에, MySQL 서버가 롤백된 InnoDB 트랜
젝션을 바이너리 로그에서 잘라 낸다는 것이다. 이것은 바이너리 로그가 InnoDB 테이블의 정확한 데이터를 반영하도록 해 주며,
따라서 슬레이브는 마스터와 일관성을 유지하게 된다tables, and so, that the slave remains in synchrony with the master (롤
백된 명령문을 받지 않음).
MySQL 서버가 InnoDB가 아닌 다른 스토리지 엔진을 업데이트 할 경우에도 --innodb-safe-binlog를 사용할 수 있다는 점을
알기 바란다. InnoDB에 영향을 미치는 명령문과 트랜젝션만이 InnoDB의 크래시를 복구하는 시점에 바이너리 로그에서 제거된다.
이 복구 시점에, MySQL 서버가 가지고 있어야 하는 바이너리 로그보다 짧은 것을 발견하게 되면, 성공적으로 수행된 InnoDB 트
랜젝션 중에 최소한 한 개를 잃어 버린 것이다. 이것은 sync_binlog=1 이고 디스크/파일시스템이 실제로 동기화를 실행한다면 발
생하지 않는데, 따라서 서버는 binary log <name> is shorter than its expected size. 라는 에러 메시지를 출력한다. 이와 같은
경우, 바이너리 로그는 올바른 것이 아니며 마스터 서버의 데이터 스냅 샷에서 리플리케이션을 다시 실행해야 한다.
제목검색
5. 데이터 베이스 관리 슬로우 쿼리 로그는 실행 시간이 long_query_time 보다 길게 걸리는 모든 SQL 명령문으로 구성된다. 초기 테이블 잠금을 얻기 위
5.12. MySQL 서버 로그 한 시간은 실행 시간으로 계산되지 않는다. The minimum and default values of long_query_time의 최소값 및 디폴트 값은 각
Mysqld은 명령문을 실행한 후에 그리고 모든 잠금이 풀린 후에 그 명령문을 슬로우 쿼리 로그에 기록한다. 로그 순서는 실행 순서
와는 다르다.
아무런 file_name 값도 주어지지 않는다면, 디폴트는 -slow.log의 접미사를 가지고 있는 호스트 머신의 이름을 사용한다. 만약에
파일 이름은 주어 지지만, 절대 경로 이름이 아니라면, 서버는 파일을 데이터 디렉토리에 기록한다.
슬로우 쿼리 로그는 실행 시간이 오래 걸리기 때문에 최적화를 해야 할 쿼리를 찾는데 사용할 수 있다. 하지만, 긴 슬로우 쿼리 로그
를 검사 하는 것은 어려운 작업이다. 이 작업을 보다 쉽게 하기 위해서는, 로그안에 있는 쿼리를 요약하기 위한 mysqldumpslow 명
령어를 사용해서 슬로우 쿼리를 처리 한다. mysqldumpslow –help를 사용해서 이 명령어에 사용할 수 있는 옵션들을 보도록 한
다.
MySQL 5.0에서, 인덱스를 사용하지 않는 슬로우 쿼리는 인덱스를 사용하는 쿼리와 함께 로그 된다. 슬로우 쿼리 로그에 인덱스를
사용하지 않는 쿼리가 로그되는 것을 방지하기 위해서는, --log-queries-not-using-indexes 옵션을 사용한다.
Section 5.2.1, “mysqld 명령어 옵션”을 참조.
MySQL 5.0에서, --log-slow-admin-statements 서버 옵션은 OPTIMIZE TABLE, ANALYZE TABLE, and ALTER
TABLE 와 같은 관리 명령문이 슬로우 쿼리 로그에 로깅 되는 것을 활성화 시킨다.
쿼리 캐시가 처리하는 쿼리들은 슬로우 쿼리 로그에 추가되지 않으며, 테이블에 열이 없거나 하나의 열만 가지고 있기 때문에 인덱
제목검색
상위메뉴리스트 ◆ 5.12.5. 서버 로그 관리
MySQL 을 로깅 활성화 상태로 사용할 때에는, 백업을 받고 가끔씩 오래된 로그 파일을 삭제할 필요가 있으며 MySQL이 새로운
파일에 로깅 하도록 만들고 싶을 것이다. Section 5.10.1, “데이터 베이스 백업”을 참조.
리눅스(레드 헷) 설치에서는, 이것을 위해 mysql-log-rotate 스크립트를 사용할 수가 있다. 만약에 RPM 버전을 가지고 MySQL
을 설치 한다면, 이 스크립트는 자동으로 설치가 된다. 만약에 리플리케이션을 위해 바이너리 로그를 사용하는 중이라면, 이 스크립
트를 사용하는 것에 주의를 해야 한다. 여러분은 바이너리 로그에 있는 컨텐츠를 모든 슬레이브가 처리했다고 확신할 때까지는 바
이너리 로그를 삭제할 수가 없다.
다른 시스템의 경우, 로그 파일을 처리하기 위해 스스로 간단한 스크립트를 설치해서 서버를 cron (또는 동일한 것들)에서 시작을
할 수 있도록 해야 한다.
여러분은 mysqladmin flush-logs을 사용하거나 또는 SQL 명령문인 FLUSH LOGS를 사용해서 MySQL 서버가 새로운 로그 파
일을 사용해서 구동되도록 만들 수가 있다.
서버는 로그를 플러시할 때 새로운 바이너리 로그 파일을 생성한다. 하지만, 서버는 일반 쿼리 로그 파일과 슬로우 쿼리 로그 파일
은 단순히 닫은 다음에 다시 열기만 한다. 유닉스에서 새로운 파일이 생성되도록 하기 위해서는, 현재의 로그를 플러시 하기 전에
이름을 바꿔 준다. 플러시 할 때에는, 서버는 원래의 이름을 가진 새로운 로그를 열게 된다. 예를 들면, 만약에 일반 쿼리 로그와 슬
로우 쿼리 로그가 mysql.log 와 mysql-slow.log라고 되어 있다면, 아래와 같은 일련의 명령어를 사용할 수가 있다:
shell> cd mysql-data-directory
윈도우에서는, 서버가 로그 파일을 열어 놓을 동안에는 이름을 바꾸지 못한다. 여러분은 반드시 서버를 종료 시킨 후에 이름을 바꾸
어야 하고, 새로운 로그를 생성하기 위해서는 서버를 재 구동 시켜야 한다.
제목검색
5.13.2 유닉스에서 여러 개의 서버 구동하기 각각의 서버에 대해서는 아래의 옵션들이 최소한 서로 달라야 한다:
● --socket=path
--socket은 유닉스에서는 유닉스 소켓 파일 경로를 제어하며, 윈도우에서는 네임드 파이프의 이름을 제어한다.
윈도우에서는, 네임드 파이트 접속을 지원하는 서버에 대해서만 정확한 파이프 이름을 지정할 필요가 있다.
● --shared-memory-base-name=name
이 옵션은 아직까지는 윈도우에서만 사용된다. 이것은 윈도우 서버가 사용하는 공유 메모리 이름을 가지고 클라이
언트가 공유 메모리를 통해 접속할 수 있도록 하기 위한 것이다. 공유 메모리 접속을 지원하는 서버에 대해서만 정
확히 지정하면 된다.
● --pid-file=file_name
이 옵션은 유닉스에서만 사용된다. 이것은 서버가 자신의 프로세스 ID를 기록하는 파일의 경로 이름을 가리킨다.
만약에 아래의 로그 파일 옵션을 사용한다면, 이 옵션들은 각각의 서버에 대해 서로 틀리게 지정되어야 한다:
● --log=file_name
● --log-bin=file_name
● --log-update=file_name
● --log-error=file_name
● --bdb-logdir=file_name
● --tmpdir=path
● --bdb-tmpdir=path
보다 쉽게 생각을 하자: NFS를 통해서 서버들이 데이터 디렉토리를 공유하는 것을 잊어 버리자. 보다 좋은 솔루션은 쓰레
드를 보다 효과적으로 처리하는 OS를 탑재한 다중 CPU 시스템을 하나 운영하는 것이다.
서로 다른 위치에 여러 개의 MySQL을 설치했다면, 각 서버별 베이스 설치 디렉토리를 --basedir=path 옵션으로 지정
을 해서 각각의 서버가 서로 다른 데이터 디렉토리, 로그 파일, 그리고 PID 파일을 사용하도록 만든다. (이러한 모든 것들
의 디폴트 값은 베이스 디렉토리와 관련이 있다). 이와 같은 경우, 여러분이 지정을 할 필요가 있는 한가지 다른 옵션은
--socket 과 --port 옵션이다. 예를 들면, tar 파일 바이너리 배포판을 사용해서 서로 다른 MySQL 버전들을 설치했다
고 가정하자. 서로 다른 위치에 설치를 하였기 때문에, 여러분은 각각의 베이스 디렉토리 아래에서 명령어bin/
mysqld_safe 를 사용해서 각각의 설치 서버를 시작할 수가 있다. mysqld_safe는 --basedir 옵션이 정확한지를 판단해
서 mysqld에 전달을 하며, 여러분은 mysqld_safe에 대한 --socket 과 --port 옵션만 지정하면 된다.
제목검색
5. 데이터 베이스 관리 명령어 라인에서 수동으로 여러 개의 서버를 구동하기 위해서는, 명령어 라인 또는 옵션 파일에 적절한 옵션을 지정해야 한다. 옵
5.13. 동일 머신에서 여러 대의 MySQL 서버 션 파일에 옵션을 주는 것이 더 편리한 방법이지만, 각각의 서버가 자신들의 옵션만을 가져가도록 해야 한다. 이렇게 하기 위해서
구동 시키기 는, 각 서버 별로 옵션 파일을 생성하고 서버를 구동할 때 서버에 --defaults-file 옵션이 붙은 파일 이름을 알려 준다.
5.13.1.1 명령어 라인에서 여러 개의 윈도우 서버
구동하기 여러분이 포트 3307에서 mysqld을 데이터 디렉토리 C:₩mydata1를 가지고 구동시키며, 포트 3308에서는 mysqld-max를 C:
₩mydata2와 함께 구동 시킨다고 가정하자 (이렇게 하기 위해서는, 서버를 구동 하기 전에, 각 데이터 디렉토리는 이미 존재하고
그랜트 테이블을 가지고 있는 mysql 데이터 베이스의 복사본을 가지고 있어야 한다.) 그런 다음에 두 개의 옵션 파일을 생성한다.
예를 들면, 아래와 같은 형식의 파일 C:₩my-opts1.cnf를 생성한다:
[mysqld]
datadir = C:/mydata1
port = 3307
두 번째 파일 C:₩my-opts2.cnf을 생성한다:
[mysqld]
datadir = C:/mydata2
port = 3308
NT에서는, 각 서버는 전면(foreground)에서 구동 되며 (서버가 동작을 마칠 때까지 프롬프트는 나타나지 않음), 따라서 위의 두
개의 명령어를 서로 별도의 콘솔 윈도우에서 구동 시킨다.
서버를 셧다운 시키기 위해서는, 각 서버의 포트 번호를 사용해서 서버에 접근해야 한다:
위와 같이 구성된 서버는 클라이언트가 TCP/IP를 통해 접속할 수 있도록 해 준다. 여러분이 사용하는 윈도우 버전이 네임드 파이
프를 지원하고 그리고 네임드 파이프 접속을 허용하고자 한다면, mysqld-nt 또는 mysqld-max-nt 서버를 사용하여 네임드 파이
프를 활성화 시키는 옵션과 네임드 파이프의 이름을 지정해 준다. 네임드 파이프 접속을 지원하는 각 서버는 고유의 파이프 이름을
사용해야 한다. 예를 들면, C:₩my-opts1.cnf 파일을 아래와 같이 작성해 보자:
[mysqld]
datadir = C:/mydata1
port = 3307
enable-named-pipe
socket = mypipe1
공유-메모리 접속을 지원하는 서버에 대해서도 비슷한 과정을 수행할 수가 있다. --shared-memory 옵션을 가지고 접속을 활
성화 시키고 --shared-memory-base-name 옵션을 사용해서 서버 별 고유의 공유-메모리 이름을 지정한다.
제목검색
5. 데이터 베이스 관리 유닉스에서 여러 개의 서버를 구동 시키는 가장 쉬운 방법은 각각의 서버를 서로 다른 TCP/IP 포트와 유닉스 소켓 파일을 사용해
5.13. 동일 머신에서 여러 대의 MySQL 서버 서 컴파일 해서 각 서버가 별도의 네트워크 인터페이스를 통하도록 하는 것이다. 각각의 설치 서버별로 서로 다른 베이스 디렉토리
구동 시키기 를 가지고 컴파일을 하게 되면 자동으로 서버별 데이터 디렉토리, 로그 파일, 그리고 PID 파일 위치가 구분된다.
5.13.2 유닉스에서 여러 개의 서버 구동하기
현재 설치되어 있는 4.1.8 서버가 디폴트 TCP/IP 포트 번호(3306)과 유닉스 소켓 파일 (/tmp/mysql.sock)로 구성 되었다고 가
정하자. 새로운 5.0.19 서버가 별도의 동작 파라미터를 가지게 하기 위해서는, 아래와 같이 configure 명령어를 사용한다:
--with-unix-socket-path=file_name ₩
--prefix=/usr/local/mysql-5.0.19
여기에서, port_number 와 file_name은 디폴트 TCP/IP 포트 번호와 유닉스 소켓 파일과 달라야 하고, 또한 --prefix 값은 현재
의 MySQL 서버가 설치되어 있는 디렉토리와는 다른 곳을 지정해야 한다.
만약에 주어진 포트 번호를 참조는 MySQL 서버가 이미 있다면, 여러분은 아래의 명령어를 사용해서 베이스 디렉토리와 유닉스 소
켓 파일 이름을 포함해서 몇몇 중요한 구성 변수가 사용하고 있는 동작 파라미터의 값을 알아 볼 수가 있다:
이 명령어를 통해 얻어진 정보를 가지고, 여러분은 다른 서버가 추가될 때 사용할 수 없는 옵션 값이 무엇인지를 알 수가 있다.
만약에 호스트 이름으로 localhost를 지정한다면, mysqladmin은 TCP/IP가 아닌 유닉스 소켓 파일 접속을 디폴트로 사용한다.
MySQL 4.1 이후에는, --protocol={TCP|SOCKET|PIPE|MEMORY} 옵션을 사용해서 여러분이 사용하고자 하는 접속 프로
여러분은 서로 다른 유닉스 소켓 파일과 TCP/IP를 가지고 시작하기 위해 새로운 서버를 컴파일할 필요는 없다. 동일한 서버 바이
너리를 사용하고 런타임 시에 별도의 파라미터 값을 가지고 각각을 호출하는 것도 가능하다. 이렇게 하는 방법 중의 하나는 명령어
라인에서 옵션을 사용하는 것이다:
두 번째 서버를 구동하기 위해서는, –socket과 –port의 옵션 값을 다른 값으로 주고, 그리고 --datadir=path 옵션을
mysqld_safe에 전달해서 서버가 다른 데이터 디렉토리를 사용하도록 한다.
비슷한 효과를 얻기 위한 다른 방법은 유닉스 소켓 파일 이름과 TCP/IP 포트 번호를 설정하는 환경 변수를 사용하는 것이다:
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
이 방법은 두 번째 서버를 빠르게 시작할 수 있도록 한다. 이 방법의 장점은 환경 변수 설정이 여러분이 동일한 쉘에서 호출하는 모
든 클라이언트 프로그램에 적용된다는 것이다. 따라서, 이러한 클라이언트에 대한 접속이 자동으로 두 번째 서버를 가리키게 된다.
Appendix F, Environment Variables에는 여러분이 mysqld에 영향을 주도록 사용할 수 있는 여러 가지의 다른 환경 변수가 설명
되어 있다.
서버의 자동 실행을 위해서는, 서버 부팅 시점에 실행되는 스타트업 스크립트가 아래의 명령어 별로 적당한 옵션 파일 경로를 가지
고 각 서버 별로 한번씩은 실행되어야 한다:
유닉스에서는, mysqld_multi 스크립트를 사용해서 여러 개의 서버를 구동할 수가 있다. Section 5.4.3, “mysqld_multi — 다중
MySQL 서버 관리”를 참조.
제목검색
5. 데이터 베이스 관리 클라이언트에 컴파일된 것과는 다른 네트워크 인터페이스를 참조하고 있는 서버에 클라이언트 프로그램을 가지고 접속하기 위해서
5.13. 동일 머신에서 여러 대의 MySQL 서버 는, 아래의 방법 중에 하나를 사용한다:
구동 시키기
5.13.3 다중-서버 환경에서 클라이언트 프로그램 ● 리모트 서버에 TCP/IP를 경유해서 접속하기 위해서는 클라이언트를 --host=host_name --port=port_number와 함
사용하기 께 시작하고, 로컬 서버에 접속하기 위해서는 --host=127.0.0.1 --port=port_number를 가지고 시작하고, 또는 유닉
스 소켓 파일 또는 윈도우 네임드 파이프를 사용해서 로컬 서버에 접속을 할 경우에는 --host=localhost --
socket=file_name을 사용해서 클라이언트를 시작한다.
● MySQL 4.1 이후에는, TCP/IP를 경유한 클라이언트 접속은 --protocol=tcp를 사용하고, 유닉스 소켓 파일을 경유하는
접속은 --protocol=socket, --protocol=pipe는 네임드 파이프를 위한 것이며, --protocol=memory는 공유 메모리
를 통한 접속을 위해 사용하는 것이다. TCP/IP 접속의 경우, 여러분은 --host 와 --port 옵션도 지정할 필요가 있다. 다
른 형태의 접속에 대해서는, 유닉스 소켓 파일 또는 윈도우 네임드 파이프 이름을 위해서는 --socket 옵션을, 공유 메모
리 이름을 위해서는 --shared-memory-base-name 옵션을 지정할 필요가 있다. 공유 메모리 접속은 윈도우에서만 지
원된다.
● 유닉스에서는, 클라이언트를 시작하기 전에 MYSQL_UNIX_PORT 와 MYSQL_TCP_PORT 환경 변수를 설정해서 유닉
스 소켓 파일과 TCP/IP포트 번호를 가리키도록 한다. 만약에 여러분이 특정 유닉스 소켓 파일 또는 포트 번호를 일반적으
로 사용한다면, .login 파일에 이러한 환경 변수를 설정하는 명령어를 입력해서 여러분이 로그인 할 때마다 적용되도록 한
다. Appendix F, 환경 변수를 참조할 것.
● 옵션 파일의 [client] 그룹 안에 디폴트 유닉스 소켓 파일과 TCP/IP포트 번호를 지정한다. 예를 들면, 윈도우에서는 C:
₩my.cnf, 또는 유닉스에서는 여러분의 홈 디렉토리에 있는 .my.cnf 파일을 사용할 수 있다. Section 4.3.2, “옵션 파일
사용하기”를 참조.
● C 프로그램에서는, mysql_real_connect() 호출에 유닉스 소켓 파일과 포트 번호 인수를 지정할 수가 있다. 또한, mysql_
옵션()을 호출해서 프로그램 읽기 옵션 파일을 가질 수도 있다. Section 22.2.3, “C API 함수 상세 설명”을 참조.
● 만약에 Perl DBD::mysql 모듈을 사용한다면, 여러분은 MySQL 옵션 파일에서 옵션을 읽을 수가 있다. 예를 들면:
• $dsn = "DBI:mysql:test;mysql_read_default_group=client;"
• . "mysql_read_default_file=/usr/local/mysql/data/my.cnf";
제목검색
5.14.1 쿼리 캐시를 동작 시키는 방법 쿼리 캐시는 SELECT 명령문이 클라이언트에 보내는 결과와 함께 명령문을 저장한다. 만약에 동일한 명령문이 나중에 전달되면,
5.14.3 쿼리 캐시 구성 쿼리 캐시는 여러분이 자주 변경되지 않는 테이블을 가지고 있고 서버가 동일한 쿼리를 많이 받는 환경에서는 매우 유용하게 사용
된다. 이것은 데이터 베이스 컨텐츠를 기반으로 많은 수의 동적 페이지를 만들어 내는 대부분의 웹 서버에서 활용할 수가 있다.
5.14.4 쿼리 캐시 상태 및 관리
Note: 쿼리 캐시는 오래된 데이터(stale)를 리턴 하지는 않는다. 테이블이 수정되면, 쿼리 캐시에 있는 모든 연관 엔트리는 플러시
된다.
Note: 쿼리 캐시는 동일한 MyISAM 테이블을 업데이트하는 여러 개의 mysqld 서버를 가지고 있는 환경에서는 동작하지 않는다.
Note: 쿼리 캐시는 서버-측면의 프리페어드(prepared)명령문에서는 사용되지 않는다. Section 22.2.4, “C API 프리페어드
(Prepared) 명령문”을 참조.
서버 스타트업 시점에 쿼리 캐시를 비활성화 시키기 위해서는, query_cache_size 시스템 변수를 0으로 설정한다. 만약에 MySQL
을 소스를 가지고 설치한다면, 쿼리 캐시 기능은 --without-query-cache 옵션을 가지고 configure를 호출해서 전부 제외 시
킬 수가 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=14&scate=0&idx=15022006-08-03 오후 4:28:55
:::MySQL Korea:::
제목검색
5. 데이터 베이스 관리 이 섹션에서는 쿼리 캐시를 구동 시키는 방법을 설명하기로 한다. Section 5.14.3, “쿼리 캐시 구성”에서는 쿼리 캐시가 동작 가
5.14. MySQL 쿼리 캐시 능한 것인지를 제어하는 방법을 설명한다.
쿼리가 서로 동일한 것으로 보이기 위해서는 반드시 정확히 똑 같아야 한다(바이트 비교). 또한, 동일한 쿼리 스트링은 다른 이유
로 인해 서로 다른 것으로 취급되기도 한다. 서로 다른 데이터 베이스, 프로토콜 버전, 또는 디폴트 문자 셋을 사용하는 쿼리들은 서
로 다른 것으로 간주되고 별도로 캐시된다.
쿼리의 결과를 쿼리 캐시에서 가져오기 전에, MySQL은 사용자가 모든 데이터 베이스와 호출된 테이블에 대해 SELECT 권한을
가지고 있는지를 검사한다, 만약에 권한이 없다면, 캐시 결과는 사용되지 않는다.
만약에 쿼리 결과가 쿼리 캐시에서 리턴되면, 서버는 Qcache_hits 상태 변수를 증가 시킨다(Com_select를 증가 시키지 않음).
Section 5.14.4, “쿼리 캐시상태 및 관리”를 참조.
테이블이 변경된다면, 그 테이블을 사용하는 모든 캐시된 쿼리들은 사용할 수 없게 되며(invalid) 캐시에서 제거된다. 여기에는 변
경된 테이블을 매핑하는 MERGE 테이블도 포함된다. INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP
TABLE, 또는 DROP DATABASE와 같은 여러 가지의 명령문으로 인해 테이블은 변경될 수 있다.
쿼리 캐시는 InnoDB 테이블을 사용할 때 트랜젝션 내에서 동작될 수도 있는데, 테이블 버전 번호를 사용해서 테이블 컨텐츠가 여
전히 존재하는지를 검사하도록 한다.
MySQL 5.0 이전에는, 코멘트로 시작되는 쿼리는 캐시 되었으나, 캐시에서 가져올 수는 없었다. 이 문제는 MySQL 5.0에서 해결
을 했다.
쿼리 캐시는 SELECT SQL_CALC_FOUND_ROWS ... 그리고 SELECT FOUND_ROWS() 타입의 쿼리와 동작을 한다.
FOUND_ROWS()는 비록 발견된 열의 숫자도 함께 캐시에 저장되기 때문에 앞에 있는 쿼리를 캐시로부터 가져올 수 있었다고 하
더라도 올바른 값을 리턴해 준다.
마지막 형태는 쿼리가 마지막 ID 값을 얻기 위해 ODBC를 사용하고 있기 때문에 캐시 되지 못한다. Section 23.1.14.1,
“ODBC에서 AUTO_INCREMENT 컬럼 값을 가져 오기”를 참조할 것.
● 플레이스 홀더(placeholder)가 사용되었다고 하더라도, 쿼리가 프리페어드 명령문 형태로 입력되었다. 예를 들면, 여기에
서 사용되는 쿼리는 캐시되지 않는다:
• /* ... */
제목검색
5.14. MySQL 쿼리 캐시
● SQL_CACHE
5.14.2 쿼리 캐시 SELECT 옵션
● SQL_NO_CACHE
쿼리 결과는 캐시 되지 않는다.
예제:
http://www.mysqlkorea.com/develop/sub_07.html?lcate=5&mcate=14&scate=2&idx=15042006-08-03 오후 4:29:04
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆ 5.14.3. 쿼리 캐시 구성
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
다른 여러 가지의 시스템 변수가 쿼리 캐시의 동작을 제어 한다. 이 변수들은 옵션 파일 또는 명령어 라인에서 설정될 수 있다.
mysqld이 시작될 때 이 변수들은 옵션 파일 또는 명령어 라인에서 설정될 수 있다. 쿼리 캐시 시스템 변수 모두는 query_cache_
를 가지고 시작된다.
쿼리 캐시의 크기를 설정하기 위해서는, query_cache_size 시스템 변수를 설정하면 된다. 이것을 0으로 설정하게 되면 쿼리 캐시
는 비활성화가 된다. 디폴트는 0 이다.
여러분이 query_cache_size를 0이 아니 값으로 설정할 때에는, 쿼리 캐시는 최소한 40KB의 크기를 가져야 한다는 것을 알기 바
란다. (정확한 크기는 시스템 구조에 달려 있다.) 만약에 이 값을 너무 작게 설정한다면, 아래와 같은 경고문이 나오게 된다:
Level: Warning
Code: 1282
Message: query cache failed to set size 39936; new query cache size is 0
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| query_cache_size | 41984 |
+------------------+-------+
만약에 쿼리 캐시의 크기가 0 보다 크면, query_cache_type 변수가 동작에 영향을 주게 된다. 이 변수는 아래의 값을 가지고 설정
할 수 있다:
캐시될 수 있는 개별 쿼리 캐시의 최대 크기를 제어하기 위해서는, query_cache_limit 시스템 변수를 설정한다. 디폴트는 1MB이
다.
쿼리가 캐시 되어질 경우, 그 결과 값(클라이언트에 전달되는 데이터)은 결과를 추출하는 동안 쿼리 캐시에 저장된다. 따라서 일반
적으로 데이터는 하나의 큰 단위로 취급되지 않는다. 쿼리 캐시는 필요에 따라 이 데이터를 저장하기 위한 블록을 할당하는데, 따라
서 하나의 블록이 가득 차게 되면, 다른 새로운 블록이 할당된다. 메모리 할당 동작은 비용이 비싸기 때문에, 쿼리 캐시는
query_cache_min_res_unit 시스템 변수가 주는 최소의 크기를 가지고 블록을 할당한다. 쿼리가 실행될 때, 최종의 결과 블록은 실
제의 데이터 크기로 조정되고 사용하지 않는 나머지 메모리를 돌려 준다. 여러분의 서버가 실행하는 쿼리의 형태에 따라,
query_cache_min_res_unit의 값을 튜닝하는 것이 도움이 될 것이다:
제목검색
상위메뉴리스트 ◆ 5.14.4. 쿼리 캐시 상태 및 관리
5. 데이터 베이스 관리 여러분은 아래의 명령문을 사용해서 여러분의 MySQL 서버에 쿼리 캐시가 존재하는지를 알아볼 수 있다:
5.14. MySQL 쿼리 캐시
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
여러분은 FLUSH QUERY CACHE 명령문을 사용해서 보다 효율적으로 메모리를 관리하도록 쿼리 캐시의 단편화(defragment)
를 해소할 수가 있다. 이 명령문은 캐시에서 어떠한 쿼리도 제거하지 않는다.
RESET QUERY CACHE 명령문은 쿼리 캐시엣 모든 쿼리 결과를 제거한다. FLUSH TABLES 명령문도 이와 같은 일을 한다.
+-------------------------+--------+
| 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 |
+-------------------------+--------+
Com_select
+ Qcache_hits
Qcache_inserts
+ Qcache_not_cached
캐시된 모든 쿼리는 최소한 두 개의 블록을 요구한다.(쿼리 텍스트를 위해서 하나가 필요하고, 쿼리 결과 값을 위해서는 한 개 이상
이 필요함). 또한, 쿼리가 사용하는 모든 테이블은 하나의 블록을 요구한다. 하지만, 만약에 두 개 이상의 쿼리가 동일한 테이블을
사용한다면, 하나의 테이블 블록만 할당할 필요가 있다.
Qcache_lowmem_prunes 상태 변수가 제공하는 정보를 가지고 여러분은 쿼리 캐시의 크기를 튜닝할 수가 있다. 이것은 캐시에서
삭제가 되는 쿼리의 숫자를 계산한다. 튜닝 정보는 Section 5.14.3, “쿼리 캐시구성”를 참조할 것.
제목검색
상위메뉴리스트 ◆
Chapter 6. 리플리케이션
6. 리플리케이션
리플리케이션 관련 SQL명령문 신텍스에 대한 보다 자세한 사항은, Section 13.6, “리플리케이션 명령문”을 참조하기 바란다.
제목검색
상위메뉴리스트 ◆
6.1. 리플리케이션 소개
6. 리플리케이션
MySQL의 기능들은 한 방향, 즉 비동기 리플리케이션(asynchronous replication)을 지원하는데, 하나의 서버는 마스터로 동작하
6.1. 리플리케이션 소개
고, 나머지 한 개 이상의 다른 서버들은 슬레이브로 동작한다. 이것은 MySQL클러스터의 특징인 동기화된(synchronous) 리플리
6.1 리플리케이션 소개
케이션과는 반대되는 개념이다.( Chapter 15, MySQL 클러스터)를 참조할 것.
싱글-마스터 리플리케이션에서, 마스터 서버는 업데이트를 자신의 바이너리 로그 파일들에 작성을 하고 로그 로테이션의 트레이
스(trace)를 유지하기 위해 이 파일들의 인덱스를 유지 관리 한다. 바이너리 로그 파일들은 다른 슬레이브 서버에 보내어지는 업데
이트 레코드 역할을 한다. 슬레이브가 자신의 마스터에 연결이 될 때, 슬레이브는 마스터의 정보를 자신이 마지막으로 업데이트가
성공했을 때 읽었던 로그에 전달한다. 슬레이브는 그 시간 이후에 발생한 모든 사항에 대한 업데이트를 전달 받고, 그 다음에는 블
록(block)을 한 후에 마스터가 새로운 업데이트를 알려 주기를 기다리게 된다.
슬레이브 서버는, 여러분이 체인드 리플리케이션 서버(chained replication server)로 설정을 하게 되면, 자신이 마스터의 역할을
하게 된다.
리플리케이션을 사용할 때에는, 리플리케이트된 테이블에 대한 모든 업데이트는 마스터 서버에서 실행 되어야 한다. 그렇지 않으
면, 여러분은 사용자가 마스터에 있는 테이블에서 행하는 업데이트와 슬레이브에서 행하는 업데이트간의 충돌을 피하도록 항상 주
의해야만 한다.
• 견고성(Robustness)은 마스터/슬레이브 설정을 가지고 증가된다. 마스터에서 문제가 발생하면, 여러분은 백업의 형
태로 슬레이브로 전환할 수 있다.
• 리플리케이션 사용의 다른 이점은 여러분이 마스터의 방해 없이 슬레이브 서버를 사용해서 데이터베이스 백업을 실
행할 수 있다는 것이다. 마스터는 백업이 진행되는 동안에도 업데이트 프로세스를 계속 한다.Section 5.10.1, “데이터 베
이스 백업”을 참조할 것.
제목검색
상위메뉴리스트 ◆
6.2. 리플리케이션 구현 개론
6. 리플리케이션
MySQL 리플리케이션은 마스터 서버의 바이너리 로그에 있는 여러분의 데이터 베이스에 대한 모든 변경(업데이트, 삭제, 등등) 사
6.2. 리플리케이션 구현 개론
항에 대한 마스터 서버 유지 트랙(master server keeing track)에 기초를 하고 있다. 따라서, 리플리케이션을 사용하기 위해서
6.2 리플리케이션 구현 개론
는, 마스터 서버에 있는 바이너리 로깅을 활성화 시켜야 한다. Section 5.12.3, “바이너리 로그”를 참고할 것.
각 슬레이브 서버는 마스터 서버가 자신의 바이너리 로그에 기록해둔 업데이트 사항을 전달 받게 되는데, 따라서 슬레이브는 데이
터 복사본에서 동일한 업데이트를 실행할 수 있게 된다.
바이너리 로그는 단순히 여러분이 바이너리 로깅을 활성화 시킨 시점부터 시작된 기록에 불과하다는 것을 이해하는 것이 절대적으
로 중요하다. 여러분이 설정한 모든 슬레이브는 여러분이 마스터 서버에서 바이너리 로깅을 활성화 시켰던 시점에 존재 했던 것처
럼 마스터 서버에 데이터 베이스의 복사본을 필요로 한다. 만약에 바이너리 로그가 시작될 때 마스터에 있었던 것과 같은 상태의 데
이터 베이스가 아닌 다른 것을 가지고 슬레이브를 시작한다면, 여러분은 슬레이브 구동에 실패를 할 것이다.
마스터의 데이터를 슬레이브로 복사하는 한 가지 방법은 LOAD DATA FROM MASTER 명령문을 사용하는 것이다. 하지만,
LOAD DATA FROM MASTER는 마스터에 있는 모든 테이블이 MyISAM 스토리지 엔진을 사용할 때에만 제대로 동작한다. 부가
적으로, 이 명령문은 글로벌 읽기 잠금(read lock)을 갖게 되는데, 따라서 테이블이 슬레이브로 전달되는 동안에는 마스터에서는
어떠한 업데이트도 할 수 없게 된다. 우리가 잠금 –면제 핫 테이블(lock-free hot table) 백업을 실행할 때에는, 이 글로벌 읽기
잠금 기능은 더 이상 필요 없게 된다.
이러한 제약으로 인해, 우리는 여러분이 마스터에 있는 데이터 셋이 상대적으로 작거나, 또는 마스터에서 연기된 읽기 잠금이 수용
될 때에만 LOAD DATA FROM MASTER를 사용하기를 권장한다. 비록 LOAD DATA FROM MASTER의 실제 속도가 시스템
에 따라 다양하다고 하더라도, 경험적으로는 1MB의 데이터 당 1초가 걸린다. 이것은 대략적인 측정값이지만, 마스터와 슬레이브
가 둘 다 동일하게700MHz 팬티엄 CPU를 가지고 있고 100Mbps 네트워크에 연결되어 있는 경우에 거의 정확하다는 것을 알게
될 것이다.
슬에이브가 마스터의 데이터 복사본을 가지고 설정이 된 후에는, 슬레이브는 마스터에 접속을 하고 업데이트가 진행되기를 기다리
게 된다. 만약에 마스터가 실패(fail)를 하면, 또는 슬레이브가 마스터와 접속이 끊어지게 되면, 슬레이브는 업데이트에 대한 정보
를 다시 들을 수 있을 때까지 주기적으로 접속을 시도하게 된다. --master-connect-retry 옵션은 재시도 간격을 제어한다. 디
폴트 값은 60초이다.
각 슬레이브는 자신의 마스터로부터 마지막으로 업데이트를 읽었을 때 어디에서 중단 되었는지에 대한 트랙을 유지한다. 마스터는
자신이 얼마나 많은 슬레이브를 가지고 있는지 또는 어느 것이 주어진 시간에서 갱신 되었는지 알지 못한다.
제목검색
상위메뉴리스트 ◆
6.3. 리플리케이션 구현 상세 설명
6. 리플리케이션 6.3.1. 리플리케이션 마스터 쓰레드 상태
앞에서 설명을 하였듯이, 마스터/슬레이브 연결마다 세 개의 쓰레드가 있게 된다. 여러 개의 슬레이브를 가지고 있는 하나의 마스터
는 현재 접속되어 있는 각각의 슬레이브별로 하나의 쓰레드를 생성하고, 그리고 가가 슬레이브는 자신들만의 I/O 와 SQL 쓰레드들
을 가지게 된다.
다.
SHOW PROCESSLIST 명령문은 리플리케이션에 관련하여 마스터와 슬레이브 서버에서 어떤 일이 있었는지를 보여 준다. 아래
의 SHOW PROCESSLIST 명령문의 결과에서 세 개의 쓰레드가 어떻게 보여지는지를 나타내고 있다.
Id: 2
User: root
Host: localhost:32931
db: NULL
Time: 94
be updated
Info: NULL
여기에서, 쓰레드 2는 연결된 슬레이브에 대한 Binlog Dump 리플리케이션 쓰레드이다. State 정보는 모든 업데이트 사항이 슬레
이브에 전달 되었으며 마스터는 다른 업데이트가 발생하는 것을 대기하고 있다는 점을 설명하는 것이다. 여러분이 마스터 서버에
서 아무런 Binlog Dump 쓰레드도 보지 못한다면, 이것은 리플리케이션이 구동 되지 않고 있음을 의미하는 것이다 — 즉, 현재 어떠
Id: 10
Host:
db: NULL
Command: Connect
Time: 11
Info: NULL
Id: 11
Host:
db: NULL
Command: Connect
Time: 11
State: Has read all relay log; waiting for the slave I/O
thread to update it
Info: NULL
이 정보는 쓰레드 10이 마스터 서버와 통신을 하는 I/O 쓰레드이고, 그리고 쓰레드 11은 릴레이 로그에 저장되어 있는 업데이트 사
항을 실행하는 SQL 쓰레드라는 것을 알려 준다. SHOW PROCESSLIST 이 실행 되었을 때에는, 양쪽 쓰레드 모두 아이들(idle)
상태였으며, 또 다른 업데이트를 기다리고 있는 중이었다.
Time 컬럼에 있는 값은 슬레이브가 마스터에 비교해서 얼마나 늦는지를 알려주는 것이다. Section 6.10, “리플리케이션
FAQ”를 참조할 것.
제목검색
상위메뉴리스트 ◆
6.3.1. 리플리케이션 마스터 쓰레드 상태
6. 리플리케이션
아래의 리스트는 마스터 서버의 Binlog Dump 쓰레드에 대해 State 컬럼에서 여러분이 볼 수 있는 가장 일반적인 상태를 보여준
6.3. 리플리케이션 구현 상세 설명
다. 마스터 서버에서 아무런 Binlog Dump 쓰레드를 보지 못한다면, 리플리케이션은 구동 되지 않는 것이다- 즉, 어떠한 슬레이브
6.3.1 리플리케이션 마스터 쓰레드 상태
서버도 연결이 되어 있지 않다는 것이다.
바이너리 로그는 이벤트(events)들로 구성되는데, 하나의 이벤트는 일반적으로 여러 개의 정보를 가지고 있는 하나의 업
데이트 항목이 된다. 쓰레드는 바이너리 로그에서 이벤트를 읽었으며 이제 이것을 슬레이브에 전달한다.
쓰레드는 모든 업데이트 항목을 바이너리 로그에서 읽었으며 그것들을 슬레이브에 전달했다. 쓰레드는 현재 아이들(idle)
상태이며, 마스터에서 새로운 업데이트가 발생해서 바이너리 로그에 새로운 이벤트가 나타나기를 기다리고 있는 상태이
다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=6&mcate=3&scate=1&idx=15242006-08-08 오후 5:54:20
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
6.3.2. 리플리케이션 슬레이브 I/O 쓰레드 상태
6. 리플리케이션
아래의 리스트는 슬레이브 서버의 I/O 쓰레드에 대해 State 컬럼에서 여러분이 볼 수 있는 가장 일반적인 상태를 설명하는 것이다.
6.3. 리플리케이션 구현 상세 설명
이 상태는 SHOW SLAVE STATUS를 통해서 볼 수 있는 Slave_IO_State 컬럼에서도 나타날 수도 있다. 따라서 이 명령문을 사
6.3.2 리플리케이션 슬레이브 I/O 쓰레드 상태
용하면, 여러분은 어떤 일이 일어났는지에 대해서 유익한 정보를 얻을 수 있게 된다.
• Connecting to master
마스터에 접속이 된 후에 매우 짧게 나타나는 상태. 쓰레드는 바이너리 로그의 파일 이름과 위치를 가지고, 바이너리 로그
의 내용물에 대한 요청을 마스터에 보낸다.
바이너리 로그 덤프가 실패할 경우(접속 불가로 인해), 쓰레드는 곧장 이 상태가 되며, 그 다음에는 주기적으로 재 접속을
시도하게 된다. 재시도 간격은 --master-connect-retry 옵션을 가지고 지정할 수가 있다.
쓰레드는 마스터에 접속이 되었고 바이너리 로그 이벤트가 도착 하기를 기다린다. 이것은 마스터가 아이들 상태일 경우에
쓰레드는 이벤트를 읽었고 이것을 릴레이 로그에 복사를 해서 SQL 쓰레드가 이 이벤트를 처리하게끔 한다.
이벤트를 읽는 도중에 발생된 에러(접속 단절로 인해). 쓰레드는 재접속을 시도하기 전에 master-connect-retry 시간
동안 대기(sleeping)를 한다.
쓰레드는 마스터에 재 접속을 시도한다. 접속이 다시 이루어지게 되면, 상태는 Waiting for master to send event 가 된
다.
• Waiting for the slave SQL thread to free enough relay log space
여러분은 0(zero)가 아닌 relay_log_space_limit 값을 사용하는 중이며, 그리고 릴레이 로그의 크기는 이 값을 초과할 만
큼 충분이 커져 있다. I/O 쓰레드는 SQL 쓰레드가 릴레이 로그 파일 중에 일부를 삭제해서 충분한 공간을 확보하지 않으
면 계속 대기를 한다.
제목검색
상위메뉴리스트 ◆
6.3.3. 리플리케이션 슬레이브 SQL 쓰레드 상태
6. 리플리케이션
아래의 리스트는 슬레이브 서버의 SQL 쓰레드에 대해 State 컬럼에서 가장 일반적으로 볼 수 있는 상태를 설명한다:
6.3. 리플리케이션 구현 상세 설명
• Has read all relay log; waiting for the slave I/O thread to update it
쓰레드는 릴레이 로그 파일에 있는 모든 이벤트를 처리하였고, 이제는 I/O쓰레드가 새로운 이벤트들을 릴레이 로그에 작
성하기를 기다리고 있다.
I/O 쓰레드에 대한 State 컬럼은 명령문 문장도 함께 보여 준다. 이것은 쓰레드가 릴레이 로그로부터 하나의 이벤트를 읽었으며, 거
기에서 명령문을 추출했고, 그리고 그 명령문을 실행했다는 것을 가리킨다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=6&mcate=3&scate=3&idx=15262006-08-08 오후 5:54:23
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
6.3.4. 리플리케이션 릴레이 및 상태 파일
6. 리플리케이션
디폴트로는, 릴레이 로그 파일 이름은 host_name-relay-bin.nnnnnn 형식을 가지며, 여기에서 host_name 는 슬레이브 서버의
6.3. 리플리케이션 구현 상세 설명
이름이 되고 nnnnnn 은 시퀀스 번호가 된다. 000001으로 시작해서, 연속적인 시퀀스 번호를 사용해서 연속적인 릴레이 로그 파일
6.3.4 리플리케이션 릴레이 및 상태 파일
들이 생성된다. 슬레이브는 현재 사용중에 있는 릴레이 로그 파일들을 추적하기 위해 하나의 인덱스를 사용한다. 디폴트 릴레이 로
그 인덱스 파일 이름은 host_name-relay-bin.index이다. 디폴트로는, 슬레이브 서버는 자신의 데이터 디렉토리에 릴레이 파일
을 생성한다. 디폴트 파일 이름은 --relay-log 와 --relay-log-index 서버 옵션을 가지고 덮어 쓸 수가 있다. Section 6.8,
“리플리케이션 스타트업 옵션들”을 참조할 것.
릴레이 로그는 바이너리 로그와 동일한 포맷을 갖고 mysqlbinlog를 사용해서 읽을 수가 있다. SQL 쓰레드는 릴레이 로그 파일 안
에 있는 모든 이벤트들이 처리가 되고 더 이상 그 파일이 필요가 없게 되면 즉시 자동으로 각 릴레이 로그 파일을 삭제한다. SQL 쓰
레드는 이러한 삭제 동작을 매우 조심스럽게 진행하기 때문에 릴레이 로그 파일을 삭제하는 데에는 명백한 메커니즘이 존재하지 않
는다. 하지만, FLUSH LOGS 는 릴레이 로그를 로테이트(rotate) 시키는데, 이것은 SQL 쓰레드가 이 파일들을 삭제하는 시기에
영향을 미친다.
슬레이브 리플리케이션 서버는 데이터 디렉토리에 두 개의 작은 파일을 추가로 생성을 한다. 이 상태 파일들은 디폴트로 master.
info 와 relay-log.info라고 이름되어 있다. 이것들의 이름은 --master-info-file 와 --relay-log-info-file 옵션으로 바꿀
이러한 두 상태 파일들은 Section 13.6.2, “슬레이브 서버를 제어하기 위한 SQL 명령문”에서 설명을 하는 SHOW SLAVE
STATUS 명령문의 결과에서 볼 수 있는 정보를 가지고 있다. 상태 파일들은 디스크에 저장이 되기 때문에, 슬레이브 서버가 셧 다
운 되더라도 계속 존재를 하게 된다. 슬레이브가 시작되는 다음 시점에, 슬레이브 서버는 마스터에서 바이너리 로그를 어디까지 읽
었는지 그리고 자신의 릴레이 로그가 어디까지 진행이 되었는지를 알아보기 위해 이 파일들을 읽게 된다.
I/O 쓰레드는 master.info 파일을 갱신한다. 아래의 테이블에서는 그 파일에 있는 라인에 대응하여 SHOW SLAVE STATUS가
출력하는 컬럼의 상관 관계를 나타내고 있다.
Line Description
2 Master_Log_File
3 Read_Master_Log_Pos
4 Master_Host
5 Master_User
7 Master_Port
8 Connect_Retry
9 Master_SSL_Allowed
10 Master_SSL_CA_File
11 Master_SSL_CA_Path
12 Master_SSL_Cert
13 Master_SSL_Cipher
14 Master_SSL_Key
SQL 쓰레드는 relay-log.info 파일을 갱신한다. 아래의 테이블에서는 그 파일에 있는 라인에 대응하여 SHOW SLAVE STATUS
Line Description
1 Relay_Log_File
2 Relay_Log_Pos
3 Relay_Master_Log_File
4 Exec_Master_Log_Pos
여러분이 슬레이브의 데이터를 백업할 때에는, 릴레이 로그 파일과 더불어 이 두 파일들도 함께 백업을 받도록 해야 한다. 이 파일
들은 여러분이 슬레이브의 데이터를 다시 읽어 온후에 리플리케이션을 재 구동 시키기 위해 필요한 것 들이다. 만일 여러분이 릴레
이 로그는 잃어버렸지만 relay-log.info 파일은 여전히 가지고 있다면, 이것을 가지고 SQL 쓰레드가 마스터 바이너리 로그에서 얼
마나 진행이 되었는지를 알아볼 수가 있게 된다. 그런 다음에 여러분은 Then you can use with the MASTER_LOG_FILE 과
MASTER_LOG_POS 옵션과 함께 CHANGE MASTER TO를 사용해서 슬레이브로 하여금 그 시점에서 바이너리 로그를 다시 읽
어 오도록 할 수가 있다. 물론, 이것은 바이너리 로그가 여전히 마스터 서버에 있어야 한다는 것을 전제로 한다.
만일 슬레이브가 LOAD DATA INFILE 명령문을 리플리케이션 하는 것과 관련이 있다면, 슬레이브가 이러한 목적으로 사용하는
디렉토리에 있는 모든 SQL_LOAD-* 파일들도 함께 백업을 해 두어야 한다. 슬레이브는 이 파일들을 가지고 인터럽트를 당한
LOAD DATA INFILE의 리플리케이션을 다시 진행한다. 디렉토리의 위치는 --slave-load-tmpdir 옵션을 사용해서 지정할 수
가 있다. 만일 이 옵션을 지정하지 않으면, 디렉토리의 위치는 tmpdir 시스템 변수의 값이 된다.
제목검색
상위
6.4. 리플리케이션 설정 방법
메뉴리스
트◆ 이 섹션에서는 MySQL 서버의 전체 리플리케이션을 설정하는 방법에 대해 간략히 설명을 하기로 한다. 여러분은 마스터 서버에 있는 모든 데이터 베이스를 복제 하고자 한다는 가정을 한다. 여기
에서 설명하고 있는 단계를 완료하기 위해서는 서버를 셧 다운 시켜야 한다.
6.
리플
리케 여기의 과정은 단일 슬레이브를 설정하는 것에 대한 것이지만, 여러분은 이 과정을 반복 사용하면 여러 대의 슬레이브로 설정을 할 수가 있게 된다.
이션
비록 이 방법이 가장 간단한 방법이기는 하지만, 유일한 방법을 아니다. 예를 들면, 만일 여러분이 마스터 서버의 데이터에 대한 스냅샷(snapshot)을 가지고 있고, 마스터가 이미 자신의 ID 셋을
6.4.
리플 가지고 있으며 바이너리 로깅을 활성화 시켰다면, 여러분은 마스터 서버를 셧 다운 시키거나 또는 업데이트에 대한 블로킹을 하지 않은 상태로도 슬레이브를 설정할 수가 있다. 보다 자세한 사항
6.4 리플 Note: 여기에서 설명하고 있는 과정 및 다음의 섹션에 나오는 여러 가지의 리플리케이션 SQL 명령문들은 SUPER 권한이 있어야 한다.
리케
이
1. 마스터와 슬레이브에 설치되어 있는 MySQL 버전이 Section 6.5, “MySQL 버전간의 리플리케이션 호환성”에 나와 있는 테이블과 서로 호환성을 가지고 있는지 확인한다. 가장
션
이상적인 것은, 마스터와 슬레이브가 가장 최신의 버전을 사용하는 것이다.
설
정 2. 슬레이브 서버가 접속을 해서 사용할 수 있는 계정을 마스터에 하나 생성한다. 이 계정은 반드시 REPLICATION SLAVE 권한을 가지고 있어야 한다. 만일 그 계정이 리플리케이션
방법 만을 위해 사용된다면(권장 사항임), 다른 권한들은 그 계정에 줄 필요가 없다.
여러분이 사용하는 도메인은 mydomain.com이며 이 도메인에 있는 어떠한 호스트에서도 접속할 수 있는 계정을 repl라는 이름과 slavepass라는 패스워드를 갖도록 생성한다고 가정하
자. 이 계정을 생성하기 위해서는, 아래의 GRANT 명령문을 사용한다:
만일 여러분이 슬레이브 호스트에서 LOAD TABLE FROM MASTER 또는 LOAD DATA FROM MASTER 명령문을 사용할 계획이라면, 이 계정에 추가적인 권한을 승인해야 한다:
• 여러분이 읽어 오길 원하는 모든 테이블에 대해 SELECT 권한을 승인한다. 이 계정이 SELECT할 수 없는 모든 마스터 테이블은 LOAD DATA FROM MASTER에 의해
무시될 것이다.
사용자 계정 및 권한 설정에 대한 추가적인 내용은 Section 5.9, “MySQL 사용자 계정 관리”를 참조한다.
3. 모든 테이블을 플러시하고 FLUSH TABLES WITH READ LOCK 명령문을 실행해서 쓰기 명령문을 막도록(block) 한다:
InnoDB 테이블의 경우, FLUSH TABLES WITH READ LOCK 명령문은 COMMIT 동작도 막는다는 것을 알아두자. 여러분이 글로벌 읽기 잠금(lock)을 가지게 될 때, 여러분 자신의
InnoDB 테이블에 대한 파일 시스템 스냅샷을 시작할 수가 있게 된다. 내부적으로는 (InnoDB 스토리지 엔지 내부에서는) 스냅샷은 일관되게 유지가 되지 않지만 (InnoDB 캐시는 플러
시되지 않기 때문에), 이것은 염려할 사항이 되지 않는데, 왜냐하면 InnoDB는 이것을 스타트업 시점에 해석을 하고 일관된 값을 전달하기 때문이다. 이것은 InnoDB가 이 스냅샷에서 시
작될 때 아무런 충돌 없이 크래시 복구(crash recovery)를 수행할 수 있다는 것을 의미한다. 하지만, InnoDB 테이블의 스냅샷을 일관성 있게 유지하는 동안 MySQL 서버를 종료할 수
는 없다.
여러분이 FLUSH TABLES 명령문을 입력하는 클라이언트를 구동 상태로 두어서 읽기 잠금이 계속 유지되도록 한다. (만일 클라이언트를 종료하면, 읽기 잠금은 해제되어 버린다.) 그
런 다음에 마스터 서버에 있는 데이터의 스냅샷을 한다.
스냅샷을 생성하는 가장 쉬운 방법은 마스터 데이터 디렉토리에 있는 데이터 베이스의 바이너리 백업을 만드는 아카이빙(archiving) 프로그램을 사용하는 것이다. 예를 들면, 유닉스에
서는 tar, 또는 윈도우에서는 PowerArchiver, WinRAR, WinZip등과 유사한 소프트웨어를 사용하는 것이다. 모든 데이터 베이스를 포함하고 있는 아카이브를 만들기 위한 tar를 사용하
기 위해서는, 마스터 서버의 데이터 디렉토리로 이동을 한 다음에, 아래의 명령어를 실행한다:
만일If you want the archive to include only a database called this_db라는 이름의 데이터 베이스만 아카이브에 포함시키고자 한다면, 아래의 명령어를 사용한다:
그런 다음에 슬레이브 서버 호스트에 있는 /tmp 디렉토리로 아카이브 파일을 복사한다. 슬레이브 호스트에서, 데이터 디렉토리로 위치를 변경한 다음에, 아래의 명령어를 사용해서 아카
이브 파일을 푼다:
만약에 슬레이브 서버가 마스터에 있는 사용자 계정 셋과 다른 것을 가지고 있다면, 여러분은 mysql 데이터 베이스를 복제하고 싶지 않을 수도 있을 것이다. 이와 같은 경우, 여러분은 아
카이브에서 이것을 제외 시킨다. 또한 아카이브에 로그 파일, master.info 또는 relay-log.info 파일을 포함시키고 싶지 않을 수도 있을 것이다.
FLUSH TABLES WITH READ LOCK에 의한 읽기 잠금이 효력을 가지고 있는 동안에는, 마스터 서버에 있는 오프셋과 현 바이너리 로그 이름 값을 읽는다:
+---------------+----------+--------------+------------------+
+---------------+----------+--------------+------------------+
+---------------+----------+--------------+------------------+
File 컬럼은 로그의 이름을 보여주며 Position은 파일 안에 있는 오프셋(offset)을 보여준다. 이 예제에서 보면, 바이너리 로그 파일은 mysql-bin.003이며 오프셋은 73이 된다. 이 값들
을 기록해 둔다. 여러분이 슬레이브를 설정할 때 이 값들이 필요하게 된다. 이 값들은 슬레이브가 마스터에서 새로운 업데이트를 진행할 때의 리플리케이션의 위치를 표시한다.
만일 바이너리 로깅이 활성화 되기 전에 마스터가 구동이 되었다면, SHOW MASTER STATUS 또는 mysqldump --master-data가 출력하는 로그 이름과 위치 값은 비어 있게 된
다. 그와 같은 경우, 여러분이 나중에 슬레이브의 로그 파일과 위치를 지정할 때 사용하는 값들은 빈 스트링 ('') 및 4가 된다.
여러분이 스냅샷을 만들고 로그 이름과 오프셋을 가진 후에는, 마스터 서버상에서 쓰기를 다시 활성화 시킬 수가 있게 된다:
여러분이 InnoDB 테이블을 사용할 경우, 가장 좋은 방법은 InnoDB Hot Backup 툴을 사용하는 것인데, 이것은 마스터 서버상에서 어떠한 잠금도 하지 않은 채 일관된 스냅샷을 만들 수
가 있으며, 나중에 슬레이브에서 사용될 스냅샷에 대응하는 로그 이름과 오프셋을 기록할 수가 있게 된다. Hot Backup은 유료(non-free) 툴이며 표준 MySQL 배포판에는 포함되어 있
지 않다. InnoDB Hot Backup의 홈페이지에서 보다 자세한 내용을 참조하기 바란다. http://www.innodb.com/manual.php
Hot Backup 툴을 사용하지 않는 상태에서, InnoDB 테이블의 바이너리 스냅샷을 만드는 가장 빠른 방법은 마스터 서버를 셧 다운 한 다음에 InnoDB 데이터 파일, 로그 파일, 그리고 테
이블 포맷 파일 (.frm 파일)을 복사하는 것이다. 현 로그 파일과 오프셋을 기록하기 위해서는, 서버를 셧 다운하기 전에 아래의 명령문을 실행한다:
이렇게 하면 SHOW MASTER STATUS의 결과로 위에서 본 것과 같은 로그 이름과 오프셋을 얻을 수가 있게 된다. 로그 이름과 오프셋을 기록한 다음에, 서버가 현 로그 파일과 오프셋
에 대응하는 스냅샷을 가지고 종료하도록 하기 위해 테이블을 잠그지 않는 상태로 서버 셧 다운을 한다:
An alternative that works for both MyISAM 과 InnoDB 테이블 양쪽 모두에서 실행시킬 수 있는 다른 방법으로는 위에서 설명한 대로 바이너리를 복사하는 것 대신에 마스터 서버의
SQL 덤프를 하는 것이다. 이렇게 하기 위해서는, 마스터 상에서 mysqldump --master-data 를 사용하고 나중에 슬레이브로 SQL 덤프를 로드한다. 하지만, 이것은 바이너리 복사보
다는 실행 속도가 느리다.
5. 마스터 호스트에 있는 my.cnf 파일의 [mysqld] 섹션이 log-bin 옵션을 가지도록 한다. 이 섹션은 또한 server-id=master_id 옵션도 가지고 있어야 하며, master_id는 1 에서
232 – 1 사이의 양수 정수 값을 가져야 한다. 예를 들면 :
6. [mysqld]
7. log-bin=mysql-bin
8. server-id=1
만약에 이러한 옵션들이 존재하지 않으면, 이것들을 추가하고 서버를 다시 구동 시킨다. 서버는 바이너리 로깅이 활성화 되기 전 까지는 리플리케이션 서버 역할을 하지 못한다.
Note: 트랜젝션과 함께 For the greatest possible durability and consistency in a replication setup using InnoDB를 사용하는 리플리케이션 설정에서 일관성을 가장 확실하게 유
지하기 위해서는, 마스터 서버의 my.cnf 파일에 innodb_flush_log_at_trx_commit=1, sync_binlog=1, 그리고, MySQL 5.0.3 이전 버전의 경우에는, innodb_safe_binlog를 설정한
다.. (5.0.3 이후 버전에서는 innodb_safe_binlog가 필요 없게 된다.)
10. [mysqld]
11. server-id=slave_id
slave_id 값은, master_id 값과 비슷하게, 1 에서 232 – 1 사이의 양수 정수 값을 가져야 한다. 또한, 슬레이브의 ID는 마스터의 ID와 서로 달라야 한다. 예를 들면:
[mysqld]
server-id=2
만일 여러분이 여러 대의 슬레이브를 설정한다면, 각각의 슬레이브는 반드시 마스터 서버 및 다른 슬레이브와는 틀린 고유의 server-id 값을 가져야 한다. server-id 값을 IP 주소 값
과 유사하게 생각하면 된다: 이러한 ID는 리플리케이션 파트너 집단에서 각 서버의 인스턴스를 개별적으로 구분해 준다.
만일 여러분이 server-id 값을 지정하지 않으면, 정의된 master-host가 있으면 2로 설정되고, 없으면 1로 설정된다. server-id를 생략하게 되면, 마스터는 모든 슬레이브에서 오는 접
속을 거절하게 된다는 점을 알아두자. 따라서, server-id는 바이너리 로그를 사용하는 백업일 경우에만 생략하는 것이 좋다.
12. 만약에 마스터 서버의 데이터에 대해 바이너리 백업을 만들었다면, 슬레이브를 시작하기 전에 그것을 슬레이브 서버의 데이터 디렉토리에 복사를 해 둔다. 그 파일과 디렉토리에 대
한 권한이 올바르게 되어 있는지를 확인한다. 여러분이 슬레이브 서버를 구동 시키기 위해 사용하는 시스템 계정은 마스터에서와 마찬가지로 그 파일에 대해 읽기와 쓰기가 가능하도록
해 두어야 한다.
만약에 여러분이 mysqldump를 사용해서 백업을 만들었다면, 슬레이브를 먼저 시작한다. 그런 다음에 나중에 덤프 파일을 로드한다.
13. 슬레이브 서버를 시작한다. 만일 이 서버가 이전에 복제(replicating)을 했었다면, 이 서버가 마스터 서버에 곧장 접속을 시도하지 못하도록 --skip-slave-start 옵션을 사용해
서 시작을 한다. 여러분은 또한 문제(예를 들면, 네트워크 또는 접속 문제)에 대한 정보를 에러 로그에서 더 많이 얻기 위해서 --log-warnings 옵션을 사용해서 슬레이브를 시작할 수
도 있다. 이 옵션은 디폴트로 활성화 되어 있으나, 그 값이 1보다 크지 않으면 이미 종료된 접속은 에러 로그에 로그할 수가 없게 된다.
14. 만일 mysqldump를 사용해서 마스터 서버의 데이터를 백업했다면, 이 덤프 파일을 슬레이브 서버로 로드한다:
16. 아래의 명령문을 슬레이브 서버에서 실행하되, 옵션 값은 여러분의 시스템과 관련된 실제 값을 넣는다:
MASTER_HOST 60
제목검색
상위메뉴리스트 ◆
6.5. MySQL 버전간의 리플리케이션 호환성
6. 리플리케이션
MySQL 5.0에서 구현된 바이너리 로그 포맷은 이전 버전에서 구현된 포맷과는 매우 큰 차이가 있다. 주된 변화는 MySQL 5.0.3
6.5. MySQL 버전간의 리플리케이션 호환성
(문자 셋과 LOAD DATA INFILE 처리에 대한 개선)과 5.0.4 (타임존 처리에 대한 개선)에서 구현 되었다.
6.5 MySQL 버전간의 리플리케이션 호환성
리플리케이션의 기능들은 계속 진보를 하고 있기 때문에, 가능하면 가장 최신의 MySQL 버전을 사용할 것을 권장한다. 또한, 마스
터와 슬레이브는 동일한 버전을 사용하도록 한다. 알파 또는 베타 버전을 구동하고 있는 마스터 및 슬레이브는 새로운 제품 버전을
사용하도록 권장한다. 5.0.3 마스터에서 5.0.2 슬레이브로의 리플리케이션은 실패하게 된다; 5.0.4 마스터에서 5.0.3 슬레이브로
의 리플리케이션도 역시 실패를 하게 된다. 일반적으로, MySQL 5.0.x를 구동하고 있는 슬레이브는 이것보다 이전의 버전을 사용
하고 있는 마스터와는 리플리케이션을 할 수가 있지만 (MySQL 3.23, 4.0, 또는 4.1을 구동한다고 하더라도), 그 반대의 경우는 동
작이 되지 않는다.
Note: 슬레이브 보다 신형 버전의 바이너리 로그를 사용하는 마스터에서 슬레이브로 복제를 할 수는 없다 (예를 들면, MySQL
5.0 에서MySQL 4.1로). 이것은 Section 6.6, “리플리케이션 설정 업그레이드 하기”에서 설명을 하는 것처럼, 리플리케이션 서
버에 대해 중요한 의미를 가지게 된다.
위에서 나온 정보는 프로토콜 레벨에서의 리플리케이션 호환성과 관련이 있다. 하지만, SQL-레벨 호환성 이슈와 같은 다른 제한
사항도 존재할 수 있다. 예를 들면, 복제된 명령문(replicated statements)이 4.1에서는 사용할 수 없고 5.0에서만 사용 가능한
SQL 특성을 사용한다면, 5.0 마스터는 4.1 슬레이브에 복제를 할 수 없게 된다. Section 6.7, “리플리케이션 기능들과 알려져 있
는 문제점들”에서 다른 이슈 사항들을 참조한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=6&mcate=5&scate=0&idx=15502006-08-08 오후 5:54:58
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
6.6. 리플리케이션 설정 업그레이드 하기
6. 리플리케이션 6.6.1. 5.0으로 리플리케이션 업그레이드 하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=6&mcate=6&scate=0&idx=15512006-08-08 오후 5:55:07
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
6.6.1. 5.0으로 리플리케이션 업그레이드 하기
6. 리플리케이션
이 섹션은 MySQL 3.23, 4.0, 또는 4.1을 MySQL 5.0으로 리플리케이션 업그레이드 하는 것에 대해 설명을 한다. 이때 4.0는
6.6. 리플리케이션 설정 업그레이드 하기
4.0.3 또는 그 이후 버전이어야 한다.
6.6.1 5.0으로 리플리케이션 업그레이드 하기
여러분이 마스터를 5.0 보다 이전 버전에서 5.0으로 업그레이드를 할 때에는, 우선 이 마스터의 모든 슬레이브가 동일한 5.x 시리
즈를 사용하고 있는지를 확인해야 한다. 만일 그렇지 않은 경우에는, 우선 슬레이브를 업그레이드 한다. 각 슬레이브를 업그레이드
하기 위해서는, 슬레이브를 셧 다운 시키고, 5.0.x 버전으로 업그레이드를 하고, 재 시작하고, 리플리케이션을 재 시작한다. 5.0 슬
레이브는 업그레이드를 하기 위해 이전에 작성된 릴레이 로그를 읽고 그 안에 있는 명령문을 실행한다. 업그레이드를 한 후에 슬레
이브가 실행하는 릴레이 로그는 5.0 포맷을 가지게 된다.
슬레이브를 업그레이드 한 후에, 마스터를 셧 다운 시키고, 슬레이브와 동일한 5.0.x버전으로 업그레이드를 하고, 재 시작을 한다.
5.0 마스터는 이전에 작성된 바이너리 로그를 읽을 수 있게 되고 이것들을 5.0 슬레이브에 보낼 수 있게 된다. 슬레이브는 구형 포
맷을 인식하고 올바르게 처리를 한다. 업그레이드 후에 마스터가 생성한 바이너리 로그는 5.0 포맷으로 된다. 이것 역시 5.0 슬레이
브가 인식을 한다.
다른 말로 표현하면, 여러분이 마스터를 5.0으로 업그레이드 하기 전에 슬레이브가 먼저 5.0으로 업그레이드 되어야 한다는 점을
제외하고는, 5.0으로 업그레이드를 하는 데 있어서 주의할 사항은 없다. 5.0에서 이전 버전으로 다운 그레이드하는 것은 간단하지
가 않다는 점을 알아두자: 여러분이 다운그레이드를 진행하기 전에 삭제를 할 수 있도록 하기 위해, 모든 5.0 바이너리 로그 또는
릴레이 로그가 완벽하게 실행 되었음을 확인해야 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=6&mcate=6&scate=1&idx=15522006-08-08 오후 5:55:12
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
6.7. 리플리케이션 기능들과 알려져 있는 문제점들
6. 리플리케이션
일반적으로, SQL 레벨에서의 리플리케이션 호환성은 마스터 서버와 슬레이브 서버 모두가 지원하는 기능을 모두 사용할 수 있어
6.7. 리플리케이션 기능들과 알려져 있는 문제
야 한다. 만일 주어진 버전 이후에만 사용 가능한 기능만을 서버에서 사용한다면, 여러분은 그 버전 이전의 슬레이브에는 리플리케
점들
이션을 진행할 수가 없게 된다. 이러한 비호환성은 시리즈와 시리즈 사이에서도 일어날 수 있는데, 예를 들면, MySQL 5.0에서 4.1
6.7 리플리케이션 기능들과 알려져 있는 문제점들
로의 복제는 실행할 수가 없다. 하지만, 이러한 비 호환성은 한 시리즈 내부의 버전 사이에서도 일어날 수가 있다. 예를 들면,
SLEEP() 함수는 MySQL 5.0.12 및 그 이후 버전에서 구현된다. 만약에 여러분이 마스터 서버에서 이 함수를 사용한다면,
5.0.12 보다 이전 버전을 사용하고 있는 슬레이브 서버에는 복제(replicate)를 할 수가 없게 된다.
만약에 5.0과 이전 버전 사이에 리플리케이션을 할 계획이라면, 그 버전의 리플리케이션 특성에 대한 정보를 제공하는 MySQL 레
퍼런스 매뉴얼을 참고해야 한다.
아래의 리스트는 지원되는 것과 지원되지 않는 것에 대해 자세히 설명을 하고 있다. 리플리케이션에 대한 추가적인 InnoDB-관련
정보는 Section 14.2.6.5, “InnoDB 와 MySQL 리플리케이션”에 나와 있다.
스토어드 루틴과 트리거에 대한 리플리케이션 이슈는 Section 17.4, “스토어드 루틴과 트리거에 대한 바이너리 로깅”에서 설명
하고 있다.
• 알려진 이슈: MySQL 5.0.17에서, CREATE TRIGGER에 대한 신텍스는 트리거 호출 시점에 검사해야 할 접근 권
한을 지정하기 위한 DEFINER 구문을 포함하기 위해 변경 되었다. (Section 18.1, “CREATE TRIGGER 신텍스”를
참고할 것.) 하지만, 만일 여러분이 MySQL 5.0.17 보다 이전 버전의 마스터 서버에서 MySQL 5.0.17 또는 그 이상의 슬
레이브로 복제(replicate)를 시도한다면, CREATE TRIGGER 명령문에 대한 리플리케이션은 Definer not fully
qualified 에러와 함께 실패를 하게 된다. 하나의 해결책은 각 CREATE TRIGGER 명령문에 포함되어 있는(embedded)
버전-관련 명령어를 사용해서 마스터에서 트리거를 생성하는 것이다:
이런 방식으로 작성된 CREATE TRIGGER 명령문은 새로운 버전의 슬레이브로 복제가 되는데, 이 슬레이브는 코멘트에
서 DEFINER 구문을 가져와서 성공적으로 실행을 한다.
• USER(), UUID(), 그리고 LOAD_FILE() 함수는 변경 없이 복제가 되기 때문에 슬레이브에서는 정확히 실행되지
않는다.
• mysql 데이터 베이스가 복제되는 경우에만 사용자 권한은 복제된다. 즉, GRANT, REVOKE, SET PASSWORD,
CREATE USER, 그리고 DROP USER 명령문은 리플리케이션 설정이 mysql 데이터 베이스를 포함하고 있을 경우에만
슬레이브에서 효력을 나타낸다.
만일 여러분이 모든 데이터 베이스를 복제 하지만, 복제될 사용자 권한에 영향을 주는 명령문은 제외 시키고 싶다면, --
replicate-wild-ignore-table=mysql.% 옵션을 사용해서 mysql 데이터 베이스를 복제하지 못하도록 슬레이브를 설정
한다. 슬레이브는 입력한 권한-관련 SQL 명령문이 효력이 없다는 것을 인식할 것이며, 따라서 그러한 명령문을 실행하
지 않게 된다.
• MySQL 5.0.3 (마스터와 슬레이브) 이후로는, 마스터와 슬레이브가 서로 다른 글로벌 문자 셋 변수를 가지고 있다
고 하더라도 리플리케이션은 잘 실행된다. MySQL 5.0.4 (마스터 및 슬레이브) 이후로는, 마스터와 슬레이브가 서로 다
른 글로벌 타임존 변수를 가지고 있다고 하더라도, 리플리케이션은 잘 실행된다.
1. 만일 마스터가 MySQL 4.1를 사용한다면, 슬레이브에서 구동되는 MySQL 버전과는 상관 없이, 마스터와
슬레이브에서 항상 동일한 글로벌 문자 셋과 콜레션(collation)을 사용해야만 한다. (이것들은 --character-
set-server 와 --collation-server 옵션이 제어를 한다.) 그렇지 않으면, 여러분은 슬레이브에서 복제 키 에러
(duplicate-key error)를 가지게 되는데, 그 이유는 마스터 문자 셋에서 고유의 값을 가지는 키가 슬레이브 문
• 만일 마스터가 MySQL 4.1를 사용한다면, 동일한 타임 존이 마스터와 슬레이브 모두에 설정되어야 한다. 그렇지 않
으면, NOW() 또는 FROM_UNIXTIME() 함수 등을 사용하는 명령문 같은 것들이 올바르게 복제되지 않게 된다. 여러분
은 mysqld_safe 스크립트의 --timezone=timezone_name 옵션을 사용하거나 또는 TZ 환경 변수를 설정함으로써
MySQL 서버가 구동하는 타임 존을 설정할 수가 있다. 마스터 및 슬레이브 모두는 또한 동일한 디폴트 접속 타임 존 설정
을 가지고 있어야 한다; 즉, --default-time-zone 파라미터는 마스터와 슬레이브에 모두에 대해 동일한 값을 가지고 있
어야 한다. 마스터가 5.0 이상의 버전을 사용한다면, 이러한 사항들은 필요가 없게 된다.
• 세션 변수들이 테이블을 업데이트하는 명령문에서 사용될 경우에는 올바르게 복제되지 않는다. 예를 들면, INSERT
INTO mytable VALUES(@@MAX_JOIN_SIZE)가 뒤에 따르는 SET MAX_JOIN_SIZE=1000는 마스터와 슬레이브
에 동일한 데이터를 삽입할 수가 없게 된다. 이것은 INSERT INTO mytable VALUES(CONVERT_TZ(...,...,
@@time_zone))가 뒤 따라 나오는 일반적인 SET TIME_ZONE=... 시퀀스에는 적용이 되지 않는데, 이것은 5.0.4 이후
에는 올바르게 복제가 된다.
것은 가능하다. 예를 들면, 여러분은 InnoDB 마스터 테이블을 MyISAM 슬레이브 테이블처럼 복제할 수가 있다. 하지만,
여러분이 이런 일을 실행한다면, 슬레이브가 BEGIN 블록을 실행하면서 슬레이브가 재 시작하기 때문에 BEGIN/
COMMIT 블록 실행 중간에 슬레이브가 멈추게 되는 경우에는 문제가 발생하게 된다.
• 사용자 정의 변수(즉 @var_name 형태의 변수)를 참조하는 명령문의 업데이트는 MySQL 5.0에서는 올바르게 복제
된다. 하지만, 4.1 이전 버전에서는 그렇지가 않다. 사용자 변수의 이름은 5.0에서부터는 대소 문자를 구분하지 않는다는
점을 알아두자. 여러분은 MySQL 5.0과 이전 버전간의 리플리케이션을 설정할 때에는 이점을 고려해야 한다.
• 만일 DATA DIRECTORY 또는 INDEX DIRECTORY 테이블 옵션이 마스터 서버의 CREATE TABLE 명령문에
서 사용된다면, 그 테이블 옵션은 슬레이브에서도 사용되게 된다. 이것은 슬레이브 호스트 파일 시스템에 대응하는 디렉토
리가 없거나 또는 존재는 하지만 슬레이브 서버가 접근을 할 수 없는 경우에는 문제의 원인이 된다. MySQL은
NO_DIR_IN_CREATE라고 불리는 sql_mode 옵션을 지원한다. 만일 슬레이브 서버가 SQL 모드가 활성화 된 상태로 구
동을 한다면, 슬레이브는 CREATE TABLE 명령문을 복제할 때 DATA DIRECTORY 와 INDEX DIRECTORY 테이블
옵션을 무시해 버린다. 그 결과로 MyISAM 데이터와 인덱스 파일이 테이블의 데이터 베이스 디렉토리에 생성된다.
• 아래의 사항은 마스터 또는 슬레이브 중의 하나라도 MySQL 5.0.3 또는 그 이전 버전을 사용하는 경우에만 적용된
다: 만일 마스터에서 LOAD DATA INFILE이 인터럽트가 된다면 (integrity constraint violation, killed connection,
등등), 슬레이브는 LOAD DATA INFILE 전체를 건너 띈다(skip). 이것은 만일 이 명령어가 인터럽트를 당하기 전에 테
이블 레코드를 영구적으로 삽입하거나 또는 업데이트 했다면, 이러한 수정 사항은 슬레이브에 복제되지 않는다.
• 몇몇 FLUSH 명령문들은 슬레이브에 복제되면 문제를 일으키기 때문에 로그되지 않는다: FLUSH LOGS, FLUSH
MASTER, FLUSH SLAVE, 그리고 FLUSH TABLES WITH READ LOCK. 신텍스 예제에 관련되어서는
Section 13.5.5.2, “FLUSH 신텍스”를 참조할 것. FLUSH TABLES, ANALYZE TABLE, OPTIMIZE TABLE, 그리
고 REPAIR TABLE 명령문은 바이너리 로그에 쓰여지며 따라서 슬레이브에 복제가 된다. 이것은 일반적인 경우에 문제
를 발생시키지 않는데, 그 이유는 이 명령문들은 테이블 데이터를 수정하지 않기 때문이다. 하지만, 특정 환경 아래에서는
심각한 문제를 야기할 수 있다. 만일 여러분이 mysql 데이터 베이스에 있는 권한 테이블을 복제하고 GRANT를 사용하지
않고 직접 그 테이블들을 업데이트 한다면, 슬레이스에서 FLUSH PRIVILEGES를 입력하여 새로운 권한이 효과를 나타
내도록 해야 한다. 또한, 만일 여러분이 MERGE 테이블의 일부분인 MyISAM 테이블의 이름을 변경할 때 FLUSH
TABLES를 사용한다면, 반드시 슬레이브에서 FLUSH TABLES을 수동으로 입력해야 한다. 이러한 명령문들은 여러분
이 NO_WRITE_TO_BINLOG 또는 이것의 별칭인 LOCAL을 지정하지 않는 한 바이너리 로그에 쓰여지게 된다.
• MySQL은 하나의 마스터와 여러 개의 슬레이브만을 지원한다. 향후에는, 현 마스터에 문제가 생길 경우에 마스터를
자동으로 변경하는 투표 알고리즘(voting algorithm)을 추가할 계획이다. 또한, SELECT 쿼리를 서로 다른 슬레이브에
보내줌으로써 로드 밸런싱(load balancing)을 도와주는 에이전트 프로세스를 추가할 계획도 있다.
• 서버를 셧 다운하고 다시 시작을 할 때에는, 서버의 MEMORY (HEAP) 테이블은 비어 진다. 마스터는 이러한 결과
를 아래와 같이 슬레이브에 복제한다: 스타트업 후에 마스터 서버가 각 MEMORY 테이블을 처음으로 사용할 때, 서버는
DELETE 명령문을 사용해서 비워져야 할 필요가 있는 테이블을 슬레이브에게 통보하는 이벤트를 기록한다. 보다 자세한
정보는 Section 14.4, “MEMORY (HEAP) 스토리지 엔진”을 참조할 것.
• 별칭(alias)을 사용하는 다중-테이블 DELETE 명령문의 신텍스는 MySQL 4.0 과 4.1 사이에 변경 되었다.
MySQL 4.0에서는, 삭제되어야 할 열을 가지고 있는 모든 테이블을 참조하기 위해서는 실제 테이블 이름(true table
name)을 사용해야 한다:
만일 여러분이 위와 같은 DELETE 명령문을 사용한다면, 신텍스 안에서의 변경은 4.0 마스터는 4.1 (또는 그 이상 버전)
슬레이브에 복제할 수 없다는 의미를 가진다.
하지만, 여러분의 클라이언트 코드가 서로 다른 서버상에서 서로 다른 시퀀스 안에서 발생되는 업데이트 중에 일어날 수
있는 잠재적인 문제에 대해 주의 깊게 작성되지 않았다면, 대부분의 명령문은 올바르게 동작을 하지 않게 된다.
서버 ID는 바이너리 로그 이벤트에 기록(encoded)되며, 따라서 서버 A는 자신이 만든 이벤트를 읽기는 하지만 실행을 하
지 않은 시점을 알게 된다 (서버 A 가 --replicate-same-server-id 옵션을 가지고 실행되지 않은 한, 하지만 대부분
의 경우에는 의미가 없다). 따라서, 무한 루프(infinite loop)는 존재하지 않는다. 이러한 순환 설정(circular setup) 형태
는 여러분이 테이블간의 충돌이 없이 업데이트를 수행하는 경우에만 동작을 하게 된다. 다른 말로 표현하면, 만일 A와 C
에 모두 데이터를 삽입할 경우, 여러분은 C에 삽입되는 열과 충돌을 하는 키를 가지고 있는 A의 열에는 데이터를 절대로
삽입할 수가 없게 된다. 또한 적용되는 업데이트가 순서가 중요한 사항일 경우 두 개의 서버에 동일한 데이터를 업데이트
할 수가 없게 된다.
• 슬레이브에 있는 명령문이 에러를 발생시킨다면, 슬레이브의 SQL 쓰레드는 종료를 하게 되며, 슬레이브는 자신의 에
러 로그에 메시지를 작성한다. 그렇게 되면, 여러분은 슬레이브에 수동으로 접속을 해서 문제의 원인이 무엇인지를 파악해
야 한다. (SHOW SLAVE STATUS는 이런 상황에서 유용하게 사용할 수 있다.) 그런 다음에 문제를 수정하고 (예를 들
면, 여러분들은 실제 존재하지 않는(non-existent)테이블을 만들 필요가 있을 것이다) START SLAVE를 구동시킨다.
Note: --innodb-safe-binlog는 XA 트랜젝션 지원이 MySQL 5.0.3에 포함되었기 때문에 불필요하게 되었다.
• MyISAM 테이블의 논-트랜젝션 특성으로 인해, 테이블을 부분적으로 업데이트하면 에러 코드를 발생시키는 명령문
을 가지는 것이 가능하다. 예를 들면, 다중-열 삽입에서 키 제약을 위반하는 열을 가지거나, 또는 열 중에 몇 개를 업데이
트 한 후에 기다란 업데이트 명령문을 죽이게 될 경우에 이런 일이 생길 수 있다. 만일 마스터에서 이런 일이 발생한다면,
에러 코드가 유효하고 그리고 명령문 실행으로 인해 동일한 에러 코드가 슬레이브에도 기록이 되지 않는 한 슬레이브 쓰레
드는 종료를 하게 되고 데이터 베이스 관리자의 조정을 기다리게 된다. 만일 에러 코드 검증 행위를 원하지 않을 경우에
는, 몇몇 또는 모든 에러를 무시하도록 --slave-skip-errors 옵션을 사용할 수가 있다.
제목검색
상위메뉴리스트 ◆
6.8. 리플리케이션 스타트업 옵션들
6. 리플리케이션
이 섹션에서는 여러분이 슬레이브 리플리케이션 서버에서 사용할 수 있는 옵션들에 대해 설명하기로 한다. 이 옵션들은 명령어 라
6.8. 리플리케이션 스타트업 옵션들
인 또는 옵션 파일에서 지정할 수 있다.
6.8 리플리케이션 스타트업 옵션들
마스터와 각 슬레이브에서, 여러분은 고유의 리플리케이션 ID를 설정하기 위해서 반드시 server-id 옵션을 사용해야 한다. 각 서
버의 경우, 여러분은 1 에서 232 – 1 사이의 양수 정수 중의 고유 값을 사용해야 하고 각 ID는 반드시 다른 ID와 구분이 되어야 한
다. 예: server-id=3
바이너리 로깅을 제어하기 위해 마스터에서 사용할 수 있는 옵션들은 Section 5.12.3, “바이너리 로그”에서 설명을 한다.
어떤 슬레이브 리플리케이션 옵션들은 슬레이브가 그 옵션 값을 가지고 시작될 때 master.info 파일이 존재한다면 무시가 되는 것
과 같은 형태로 특별히 취급되는 것들이 있다. 아래의 옵션들이 이런 방식으로 처리된다:
• --master-host
• --master-user
• --master-password
• --master-port
• --master-connect-retry
• --master-ssl
• --master-ssl-ca
• --master-ssl-capath
• --master-ssl-cert
• --master-ssl-cipher
• --master-ssl-key
MySQL 5.0의 master.info 파일 포맷은 SSL 옵션과 상응되는 값을 가진다. 또한, 이 파일 포맷은 자신의 첫 라인에 파일의 전체
라인 수를 가진다. 만일 구형의 서버(4.1.1 이전 버전)를 새로운 버전으로 업그레이드 한다면, 새로운 서버는 시작이 될 때 자동으
로 master.info 파일을 새로운 포맷으로 업그레이드 시킨다. 하지만, 만일 여러분이 새 버전에서 구형 버전으로 다운그레이드를 할
경우에는, 구형 버전의 서버를 맨 처음 시작하기 전에 수동으로 처음 라인을 제거해야 한다.
슬레이브 서버가 시작될 때 master.info 파일이 존재하지 않는다면, 슬레이브는 옵션 파일 또는 명령어 라인에서 지정한 옵션에 대
한 값을 사용한다. 여러분이 서버를 맨 처음 리플리케이션 서버로 구동 시킬 때, 또는 RESET SLAVE를 구동 시킨 후에 슬레이브
를 셧 다운하고 다시 시작할 때 이런 일이 일어나게 된다.
만일 master.info 파일이 슬레이브 서버를 시작할 때 존재한다면, 서버는 이 파일의 내용을 사용하게 되며 파일에 올라와 있는 값
에 대응되는 어떤 옵션들도 무시를 하게 된다. 따라서, 만일 여러분이 master.info 파일에 있는 값에 대응되는 스타트업 옵션의 값
과는 다른 것을 사용해서 슬레이브 서버를 시작한다면, 다르게 적용된 값은 무시가 되는데, 그 이유는 서버는 계속해서 master.
info 파일의 값을 사용하기 때문이다. 다른 값을 사용하기 위해서는, 반드시 master.info 파일을 제거한 다음에 재 시작을 하거나
또는 슬레이브가 구동하고 있는 동안에 그 값을 리셋하기 위한 CHANGE MASTER TO 명령문을 사용해서 재 시작을 하도록 한
다 (흔히 사용됨).
[mysqld]
master-host=some_host
서버를 리플리케이션 슬레이브로 처음 구동을 할 때, 서버는 my.cnf 파일에서 그 옵션을 읽어서 사용한다. 그런 후에, 서버는 그 값
을 master.info 파일에 기록한다. 다음 번에 서버를 구동할 때에는, 서버는 master.info 파일에서만 마스터 호스트 값을 읽게 되고
옵션 파일에 있는 값을 무시를 한다. 만일 여러분이 some_other_host의 마스터 호스트를 달리 지정하기 위해my.cnf 파일을 수정
한다고 하더라도, 변경 내용은 효과를 나타내지 못한다. 대신에 여러분은 CHANGE MASTER TO를 사용해야 한다.
위에서 설명하였듯이, 서버는 스타트업 옵션이 아닌 존재하고 있는 master.info 파일에 우선권을 주기 때문에, 이 값들에 대해 스타
트업 옵션을 전혀 먼저 사용할 수 없게 되므로, CHANGE MASTER TO 명령문을 사용해서 이 값들을 대신 지정하도록 한다.
아래의 예문은 슬레이브 서버를 구성하기 위해 스타트업 옵션을 보다 광범위하게 사용하는 방법을 보여주는 것이다:
[mysqld]
server-id=2
master-host=db-master.mycompany.com
master-port=3306
master-user=pertinax
master-password=freitag
master-connect-retry=60
report-host=db-slave.mycompany.com
아래의 리스트는 리플리케이션을 제어하기 위한 스타트업 옵션을 설명하는 것이다. 이 옵션들 중의 많은 것들은 서버가 구동되고
있는 동안 CHANGE MASTER TO 명령문을 사용해서 리셋 시킬 수가 있다. --replicate-* 옵션과 같은 것들은 슬레이브 서버
가 시작될 때에만 설정될 수 있다.
• --log-slave-updates
일반적으로, 슬레이브는 마스터 서버에서 전달 받은 업데이트에 대해서는 자신의 바이너리 로그에 전혀 로그를 하지 못한
다. 이 옵션은 SQL 쓰레드가 실행한 업데이트를 자신의 바이너리 로그에 로그 하도록 만든다. 이 옵션이 효력을 갖기 위해
서는, 슬레이브는 바이너리 로깅을 활성화 시키기 위한 --log-bin 옵션과 함께 시작되어야 한다. --log-slave-
updates 는 여러분이 리플리케이션 서버를 서로 연결(chain)하고자 할 때 사용된다. 예를 들면, 아래와 같은 배열을 사용
해서 리플리케이션 서버를 설정하고자 할 것이다:
A -> B -> C
여기에서, A는 슬레이브B에 대한 마스터의 역할을 하며, B는 슬레이브 C에 대해 마스터 역할을 한다. 이렇게 동작하기 위
해서는, B는 반드시 마스터인 동시에 슬레이브가 되어야 한다. 여러분은 바이너리 로깅을 활성화 시키기 위해 A와 B 모두
에서 --log-bin옵션을 실행해야 하고, A에서 받은 업데이트를 B가 자신의 바이너리 로그에 로그할 수 있도록 B는 --
log-slave-updates 옵션을 실행해야 한다.
• --log-warnings
이 옵션은 에러 로그에 보다 자세한 메시지를 기록하게끔 만든다. 리플리케이션 관점에서 보면, 서버는 네트워크/접속 실
패 후에 지속적으로 접속을 다시 시도하는 경고문을 만들게 되며, 각각의 슬레이브가 어떻게 시작되는지에 대한 정보를 여
러분에게 알려 준다. 이 옵션은 디폴트로 활성화 된다; 이것을 비활성화 시키기 위해서는, --skip-log-warnings를 사
용한다. 단절된 접속은 이 값이 1보다 크지 않는 한 에러 로그에 로그 되지 않는다.
• --master-connect-retry=seconds
마스터가 다운(down)되거나 또는 접속이 끊어지는 경우에, 마스터에 재 접속을 시도하기 전에 슬레이브 쓰레드가 슬립
(sleep)되는 시간. master.info 파일에 있는 값이 우선권을 가진다. 설정되지 않으면, 디폴트는 60이 된다.
• --master-host=host_name
마스터 리플리케이션 서버의 호스트 이름 또는 IP 번호. master.info에 있는 값이 우선권을 갖는다. 마스터 호스트가 지정
되지 않으면, 슬레이브 쓰레드는 시작되지 않는다.
• --master-info-file=file_name
슬레이브가 마스터에 대한 정보를 기록하기 위해 사용하는 파일의 이름. 디폴트는 데이터 디렉토리에 있는 mysql.info이
된다.
• --master-password=password
슬레이브가 마스터에 접속을 할 때 슬레이브 쓰레드가 인증용으로 사용하는 계정의 패스워드. master.info 파일에 있는
값이 우선권을 가지게 된다. 설정이 되어 있지 않으면, 패스워드가 비어 있다고 간주된다.
• --master-port=port_number
• --master-retry-count=count
이 옵션은 SSL을 사용하여 마스터 서버에 보안 리플리케이션 접속을 설정하기 위해 사용된다. 각각의 의미는
Section 5.9.7.5, “SSL 명령어 옵션”에서 설명하고 있는 --ssl, --ssl-ca, --ssl-capath, --ssl-cert, --ssl-
cipher, --ssl-key 옵션들과 같다. master.info 파일에 있는 값들이 우선권이 있다.
• --master-user=user_name
슬레이브가 서버에 접속을 할 때 슬레이브 쓰레드가 인증을 위해 사용하는 계정의 사용자 이름. 이 계정은 반드시
REPLICATION SLAVE 권한을 가지고 있어야 한다. master.info 파일 값이 우선권이 있다. 만일 마스터 사용자 이름이
설정되지 않았다면, test라는 이름일 것이라고 추정한다.
• --max-relay-log-size=size
서버가 자동으로 릴레이 로그 파일을 순환(rotate)시키는 크기. 자세한 정보는 Section 6.3.4, “리플리케이션 릴레이 및
상태 파일”를 참조할 것.
• --read-only
슬레이브는 자신의 쓰레드가 보내거나 SUPER 권한의 사용자가 보내는 업데이트 이외에는 어떠한 업데이트도 하지 못하
도록 한다. 이것은 슬레이브 서버가 클라이언트에서 오는 업데이트를 받아들이지 못하도록 한다. MySQL 5.0.16 이후에
는, 이 옵션은 TEMPORARY 테이블에 적용되지 않는다.
• --relay-log=file_name
• --relay-log-index=file_name
릴레이 로그 인덱스 파일의 이름. 디폴트 이름은 데이터 디렉토리내에 있는 host_name-relay-bin.index이며, 여기에서
host_name은 슬레이브 서버의 이름이 된다.
• --relay-log-info-file=file_name
릴레이 로그에 대한 정보를 기록하는데 사용되는 파일의 이름. 디폴트 이름은 데이터 디렉토리내에 있는 relay-log.info
가 된다.
• --relay-log-purge={0|1}
• --relay-log-space-limit=size
• --replicate-do-db=db_name
디폴트 데이터 베이스(즉, USE가 선택하는 것)가 db_name인 곳에서는 명령문을 리플리케이션 하는 것을 제한하도록 서
버에게 지시한다. 한 개 이상의 데이터 베이스를 지정하기 위해서는, 각각의 데이터 베이스 별로 한 번씩 이 옵션을 사용한
다. 이 옵션은 서로 다른 데이터 베이스를 선택했거나 또는 아무런 데이터 베이스도 선택하지 않은 동안에는, UPDATE
some_db.some_table SET foo='bar' 와 같이 크로스-데이터 베이스(cross-database) 명령문은 복제하지 않는다는
점을 알아두자.
USE prices;
이렇게 “디폴트 데이터 베이스를 단지 검사만 하는” 동작이 일어나는 주된 이유는, 명령문을 복제할지 말지에 대해서는
명령문 하나만 가지고서는 알기가 어렵기 때문이다 (예를 들면, 만약에 여러분이 다중-테이블 DELETE 명령문 또는 여
러 개의 데이터 베이스를 넘나드는 다중-테이블 UPDATE 명령문을 사용 중일 경우). 전체 데이터 베이스를 검색할 필요
가 없는 경우에는, 당연히 디폴트 데이터 베이스만 검사하는 것이 빠를 것이다.
• --replicate-do-table=db_name.tbl_name
지정된 테이블로의 리플리케이션을 제한하도록 슬레이브 쓰레드에게 지시한다. 한 개 이상의 테이블을 지정하기 위해서
는, 각각의 테이블 별로 한 번씩 이 옵션을 사용한다. 이 옵션은--replicate-do-db와는 반대로, 크로스-데이터 베이스
에 대해서도 동작을 한다. Section 6.9, “서버가 리플리케이션 규칙을 얻는 방법”를 참조.
• --replicate-ignore-db=db_name
디폴트 데이터 베이스가 (즉, USE가 선택하는 것) db_name인 곳에서는 모든 명령문을 복제하지 않도록 서버에게 지시한
다. 한 개 이상의 데이터 베이스를 무시하도록 하기 위해서는, 각각의 데이터 베이스 별로 한번씩 이 옵션을 사용한다. 만
일 여러분이 크로스-데이터 베이스 업데이트를 사용하고 있고 이러한 데이터 베이스들이 업데이트 되는 것을 원하지 않
을 경우에는, 이 옵션을 사용하지 말아야 한다. Section 6.9, “서버가 리플리케이션 규칙을 얻는 방법”를 참조.
USE prices;
• --replicate-ignore-table=db_name.tbl_name
동일한 명령문이 다른 모든 테이블을 업데이트 한다고 하더라도, 지정된 테이블을 업데이트 하는 모든 명령문은 복제하지
말도록 슬레이브에게 지시한다. 한 개 이상의 테이블을 무시하도록 지정하기 위해서는, 각각의 테이블 별로 한번씩 이 옵
션을 사용한다. 이것은 --replicate-ignore-db와는 반대로, 크로스-데이터 베이스 업데이트를 실행한다.
• --replicate-rewrite-db=from_name->to_name
마스터 상에서 디폴트 데이터 베이스(즉, USE가 선택하는 것)가 from_name였다면, 그것을 to_name로 해석하도록 슬레
이브에게 지시한다. 테이블을 포함하는 명령문에만 영향을 주며 (CREATE DATABASE, DROP DATABASE, 그리고
ALTER DATABASE와 같은 명령문은 제외), 그리고 마스터 상에서 디폴트 데이터 베이스가 from_name일 경우에만 영
향을 준다. 이것은 크로스-데이터 베이스를 업데이트 하지는 않는다. 데이터 베이스의 이름을 해석하는 것은 --
replicate-* 규칙을 테스트 하기 전에 이루어 진다.
만일 여러분이 이 옵션을 명령어 라인에서 사용하고 ‘>’ 문자가 여러분이 사용하는 명령어 해석기에서 특수 문자로
받아 들여진다면, 인용 부호를 사용해서 이 옵션 값을 지정한다. 예를 들면:
• --replicate-same-server-id
• --replicate-wild-do-table=db_name.tbl_name
업데이트된 모든 테이블이 지정된 데이터 베이스와 테이블 이름 패턴을 매치(match)하는 곳에서는 명령문을 리플리케이
션하는 것을 제한하도록 슬레이브 쓰레드에게 지시한다. 패턴에는 ‘%’ 및 ‘_’ 와일드 카드 문자가 포함될 수 있는데,
이것들은 LIKE 패턴-매칭 연산자에 대한 것과 동일한 의미를 가진다. 한 개 이상의 테이블을 지정하기 위해서는, 각각의
테이블 별로 한번씩 이 옵션을 사용한다. 이것은 크로스-데이터 베이스 업데이트를 실행한다. Section 6.9, “서버가 리
플리케이션 규칙을 얻는 방법”를 참조.
예제: --replicate-wild-do-table=foo%.bar%는 데이터 베이스 이름이 foo로 시작되고 테이블 이름이 bar로 시작되
는 곳에서 테이블을 사용하는 업데이트만을 복제한다
(match)한다 (CREATE DATABASE, DROP DATABASE, 그리고 ALTER DATABASE). 예를 들면, 만일 여러분이
--replicate-wild-do-table=foo%.%를 사용한다면, 데이터 베이스 이름이 패턴 foo%와 매치가 되는 경우에 데이터
베이스-레벨 명령문을 복제한다.
데이터 베이스 또는 테이블 이름 패턴에 와일드 카드 문자를 포함 시키기 위해서는, 그 문자들은 백슬레시(backslash)를
사용해서 제외(escape) 시킨다. 예를 들면, my_own%db라는 이름의 데이터 베이스에 있는 모든 테이블은 복제하지만,
my1ownAABCdb 데이터 베이스로부터는 테이블을 복제하고 싶지 않다면, 여러분은 ‘_’ 와 ‘%’ 문자를 아래와 같
이 제외(escape) 시켜야 한다: --replicate-wild-do-table=my₩_own₩%db. 만일 여러분이 명령어 라인에서 이 옵
션을 사용한다면, 여러분이 사용하는 명령어 해석기에 따라서 옵션 값을 인용 부호나 이중(double) 백슬래시를 사용해서
지정해야 한다. 예를 들면, bash 쉘을 사용할 경우에는, --replicate-wild-do-table=my₩₩_own₩₩%db라고 입력
해야 한다.
• --replicate-wild-ignore-table=db_name.tbl_name
주어진 와일드카드 패턴과 테이블이 하나라도 매치가 되는 곳에서는 명령문 복제를 하지 못하도록 슬레이브 쓰레드에게
지시한다. 한 개 이상의 테이블을 무시하도록 지정하기 위해서는, 각각의 테이블 별로 한번씩 이 옵션을 사용한다. 이것은
크로스-데이터 베이스 업데이트를 실행한다. Section 6.9, “서버가 리플리케이션 규칙을 얻는 방법”를 참조할 것.
예제: --replicate-wild-ignore-table=foo%.bar%는 데이터 베이스 이름이 foo로 시작되고 테이블 이름이 bar로 시
작되는 곳에서 테이블을 사용하는 업데이트를 복제하지 않는다.
• --report-host=slave_name
슬레이브 등록(registration)을 하는 동안에 마스터에 보고되는 슬레이브의 호스트 이름 또는 IP 번호. 이것은 마스터 서
버에서의 SHOW SLAVE HOSTS 실행 결과 값에서 얻을 수가 있다. 슬레이브를 마스터에 등록하고 싶지 않을 경우에는
이 값을 설정하는 않는다. 슬레이브의 접속 후에 TCP/IP 소켓에서 슬레이브의 IP 번호를 마스터가 단순히 읽는다는 것은
충분치가 못하다는 점을 알아두자. NAT와 다른 라우팅(routing) 이슈 때문에, 그 IP는 마스터 또는 다른 호스트에서 슬
레이브로 접속을 하기 위한 유효한 값이 안될 수도 있다.
• --report-port=slave_port_num
이것은 슬레이브가 등록되는 동안, 마스터에 보고가 되는 슬레이브 접속을 위한 TCP/IP 포트 번호다. 슬레이브가 디폴트
포트가 아닌 것을 주목(listen)하거나 또는 여러분이 마스터 서버 또는 다른 클라이언트에서 슬레이브로 접속을 하기 위
해 특별한 터널(tunnel)을 가지고 있는 경우에만 이 값을 설정한다. 확신이 없다면, 이 값을 설정하지 않는다.
• --skip-slave-start
서버가 시작될 때, 슬레이브 쓰레드는 시작하지 말도록 서버에게 지시한다. 나중에 슬레이브 쓰레드를 시작하기 위해서
는, START SLAVE 명령어를 사용한다.
• --slave_compressed_protocol={0|1}
이 옵션이 1로 설정되면, 슬레이브/마스터 프로토콜에 대해 압축을 사용한다 (양쪽 서버가 모두 지원을 할 경우).
• --slave-load-tmpdir=file_name
슬레이브가 임시 파일을 만드는 디렉토리의 이름. 이 옵션은 tmpdir 시스템 변수 값과 동일한 것을 디폴트로 사용한다. 슬
레이브 SQL 쓰레드가 LOAD DATA INFILE 명령문을 복제할 때, 이 쓰레드는 릴레이 로그에서 읽어와서 임시 파일에 저
장할 파일을 추출하고, 그 파일을 테이블에 전달한다. 만일 마스터에 있는 그 파일이 매우 큰 것이라면, 슬레이브에 있는
임시 파일도 역시 큰 것이 된다. 따라서, 이 옵션은 충분한 사용 가능 공간을 가지고 있는 파일 시스템내의 디렉토리에 임
시 파일을 저장하도록 슬레이브에 지시할 때 권장할 만한 것이 된다. 그와 같은 경우, 릴레이 로그 역시 크게 되며, 따라서
그 파일 시스템에 릴레이 로그를 놓아두기 위해서는 --relay-log 옵션을 또한 사용할 필요가 있다.
이 옵션으로 지정된 디렉토리는 디스크 기반의 파일 시스템(메모리 기반이 아님)에 위치해야 하는데, 그 이유는 LOAD
DATA INFILE를 복제하기 위한 임시 파일은 머신이 재 시작될 때에도 존재하고 있어야 하기 때문이다. 또한, 그 디렉토
리는 시스템 스타트업 과정 중에 OS가 제거할 수 없는 것이 되어야 한다.
• --slave-net-timeout=seconds
접속이 끊어졌고, 읽기가 중단되었으며, 따라서 재 접속을 시도해야 한다고 슬레이브가 판단을 하기 전에, 마스터에서 오
는 데이터를 기다리는 대기 시간. 첫 번째 재 접속은 이 타임 아웃이 끝나면 즉시 시도된다. 재 시도 간격(interval)은 --
master-connect-retry 옵션으로 제어할 수 있다.
• --slave-skip-errors=[err_code1,err_code2,...|all]
일반적으로, 슬레이브에서 에러가 발생되면 리플리케이션은 중단이 된다. 이를 통해 여러분은 데이터의 일관성을 수동으
로 해결할 수 있게 된다. 이 옵션은 옵션 값에 열거되어 있는 에러 중의 하나를 명령문이 리턴 하더라도 리플리케이션을 계
속 진행하도록 슬레이브 SQL 쓰레드에게 지시한다..
여러분이 에러 발생 원인에 대해 충분히 이해하고 있지 않으면 이 옵션을 사용하지 말도록 한다.만일 여러분의 리플리케이
션 설정과 클라이언트 프로그램에 오류가 없고(no bug), MySQL 자체에도 오류가 없다면, 리플리케이션을 중단 시키는
에러는 결코 발생하지 않는다.
에러 코드에 대해서는, 슬레이브 에러 로그와 SHOW SLAVE STATUS의 결과에 나와 있는 에러 메시지가 제공하는 번
제목검색
상위메뉴리스트 ◆
6.9. 서버가 리플리케이션 규칙을 얻는 방법
6. 리플리케이션
만일 마스터 서버가 명령문을 자신의 바이너리 로그에 기록하지 못한다면, 그 명령문은 복제가 되지 않는다. 만일 서버가 명령문을
6.9. 서버가 리플리케이션 규칙을 얻는 방법
로그 한다면, 그 명령문은 모든 슬레이브에 전달되고, 각 슬레이브는 전달 받은 명령문을 실행할지 말지를 결정한다.
6.9 서버가 리플리케이션 규칙을 얻는 방법
마스터 측면에서는, 로그 할 명령문은 바이너리 로깅을 제어하는 --binlog-do-db 와 --binlog-ignore-db 옵션에 따라서 결
정된다. 이 옵션을 평가하는데 사용하는 규칙에 대해서는 Section 5.12.3, “바이너리 로그”를 참조하기 바란다.
슬레이브 측면에서는, 마스터에서 전달된 명령문의 실행 여부는 슬레이브가 함께 실행한 --replicate-* 옵션에 따라 결정된다.
(Section 6.8, “리플리케이션 스타트업 옵션들”을 참조.) 슬레이브는 아래의 과정을 통해서 이 옵션을 평가하는데, 가장 먼저 검
사하는 것은 데이터베이스-레벨 옵션이며 그 다음에 테이블-레벨 옵션을 진행한다.
가장 단순한 경우, 아무런 --replicate-* 옵션이 없을 때에는, 마스터에서 전달 받은 모든 명령문을 슬레이브가 실행하도록 한
다. 그렇지 않은 경우에는, 주어진 옵션에 의존해서 이 평가 과정의 결과가 나온다. 일반적으로, 하나의 옵션 셋이 가질 영향에 대
해 보다 쉽게 평가하기 위해서는, “do” 와 “ignore” 옵션을 혼용하거나, 또는 와일드 카드와 일반 문자(non-wildcard) 옵션
을 혼용해서 사용하지 말 것을 권장한다.
이 단계는 옵션-검사를 위해 명령문을 허용하거나, 또는 무시하게 만든다. 하지만, 이 단계에서 허용된 명령문은 실제로 아직 실행
되지는 않는다. 대신에, 그 명령문은 테이블 옵션을 검사하는 다음 단계로 전달된다.
우선, 사전 조건으로서, 슬레이브는 그 명령문이 스토어드 함수 또는(5.0.12 이전에서는) 스토어드 프로시저 내에서 만들어 진 것
인지를 검사한다. 만일 그러하다면, 명령문을 실행하고 빠져 나온다. (MySQL 5.0.12 이후에는, 스토어드 프로시저가 이 테스트에
서 제외가 되었는데, 그 이유는 프로시저 로깅이 CALL 레벨이 아닌 루틴 내에서 실행되는 명령문 레벨에서 발생하기 때문이다.)
그 다음에는, 슬레이브는 테이블 옵션을 검사 및 평가 한다. 만일 서버가 이 시점에 도달하면, 테이블 옵션이 없는 모든 명령문은 실
행을 한다. 만일 “do” 테이블 옵션이 있다면, 명령문은 이 옵션들 중의 하나와 반드시 매치가 되어야 실행이 되게 된다; 그렇지 않
은 경우, 그 명령문은 무시 된다. 만일 “ignore” 옵션이 있다면, ignore 옵션과 매치가 되는 것을 제외한 모든 명령문은 실행된
다. 아래의 단계는 이 평가 과정을 보다 자세히 설명한다.
• No: 아무런 테이블 제약이 없고, 따라서 모든 명령문이 매치(match)가 된다. 그 명령문을 실행한 후에 빠
져 나온다.
6. 아무런 --replicate-*-table 옵션도 매치되지 않았음. 이러한 옵션들에 대해 테스트를 진행할 다른 테이블이 있는
가?
• No: 업데이트할 모든 테이블을 테스트 했으며 어떠한 옵션도 매치되지 않았음. --replicate-do-table 또
는 --replicate-wild-do-table 옵션이 있는가?
o No: 아무런 “do” 테이블 옵션이 존재하지 않았으며, 따라서 어떠한 “do” 매치도 필요하지 않
음. 명령문을 실행하고 빠져 나옴.
o Yes: “do” 테이블 옵션이 있었으며, 따라서 이 옵션과 확실히 매치되는 것만을 가지고 명령문을
실행된다. 다른 명령문은 무시되고 빠져 나옴.
• Yes: 루프 실행.
예제:
• --replicate-* 옵션이 전혀 없음
슬레이브는 데이터 베이스 옵션을 사용해서 명령문을 허용 또는 무시한다. 그런 다음에, 테이블에 대한 아무런 제약도 없
기 때문에 이 옵션이 허용하는 모든 명령문을 실행한다.
데이터 베이스 조건이 없기 때문에 모든 명령문은 데이터 베이스-검사 단계에서 허용 되어 진다. 슬레이브는 테이블 옵션
에 따라 명령문을 실행 또는 무시한다.
슬레이브는 데이터 베이스 옵션을 사용해서 명령문을 허용 또는 무시한다. 그런 다음에 테이블 옵션에 따라서 이 옵션이
허용한 모든 명령문을 평가한다. 몇몇 경우에, 이 과정은 다소 반직관적인(counterintuitive) 결과를 만들기도 한다. 아래
와 같은 옵션 셋을 고려해 보자:
[mysqld]
replicate-do-db = db1
replicate-do-table = db2.mytbl2
데이터 베이스는 db1이며, 이것은 데이터 베이스-검사 단계에서 --replicate-do-db 옵션과 매치가 된다. 그런 후에,
테이블-검사 단계로 이동한다. 만일 테이블 옵션이 없다면, 명령문은 실행된다. 하지만, 옵션에 “do” 테이블 옵션이 포
함되어 있기 때문에, 명령문이 실행되기 위해서는 반드시 매치가 되어야 한다. 명령문은 매치가 되지 않았고, 따라서 그 명
제목검색
상위메뉴리스트 ◆
6.10. 리플리케이션 FAQ
6. 리플리케이션
Q: 마스터가 구동 중에 있고 이 서버를 멈추지 않고 슬레이브를 구성할 수 있는가?
6.10. 리플리케이션 FAQ
6.10 리플리케이션 FAQ A: 여러 가지 방법이 있다. 만일 여러분이 어느 시점의 마스터 스냅샷 백업을 만들어 두었고 그 스냅샷에 대응하는 바이너리 로그
파일 이름과 오프셋(SHOW MASTER STATUS의 결과로부터)을 기록해 두었다면, 아래의 과정을 사용한다:
4. -> MASTER_HOST='master_host_name',
5. -> MASTER_USER='master_user_name',
6. -> MASTER_PASSWORD='master_pass',
7. -> MASTER_LOG_FILE='recorded_log_file_name',
8. -> MASTER_LOG_POS=recorded_log_position;
만일 여러분이 마스터 서버의 백업을 가지고 있지 않다면, 아래의 방법으로 백업을 생성한다. 모든 과정은 마스터 호스트에서 실행
되어야 한다.
7. 잠금을 해제:
바이너리 복사를 하기 위한 다른 방법은 마스터의 SQL 덤프(dump)를 만드는 것이다. 이렇게 하기 위해서는, 마스터에서
mysqldump --master-data를 사용하고 그런 다음에 슬레이브로 덤프를 한 것을 로드한다. 하지만, 이 방법은 바이너리 복사보
다 속도가 느리다.
을 가지게 되면, 마스터의 바이너리 로그가 변경되지 않은 한 이것을 가지고 슬레이브를 설정할 수가 있게 된다.
여러분은 LOAD DATA FROM MASTER 명령문도 사용할 수가 있다. 이 명령문은 슬레이브에 스냅샷을 손쉽게 전달해 주며 로
그 파일 이름과 오프셋을 동시에 정렬을 한다. 하지만, 이 명령문은 MyISAM 테이블에 대해서만 동작을 하고 읽기 잠금을 오랫동
안 한다는 점을 주의하기 바란다. 아직까지는 우리가 원하는 만큼 효과적으로 구현되지는 않고 있다. 만일 여러분이 큰 테이블을 가
지고 있다면, 아직까지는 FLUSH TABLES WITH READ LOCK를 실행한 후에 마스터 서버에서 바이너리 스냅샷을 만드는 방법
이 더 많이 쓰이고 있다.
Q: 슬레이브가 얼마나 늦게 마스터와 비교가 되는지를 어떻게 알 수 있는가? 달리 말하면, 슬레이브가 마지막으로 명령문 복제를
한 날짜를 어떻게 알 수 있는가?
슬레이브 SQL이 마스터에서 읽어온 이벤트를 실행할 때, 자신의 시간을 이벤트 타임 스템프로 수정을 한다. (이것이
TIMESTAMP가 잘 복제되는 이유다.) in the output of SHOW PROCESSLIST의 결과 값에 있는 Time 컬럼에서, 슬레이브
SQL 쓰레드를 디스플레이 하기 위한 시간은 마지막으로 복제된 타임 스탬프와 슬레이브 머신의 실제 시간 사이의 시간이 된다. 여
러분은 이것을 사용햇 마지막으로 이벤트를 복제한 날짜를 알아낼 수가 있게 된다. 만일 여러분의 슬레이브가 마스터와 1 시간 동
안 접속을 하지 않았고, 그 다음에 다시 접속을 하였다면, 여러분은 SHOW PROCESSLIST에서 슬레이브 SQL 쓰레드에 대한
3600의 Time 값을 볼 수가 있을 것이다. 이것은 슬레이브가 한 시간 전의 명령문을 실행하기 때문이다.
SELECT 명령문은 슬레이브가 지정한 로그 파일과 오프 셋에 도달할 때까지 막는다. 그 시점이 되면, 슬레이브는 마스터
와 동기화(synchrony)되고 명령문은 리턴된다.
A: MySQL 리플리케이션은 분산(cross-server) 업데이트 원소(atomicity)를 보장하기 위해서 마스터와 슬레이브간의 어떠한
잠금 프로토콜도 현재까지는 지원하지 않는다. 달리 표현하면, 클라이언트 A가 co-master 1에 업데이트를 만드는 것은 가능하
고, 일정 시간 동안, 그것이 co-master 2로 전달 되기 전에, 클라이언트 B는 co-master 1에서 했던 것과는 다르게 클라이언트 A
의 업데이트를 만드는 co-master 2에 업데이트를 만들 수가 있게 된다. 따라서, 클라이언트 A의 업데이트가 when the update
of client A makes it to co-master 2에 만들어 질 때, 비록 co-master 2에서 일어나는 모든 업데이트가 전달이 된다고 하더라
도, 그 업데이트는 여러분이 co-master 1에서 가지고 있는 것과는 다른 테이블을 만들게 된다. 이것은 업데이트가 어떤 순서로 진
행되든지 간에 안전하게 일어난다고 확신하거나, 또는 클라이언트 코드에서 잘못된 순서의 업데이트를 주의하지 않는 이상 양방향
(two-way) 리플리케이션 관계에 있어서 두 대의 서버를 연결할 수 없다는 것을 의미한다..
여러분은 또한 양방향 리플리케이션이 실제로는 업데이트에 있어서는 성능 향상에 많은 도움이 되지 않는다는 점을 알고 있어야 한
다. 각 서버는, 하나의 서버가 실행하는 것과 같이, 반드시 동일한 숫자의 업데이트를 가지고 있어야 한다. 한가지 차이점은, 여기에
는 잠금 경쟁이 덜 존재한다는 것인데, 그 이유는 다른 서버에서 생기는 업데이트는 하나의 슬레이브 쓰레드에서 순차적으로
(serialize) 나열되기 때문이다. 이러한 장점 조차도 네트워크 지연(delay)으로 인해 반감(offset)되어질 수 있다.
A: 하나의 서버를 마스터로 설정하고 모든 것이 직접 그 서버에 작성 한다. 그런 다음에는 슬레이브를 구성하고, 마스터와 슬레이브
간의 읽기를 분산 시킨다. 또한, 슬레이브를 --skip-innodb, --skip-bdb, --low-priority-updates, 그리고 --delay-
key-write=ALL 옵션과 함께 시작을 해서 슬레이브 단의 속도를 향상시킬 수가 있다. 이와 같은 경우, 슬레이브는 InnoDB 와
BDB 테이블 대신에 논-트랜젝션(non-transactional) MyISAM 테이블을 사용해서 트랜젝션 총 비용(overhead)를 절약함으로
써 보다 개선된 속도를 얻을 수 있게 된다.
Q: 리플리케이션의 성능을 향상 시키기 위해서는 위해서는 어플리케이션의 클라이언트 코드를 어떻게 해 두어야 하는가?
• safe_writer_connect()
• safe_reader_connect()
• safe_reader_statement()
• safe_writer_statement()
각 함수 이름의 safe_ 는 함수가 모든 에러 조건을 주의 깊게 다룬다는 것을 의미한다. 여러분은 다른 이름을 사용할 수 있다. 중요
한 것은 읽기와 쓰기를 하기 위한 접속을 위해서는 통일된 인터페이스(unified interface)를 가져야 한다는 것이다.
그런 다음에, 클라이언트 코드가 레퍼 라이브러리(wrapper library)를 사용할 수 있도록 변환 시킨다. 이 작업은 처음에는 매우 어
려운 것일 수 있지만, 결국은 보상을 받게 된다. 위에서 설명한 접근 방식을 사용하는 모든 어플리케이션은, 여러 대의 슬레이브를
포함한다고 하더라도, 마스터/슬레이브 구성에 있어서 장점을 가질 수 있게 된다. 코드는 관리하기가 수월하며, 문제 해결(trouble
shooting) 옵션을 추가하기가 쉬워진다.
Q: When and how much can MySQL 리플리케이션은 시스템 성능을 언제 그리고 얼마나 향상 시키는가?
A: MySQL 리플리케이션은 읽기는 자주 실행하되 쓰기는 덜 자주 실행하는 시스템에 유익하게 동작을 한다. 이론적으로는, 단일-
마스터/다중-슬레이브 설정을 사용해서, 네트워크의 대역폭(band-width)가 허락하는 한, 또는 마스터가 처리하지 못할 정도의
업데이트를 사용할 때까지 슬레이브를 추가해서 시스템을 확장할 수가 있다.
사용할 수 있는 슬레이브의 숫자를 계산하기 위해, 그리고 여러분의 사이트 성능을 얼마나 향상 시킬 수 있는지를 알아내기 위해서
는, 여러분의 쿼리 패턴을 알 필요가 있으며, 또한 전형적인 마스터와 슬레이브 상의 읽기(초당 읽기, 또는 reads)와 쓰기(writes)
에 대한 처리량(throughput) 사이의 관계를 밴치마킹 함으로써 경험적으로 알 필요가 있다. 여기의 예제는 가상의 시스템에 대한
리플리케이션을 가지고 여러분이 얻을 수 있는 다소 단순한 계산법을 보여 주는 것이다.
시스템 로드(load)가 10%의 쓰기와 90%의 읽기로 구성되고, 우리는 벤치마킹을 통해서 reads가 1200 – 2 × writes라는 사실
을 알아냈다고 하자. 다른 말로 표현하면, 시스템은 쓰기 없이 초당 1,200의 읽기를 실행할 수가 있고, 평균 쓰기는 평균 읽기 속도
의 2배 느리며, 선형 관계(linear relationship)이다. 마스터와 각 슬레이브는 동일한 시스템 용량을 가지고 있고, 그리고 우리는 하
나의 마스터와 N 개의 슬레이브를 가지고 있다고 가정한다:
• 결국, N은 무한대로 증가하기 때문에 (그리고 우리의 예산은 유한하므로), 우리는 초당 거의 600번의 쓰기를 가질
수 있으며, 시스템의 처리량은 대략 5.5배 증가하게 된다. 하지만, 8대의 서버만을 가지고서는, 우리는 4배의 성능을 향상
시킬 수가 있다.
이러한 계산법은 네트워크의 대역폭과 서버의 다른 조건들을 무시한 것이라는 것을 알아두자. 대부분의 경우, 여러분은 N개의 리플
리케이션 슬레이브를 추가할 경우에 예상할 수 있는 결과를 정확히 예측할 수 없을 것이다. 하지만, 아래의 질문에 대답을 함으로
써, 여러분은 리플리케이션이 여러분의 시스템 성능을 얼마나 많이 향상 시킬 수 있는지를 판단하는데 도움을 얻을 수가 있을 것이
다:
A: 현재까지 사용할 수 있는 기능을 가지고서, 여러분은 하나의 마스터와 하나의 슬레이브(또는 여러 대의 슬레이브)를 구성해야
하고, 마스터가 동작 중인지를 검사하기 위해 마스터를 모니터링하는 스크립트를 작성해야 한다. 그런 다음에, 마스터가 동작을 하
지 않을 경우에는, 어플리케이션과 슬레이브에게 마스터를 바꾸도록 지시를 한다. 몇 가지 제안 사항:
• 슬레이브에게 자신의 마스터를 바꾸도록 지시하기 위해서는, CHANGE MASTER TO 명령문을 사용한다.
• WC
• ₩
• v
• WC----> M
• /|₩
• / | ₩
• v v v
• S1 S2 S3
이 다이어그램에서 보면, M은 마스터를, S는 슬레이브를, WC는 데이터 베이스 쓰기와 읽기를 입력하는 클라이언트를 가
리킨다; 데이터 베이스 읽기만을 입력하는 클라이언트는 표시되지 않았는데, 그 이유는 그런 클라이언트는 변환될
(switch) 필요가 없기 때문이다. S1, S2, 그리고 S3는 --log-bin는 사용하지만 --log-slave-updates는 사용하지
않고 구동되는 슬레이브다. 마스터로부터 슬레이브가 받는 업데이트는 --log-slave-updates가 지정되지 않는 한 바이
너리 로그에 로그 되지 않기 때문에, 각 슬레이브에 있는 바이너리는 초기에는 비어 있다. 만일 어떤 이유로 M을 사용할
수 없게 되면, 여러분은 슬레이브 중의 하나를 새로운 마스터로 만들 수가 있게 된다. 예를 들면, 만일 여러분이 S1를 가
져 온다면, 모든 WC는 S1를 향하게 되는데, 이것은 업데이트를 자신의 바이너리 로그에 로그하게 된다. S2 와 S3는 이
제 S1에서 복제를 하게 된다.
모든 슬레이브는 자신의 릴레이 로그에 있는 모든 명령문을 실행했다는 것을 확인 하자. 각각의 슬레이브에서, STOP
SLAVE IO_THREAD를 입력하고, 그런 다음에 여러분이 Has read all relay log를 볼 수 있을 때까지 SHOW
PROCESSLIST의 결과를 검사한다. 모든 슬레이브에 대해 이것이 확인(true)되면, 모든 슬레이브를 새로운 설정으로 재
구성할 수 있게 된다. 새로운 마스터가 된 슬레이브 S1에서, STOP SLAVE 와 RESET MASTER를 입력한다.
호스트 이름임)를 사용한다. CHANGE MASTER를 실행하기 위해서는, S2 또는 S3에서 S1 로 어떻게 접속이 이루어 지
는지에 대한 모든 정보를 추가한다(user, password, port). CHANGE MASTER에서는, S1'의 바이너리 로그 이름 또는
읽어올 바이너리 로그의 위치를 지정할 필요가 없다: 우리는 그것이 첫 번째 바이너리 로그이며 포지션 4에 있다는 것을
알고 있으며, CHANGE MASTER에 대한 디폴트라는 것을 알고 있다. 마지막으로 S2 와 S3에서, START SLAVE를 입
력한다.
그 다음에는 모든 WC에게 자신의 명령문을 S1에 전달하도록 지시한다. 그 시점 이후에, WC가 S1에게 보내는 모든 업데
이트 명령문은 S1의 바이너리 로그에 쓰여지게 되는데, 이 바이너리 로그는 since M가 다운된 이후에 S1에게 전달된 모
든 업데이트 명령문을 가지고 있다. .
WC
WC | M(unavailable)
₩ |
₩ |
vv
S1<--S2 S3
^ |
+-------+
M이 다시 올라오게 되면(up again), 여러분은 S2 와 S3에서 입력했던 것과 동일한 CHANGE MASTER 를 M에서 입력
해야 하는데, 이렇게 되면 M은 S1의 슬레이브가 되고, M이 다운되어 있는 동안 놓쳤던 모든 WC의 쓰기를 가져오게 된
다. M을 마스터로 다시 만들기 위해서는 (예를 들면, M이 가장 성능이 좋은 머신이기 때문에), S1이 사용할 수 없게 되었
고 그리고 M이 새로운 마스터가 되는 것처럼 해서 위의 과정을 진행하면 된다. 이 과정 동안에는, S1, S2, 그리고S3를 M
의 슬레이브로 만들기 전에 M에서 미리 RESET MASTER를 구동 시켜야 한다는 것은 잊지 말기 바란다. 그렇지 않으면,
S1, S2, 그리고S3는 M을 사용할 수 없는 시점이 되기 전에 구형의 WC 쓰기를 가져올 수도 있게 된다.
Q: 여러 개의 OS 시스템상에서도 리플리케이션이 동작을 하는가(예를 들면, 마스터에서는 리눅스가 돌고, 슬레이브는 Mac OS와
윈도우가 구동됨)?
A: 예.
Q: 여러 개의 하드웨어 아키텍처상에서도 리플리케이션이 동작되는가 (예를 들면, 마스터는 64-비트 머신이며, 슬레이브는 32-
비트 머신임)?
A: 예.
제목검색
상위메뉴리스트 ◆
6.11. 리플리케이션 문제 해결
6. 리플리케이션
만일 여러분이 지침을 그대로 따라서 실행을 하였지만 리플리케이션 설정이 동작을 하지 않는다면, 처음으로 해야 할 일은 에러 로
6.11. 리플리케이션 문제 해결
그 메시지를 검사하는 것이다. 많은 사용자들이 이 작업을 수행하지 않고 시간만 허비하고 있다.
6.11 리플리케이션 문제 해결
만일 여러분이 에러 로그를 통해서도 문제의 원인을 발견할 수가 없다면, 아래의 방법을 시도해 본다:
• SHOW MASTER STATUS 명령문을 입력해서 마스터 서버가 바이너리 로깅이 활성화 되었는지를 검증한다. 만일
활성화 되어 있다면, Position은 0이 아닌 값이 된다. 만일 활성화가 되어 있지 않다면, 여러분이 마스터를 --log-bin
과 --server-id 옵션을 가지고 구동 시켰는지 검증한다.
• 만일 슬레이브가 구동 중이라면, 마스터와 접속이 이루어져 있는지를 검사한다. SHOW PROCESSLIST를 사용해
서, I/O 와 SQL 쓰레드를 찾고 State 컬럼을 검사한다. Section 6.3, “리플리케이션 구현 상세 설명”을 참조. 만일 I/O
쓰레드 상태가 Connecting to master라고 한다면, 마스터에 있는 리플리케이션 사용자에 대한 권한, 마스터 호스트 이
름, 그리고 DSN 설정을 검사해서, 슬레이브가 접근할 수 있도록 되어 있는지를 알아본다.
• 만일 마스터에서 진행되었던 명령문들이 슬레이브에서는 거부가 되었다면, 슬레이브의 데이터 베이스를 삭제하고 마
6. 만일 슬레이브가 마스터와 완벽하게 동기화 된 상태로 시작되었고, 그리고 슬레이브 쓰레드 외부에 업데이
트된 테이블이 없다고 확신을 한다면, 이것은 버그로 인한 불일치라고 생각할 수가 있다. 만일 여러분이 가장 최
신의 MySQL 버전을 사용하고 있다면, 발생된 문제점을 레포트해 주길 바란다. 만일 여러분이 예전 버전을 사용
하고 있다면, 해당 문제점이 계속 발생되는지 알아보기 위해 최신 버전의 제품으로 업그레이드를 하도록 한다.
제목검색
상위메뉴리스트 ◆
6.12. 리플리케이션 버그와 문제점 보고하기
6. 리플리케이션
여러분이 생각하기에 사용자 에러가 없다고 판단을 하고, 리플리케이션이 전혀 동작을 하지 않거나 또는 여전히 불안정하다면, 버
6.12. 리플리케이션 버그와 문제점 보고하기
그 레포트를 보내 주길 바란다. 우리가 버그를 추적하기 위해서는, 가능하면 많은 정보를 여러분께서 보내 주길 바란다.
6.12 리플리케이션 버그와 문제점 보고하기
만일 여러분이 버그를 보여 줄 수 있는 테스트 케이스를 가지고 있다면, Section 1.8, “버그 및 문제점 보고 방법”에서 설명하는
방법을 사용해서 우리의 버그 데이터 베이스에 넣어 주길 바란다. 만일 여러분이 “phantom” 문제를 가지고 있다면 (여러분이 전
혀 복제할 수 없는 것), 아래의 과정을 사용하기 바란다:
1. 사용자 에러가 없다는 것을 검증한다. 예를 들면, 만일 여러분이 슬레이브 쓰레드 외부에서 슬레이브를 업데이트 한
다면, 데이터는 동기화가 되지 않으며, 그리고 여러분은 업데이트에 대한 고유의 키 위반을 가지게 된다. 이와 같은 경우,
슬레이브 쓰레드는 멈추게 되고 테이블간의 동기화를 만들기 위해 여러분이 수동으로 테이블을 정리하도록 대기한다. 이
것은 리플리케이션 문제가 아니다.
• 마스터의 모든 바이너리 로그
• 슬레이브의 모든 바이너리 로그
• 마스터와 슬레이브에서의 에러 로그
4. 바이너리 로그를 검사하기 위해서 mysqlbinlog를 사용한다. 아래의 사항은 문제가 있는 명령문을 찾는데 도움이 될
것이다. log_pos 및 log_file은 SHOW SLAVE STATUS의 결과에 있는 Master_Log_File 및 Read_Master_Log_Pos
값이다.
문제에 대한 증거를 수집한 후에, 우선 이것들을 별개의 테스트 테이스로 구분하도록 한다. 그런 다음에, Section 1.8, “버그와 문
제점 보고 방법”에서 설명하는 방법을 사용해서 가능한 한 많은 정보를 우리의 버그 데이터 베이스에 전달하기 바란다.
제목검색
상위메뉴리스트 ◆
6.13. 다중 마스터 리플리케이션에서 자동 인크리먼트
6. 리플리케이션
여러 대의 서버를 리플리케이션 마스터로 구성을 할 때에는, When multiple servers are configured as replication masters,
6.13. 다중 마스터 리플리케이션에서 자동 인
special steps must be taken to prevent key collisions when using AUTO_INCREMENT 컬럼을 사용할 때 키 콜레션
크리먼트
(collision)을 피하기 위해는 특별한 단계를 거쳐야 하는데, 그렇지 않으면 다중 서버는 열을 삽입할 때 동일한
6.13 다중 마스터 리플리케이션에서 자동 인크리먼
AUTO_INCREMENT 값을 사용하고자 할 것이다.
트
할 것.
제목검색
7.4.6.5 키 캐시 블럭 크기 이 장에서는 MySQL을 최적화 시키기 위한 여러 가지의 방법을 예제를 통해서 설명하도록 한다.
7.4.6.6 키 캐시 재 구축하기
7.4.7 MyISAM 인덱스 통계 수집
7.4.8 MySQL의 테이블 열기 및 닫기 방법
7.4.9 동일 데이터 베이스에 많은 테이블을 생성하기 위해 드로우 백
(drawback) 하기
제목검색
● 디스크 검색(Disk seeks). 디스크는 데이터 조각을 찾는데 시간을 소비한다. 최신의 디스크들은, 평균 검
색 시간이 보통10ms 이하이며, 따라서 우리는 이론적으로 초당 약 100 검색(seek)을 수행할 수 있게 된
다. 이 시간은 점진적으로 개선되고 있으며 단일 테이블에 대해 이것을 최적화 시키기는 매우 어렵다. 검색
시간을 최적화 할 수 있는 방법은 데이터를 한 개 이상의 디스크에 분산하는 것이다.
● 디스크 읽기 및 쓰기. 디스크가 올바른 위치에 있을 때, 우리는 데이터를 읽게 된다. 최신의 디스크들은, 하
나의 디스크가 최소 10–20MB/s의 처리량(throughput)을 나타낸다. 이것은 검색 보다 쉽게 최적화를 시
킬 수가 있는데, 그 이유는 여러분이 여러 개의 디스크에서 병렬로 데이터를 읽을 수 있기 때문이다.
● CPU 싸이클(cycle). 데이터가 메인 메모리에 있을 때, 우리는 이것을 처리해서 결과를 얻고자 한다. 메모리
에 비해 작은 양의 테이블을 가지는 것이 가장 일반적인 제약 요소이다. 하지만 작은 테이블을 가지고 있다
면, 속도는 문제가 되지 않는다.
● 메모리 대역폭(Memory bandwidth). When the CPU가 자신의 캐시가 보유할 수 있는 양보다 많은 데이터
를 필요로 하게 되면, 메인 메모리 대역폭에서 병목 현상이 발생한다. 이것은 대부분의 시스템에서는 일반적
으로 발생되지는 않는데, 하지만 이 점에 대하여는 인지를 하고 있어야 한다.
제목검색
7. 최적화(Optimization)
7.1. 최적화 소개 MyISAM 스토리지 엔진을 사용할 경우, MySQL은 다중 리더(reader) 또는 하나의 라이터(writer)를 허용하는 최
7.1.1 MySQL 디자인상의 제약 사항 및 트레이드오프(Tradeoff) 고 속도의 빠른 테이블 잠금을 사용한다. 이 스토리지 엔진이 가지고 있는 가장 큰 문제점은 여러분이 꾸준한 혼용
업데이트 스트림(stream)과 단일 테이블에서의 느린 선택을 가지고 있는 경우에 발생한다. 만일 특정 테이블에 대
해 이 문제가 발생을 한다면, 여러분은 그러한 테이블에 대해서는 다른 스토리지 엔진을 사용하도록 한다.
Chapter 14, 스토리지 엔진과 테이블 타입을 참조할 것.
위의 동작을 변경하기 위해서는, 여러분은 서버SQL 모드를 적당히 설정함으로써 스트릭터(stricter) 데이터 처리
를 활성화 시킬 수가 있다. 데이터 처리에 대한 보다 많은 정보는 Section 5.2.5, “서버 SQL모드”, 및
제목검색
7. 최적화(Optimization)
7.1. 최적화 소개 모든 SQL 서버는 표준 SQL을 서로 다르게 구현하기 때문에, 이식 가능한 데이터 베이스로 작성을 해야 한다. 가장 단
7.1.2 이식성(Portability)을 갖도록 어플리케이션 디자인하기 순한 선택 및 삽입에 대해서 이식성을 갖도록 하는 것은 쉬운 일이지만, 점점 어려운 일을 처리할수록 여러분 더욱 더
많은 것을 알고 있어야 한다. 만일 여러분이 다양한 데이터 베이스 시스템에서 빠르게 동작되는 어플리케이션을 원할
경우, 일은 점점 어려워진다.
복잡한 어플리케이션이 이식성을 갖도록 하기 위해서는, 이 어플리케이션을 어떤 SQL 서버와 구동을 시켜야 하는지를
결정해야 하고, 그 서버가 지원하는 기능에는 어떤 것들이 있는지를 파악해야 한다. 여러분은 데이터 베이스 서버를 선
택하는데 있어서, MySQL crash-me 프로그램을 사용해서 그 서버의 함수, 타입, 그리고 한계점을 파악할 수가 있을
것이다. crash-me이 모든 가능 기능들을 검사하지는 못하지만, 약 450번의 테스트를 거쳤기 때문에 믿고 사용할 수
는 있다. crash-me가 제공하는 정보의 예를 본다면, 만일 여러분이 Informix 또는 DB2를 사용하고자 한다면, 18개
문자 이상의 길이로 컬럼 이름을 사용할 수 없다는 것이다.
crash-me 프로그램과 MySQL 벤치마크는 모두 데이터 베이스와는 무관하게 동작한다. 이것들이 어떻게 작성되어 있
는지 잠시 살펴본다면, 여러분이 어플리케이션을 데이터베이스와 무관하게 만들기 위해서 해야 할 일이 어떤 것인지를
알 수 있게 될 것이다. 이 프로그램들은 MySQL 소스 배포판의 sql-bench 디렉토리에서 찾을 수가 있다. 이것들은
Perl로 쓰여졌고 DBI 데이터 베이스 인터페이스를 사용한다. 자체적으로 DBI를 사용함으로써 이식성에 관련된 문제
를 해결하고 있는데, 그 이유는 이 인터페이스가 데이터베이스-무관 접근 방식을 제공하기 때문이다. Section 7.1.4,
“MySQL 벤치 마크 슈트”를 참조할 것.
동일 테이블상에서 슬로우 리더(slow reader) 및 슬로우 라이터(slow writer)를 혼용해서 사용하면 문제가 생기게 된
다. 반면에, Oracle의 경우, 여러분이 최근에 업데이트를 한 열을 접근하고자 할 때에는 커다란 문제가 생기게 된다 (업
데이트한 것들이 디스크에 플러시 될 때까지는). 트랜젝셔널 데이터베이스 시스템은 일반적으로 로그 테이블에서 요약
테이블(summary table)을 만드는데 있어서는 그다지 좋게 동작으로 하지 않는데, 그 이유는 이와 같은 경우에는 열 잠
금(row locking)이 거의 쓸모가 없게 되기 때문이다.
여러분의 어플리케이션이 진정으로 데이터 베이스와 무관한 것이 되기 위해서는, 여러분이 처리하는 데이터가 사용하
는 인터페이스가 손쉽게 확장 가능한 것이 되도록 정의해야 한다. 예를 들면, C++은 거의 모든 시스템에서 사용 가능
한데, 따라서 여러분의 데이터 베이스에 대해서 C++ 클래스-기반의 인터페이스를 사용하는 것은 좋은 생각이 되는 것
이다.
만일 여러분이 주어진 데이터 베이스 시스템에 관련된 기능들을 사용하고 있다면 (예를 들면, MySQL에만 관련되어 있
는 REPLACE 명령문), 다른 SQL 서버에 대해서는 동일한 기능을 수행하도록 별도의 방식으로 코딩을 해야 한다. 비
록 이렇게 작성된 것들이 속도는 느릴지라도, 다른 SQL 서버가 동일한 업무를 처리할 수는 있게 된다.
MySQL을 사용한다면, 여러분은 /*! */ 신텍스를 사용해서 명령문에 MySQL-관련 키워드를 추가할 수가 있다. /* */
의 내부에 있는 코드는 대부분의 다른 SQL 서버에 의해 코멘트로 인식된다 (무시됨). 코멘트 작성에 대한 정보는,
Section 9.4, “코멘트 신텍스(Comment Syntax)”를 참조할 것.
만일 정확성 보다는 성능이 보다 중요한 요소일 경우, 여러분이 얻게 되는 모든 정보를 캐시하는 어플리케이션 레이어
(application layer)를 생성할 수도 있을 것이다. 일정 시간이 지난 후에는 이전의 결과를 없애 버림으로써, 여러분은
캐시를 참신한 상태로 유지 시킬 수 있게 된다. 이것은 고 부하 시스템을 처리하는 방법으로서, 이와 같은 경우, 여러분
은 캐시의 크기를 동적으로 증가 시킬 수가 있고 모든 것들이 정상적으로 될 때까지는 폐기 타임 아웃(expiration
timeout)을 높게 설정할 수가 있게 된다.
어플리케이션 캐시를 처리하는 또 하나의 매력적인 방법으로는 MySQL 쿼리 캐시를 사용하는 것이다. 쿼리 캐시를 활
성화 시킴으로써, 서버는 쿼리의 결과를 다시 사용할 수 있는지에 대한 여부를 상세하게 처리한다. 이를 통해 여러분의
어플리케이션은 단순화 된다. Section 5.14, “MySQL 쿼리 캐시”를 참조.
제목검색
7. 최적화(Optimization)
7.1. 최적화 소개 이 섹션에서는 예전에 MySQL에 포함되어 있었던 어플리케이션들에 대해 설명을 하기로 한다.
--- 이하의 내용은 기술적인 내용이 아닌 MySQL 개발 초기의 경험을 기술하고 있기 때문에
생략하기로 함 ---
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=1&scate=3&idx=15742006-08-08 오후 5:57:49
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.1. 최적화 소개 벤치 마크 슈트는 주어진 SQL 동작이 제대로 구현되는지 여부를 사용자에게 알려준다. 여러분은 벤치 마크의 코드와 MySQL 소
7.1.4 MySQL 벤치 마크 슈트 스 배포판의 sql-bench 디렉토리에 있는 결과를 검토함으로써 벤치 마크가 어떻게 동작을 하는지를 알아볼 수가 있다.
이 벤치 마크는 아직은 단일 쓰레드로만 동작을 하며, 따라서 수행된 동작에 대해서는 최소의 시간을 계산한다는 점을 알아두자. 우
리는 향후에 다중 쓰레드 테스트를 추가할 예정이다.
shell> cd sql-bench
server_name은 지원되는 서버 중의 하나의 이름이다. 모든 옵션 및 지원 서버의 리스트를 얻기 위해서는, 아래의 명령어를 호출한
다:
crash-me 스크립트도 sql-bench 디렉토리에 있다. crash-me는 데이터 베이스 시스템이 지원하는 기능이 무엇이며 실제로 구
동 중인 쿼리의 능력 및 제약 사항이 어떤 것인지를 알아 보기 위해 사용된다. 예를 들면, 이것을 아래의 것들을 알아낸다:
● 지원되는 데이터의 타입
● 지원되는 인덱스의 숫자
● 지원되는 함수
● 얼마나 큰 쿼리를 실행할 수 있는지
● 얼마나 큰 VARCHAR 컬럼을 실행할 수 있는지
제목검색
7. 최적화(Optimization)
7.1. 최적화 소개 결론적으로는, 여러분은 자신의 어플리케이션 및 데이터 베이스를 벤치 마크 함으로써 병목 현상이 어디에서 발생하는지를 알아 보
7.1.5 여러분 자신의 벤치 마크 사용하기 아야 할 것이다. 하나의 병목 현상을 우선 처리한 후에야(또는 “dummy” 모듈로 바꿈으로써), 여러분은 그 다음의 병목 현상을
처리할 수가 있을 것이다. 비록 여러분의 어플리케이션이 전반적으로 아직은 성능이 괜찮을 지라도, 여러분은 최소한 각 병목 현상
이 어디에서 발생하며 어떻게 이것을 처리할 지에 대한 계획은 가지고 있어야 하다.
이식성이 있는 벤치 마트 프로그램의 예는 MySQL 벤치 마크 슈트에 있다. Section 7.1.4, “MySQL 벤치 마크 슈트”를 참조할
것. 여러분은 이 슈트에서 프로그램을 하나 가져와서 여러분의 필요에 따라 수정해서 사용할 수가 있다. 이렇게 함으로써, 여러분
은 자신의 문제에 대해 다른 방식의 해결책을 만들 수가 있고 보다 빠른 성능을 내도록 테스트를 할 수가 있게 된다.
일상적으로 보면, 시스템에 부하를 매우 크게 걸 때 문제들이 많이 발생을 한다. 우리의 고객들은 시스템을 생산 단계에서 테스트
를 할 때 부하 문제를 겪곤 한다. 대부분의 경우, 성능 문제는 근본적인 데이터 베이스 디자인 이슈(예를 들면, 고 부하 상황하에서
는 테이블 스캔은 좋지 않음) 또는 OS 또는 라이브러리의 문제에서 기인한다고 알려져 있다. 이러한 문제를 해결하는 것은 그리 어
려운 문제가 아니다.
이와 같은 문제를 해결하기 위해서는, 가능한 최악의 상황 아래에서 여러분의 어플리케이션 전체를 벤치 마킹 해야만 한다. 여러분
은 슈퍼 스맥(Super Smack)을 사용할 수 있는데, http://jeremy.zawodny.com/mysql/super-smack/에서 이것을 찾아 볼 수 있
다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=1&scate=5&idx=15762006-08-08 오후 5:57:52
:::MySQL Korea:::
제목검색
7.2.13.2 타이트한 인덱스 스캔(Tight index scan) 게, 여러분이 어느 계정에 대해서는 자원의 제한을 하지 않게 되면, 서버는 자원 카운팅을 실행하지 않는다. 만일 여러분이 매우
7.2.14 LIMIT 최적화 큰 명령문-처리 업무를 해야 한다면, 퍼미션-검사 오버헤드를 줄일 수 있도록 단순화된 승인 구조를 사용하는 것이 효율적인 것
제목검색
7. 최적화(Optimization)
EXPLAIN 명령문은 DESCRIBE에 대한 동의어로 사용할 수 있거나 또는 MySQL이 SELECT 명령문을 실행하는 방법에 대한 정
보를 얻기 위한 수단으로 사용할 수가 있다:
● EXPLAIN tbl_name은 DESCRIBE tbl_name 또는 SHOW COLUMNS FROM tbl_name과 동일한 의미이다.
● 여러분이 SELECT 명령문을 EXPLAIN 앞에 두면, MySQL은 쿼리 실행 플랜(query execution plan)에 대한 정보를 옵
티마이저(optimizer)에서 가져 와서 출력을 한다. 즉, MySQL은 테이블들이 어떤 순서로 조인(join)을 하는지에 대한 정
보를 포함해서, SELECT를 처리하는 방법에 대해서 알려 주게 된다.
만일 여러분 생각에는 사용 되어야만 했을 인덱스가 사용되지 않은 상태로 문제를 일으키게 되면, 키의 기수(cardinality)와 같은
테이블 상태를 업데이트 하기 위한 ANALYZE TABLE를 구동 시켜야 하는데, 이것은 옵티마이저의 선택에 영향을 미치게 된다.
EXTENDED 키워드가 사용되면, EXPLAIN은 EXPLAIN 명령문 다음에 SHOW WARNINGS 명령문을 입력해서 볼 수 있는 여분
의 정보를 보여 준다. 이 정보는 옵티마이저가 SELECT 명령문에 있는 컬럼 이름과 테이블을 얼마나 많이 검증을 하였는지를 보여
주며, SELECT는 최적화 과정에 관한 어플리케이션 재 작성과 최적화 규칙, 그리고 다른 가능한 노트(notes)를 보여준다.
Each output row from EXPLAIN를 통해서 나오는 각각의 결과 열은 하나의 테이블에 대한 정보이며, 각 열은 아래의 컬럼을 가
지고 있다:
● id
● select_type
DEPENDENT UNION Second or later SELECT statement in a UNION, dependent on outer query
● table
결과 열이 참조하는 테이블.
● type
❍ system
테이블은 하나의 열만을 가지고 있다 (= 시스템 테이블). 이것은 const 조인(join) 타입의 특별한 경우이다.
❍ const
테이블은 적어도 하나의 매칭(matching) 테이블을 가지고 있는데, 쿼리가 시작되는 시점에 이 테이블을 읽게 된
다. 여기에는 하나의 열만이 존재하기 때문에, 이 열에 있는 컬럼에서 얻는 값은 나머지 옵티마이저에 의해 항수
(constant)로 인식될 수 있다. const 테이블은 한번 밖에 읽혀지지 않기 때문에 매우 빠르다.
const는 여러분이 PRIMARY KEY 또는 UNIQUE 인덱스의 모든 부분을 항수 값(constant value)와 비교를 할
때 사용된다. 아래의 쿼리에서 보면, tbl_name는 const 테이블 형태로 사용되고 있다:
❍ eq_ref
WHERE ref_table.key_column=other_table.column;
WHERE ref_table.key_column_part1=other_table.column
AND ref_table.key_column_part2=1;
❍ ref
ref는 = 또는 <=> 연산자를 사용해서 비교되는 인덱스된 컬럼에 대해 사용될 수 있다. 아래의 예제에서 본
다면, MySQL은 ref_table의 처리 과정에서 ref 조인(join)을 사용한다.
WHERE ref_table.key_column=other_table.column;
WHERE ref_table.key_column_part1=other_table.column
AND ref_table.key_column_part2=1;
❍ ref_or_null
이 조인(join) 타입은 ref과 유사하지만, MySQL이 NULL 값을 가지고 있는 열에 대해서도 검색을 한다는 점이
차이가 있다. 이 조인(join) 타입 최적화는 서브 쿼리(subqueries)를 해석하는데 자주 사용된다. 아래의 예제에
서 보면, MySQL은 ref_table의 처리 과정에서 ref_or_null 조인(join)을 사용하고 있다.
❍ index_merge
❍ unique_subquery
❍ index_subquery
❍ range
❍ index
이 조인(join) 타입은 ALL과 동일하지만, 인덱스 트리(index tree)만을 스캔한다는 점은 다르다. 일반적으로 이
것이 ALL 보다는 빠르게 동작하는데, 왜냐하면 보통 인덱스 파일이 데이터 파일보다 작기 때문이다.
MySQL은 쿼리가 단일 인덱스의 일부분인 컬럼만을 사용할 때 이 조인(join)을 사용한다.
❍ ALL
● possible_keys
● key
key 컬럼은 MySQL이 실제로 사용할 예정인 키(인덱스)를 가리킨다. 만일 아무런 인덱스도 선택되지 않았다면, 그 키
는 NULL이 된다. To force MySQL로 하여금 possible_keys 컬럼에 있는 인덱스를 사용 또는 무시하도록 만들기 위
해서는, 쿼리에서 FORCE INDEX, USE INDEX, 또는 IGNORE INDEX를 사용하도록 한다. Section 13.2.7,
“SELECT 신텍스”를 참조할 것.
MyISAM 및 BDB 테이블의 경우, ANALYZE TABLE를 구동시킴으로써 옵티마이저가 보다 좋은 인덱스를 선택하도록
도움을 줄 수가 있다. MyISAM 테이블의 경우에는, myisamchk --analyze 가 동일한 역할을 한다. Section 13.5.2.1,
“ANALYZE TABLE 신텍스”, 및 Section 5.10.4, “테이블 유지 관리 및 크래시(Crash) 복구”를 참조할 것.
● key_len
key_len 컬럼은 MySQL이 사용하기로 결정한 키의 길이를 나타낸다. 만일 key 컬럼이 NULL이라면, 이 길이도 NULL
이 된다. Note that key_len의 값은 다중-부분(multiple-part)키 부분 중에 얼마나 많은 부분을 MySQL이 실제로 사용
하는지를 여러분이 알 수 있도록 해 준다.
● ref
● rows
● Extra
❍ Distinct
❍ Not exists
t2.id를 NOT NULL으로 정의했다고 가정하자. 이와 같은 경우, MySQL은 t1을 스캔하고 and looks up the
rows in using the values of t1.id의 값을 사용해서 t2에 있는 열을 검색한다. 만일 MySQL이 t2에서 매칭되는
열을 발견하면, MySQL은 t2.id 가 결코 NULL이 아님을 알게 되며, 따라서 동일한 id 값을 가지고 있는 t2에서
는 더 이상 열을 스캔하지 않게 된다. 달리 표현하면, t1에 있는 각 열에 대해, MySQL은 t2에서는 단일 검색
(lookup)만을 하게 되며, t2에서 실제로 얼마나 많은 열이 매치가 되는지는 상관이 없게 된다.
❍ Using filesort
MySQL은 저장된 순서에 따라서 열을 추출하기 위한 방법을 찾기 위한 여분의 과정을 진행한다. 정렬(sort)은
조인(join) 타입과 정렬 키 및 WHERE 구문과 매치가 되는 모든 열에 대한 열 포인터(pointer)를 가지고 모든
열에 걸쳐 진행 된다. 그런 다음에 그 키는 저장이 되며 열은 저장 순서에 따라서 추출된다. Section 7.2.12,
“ORDER BY 최적화”를 참조할 것.
❍ Using index
부가적인 실제 열 검색을 하지 않는 상태로 인덱스 트리에 있는 정보만을 가지고 테이블에서 컬럼 정보를 추출한
다. 쿼리가 단일 인덱스의 일부분인 컬럼만을 사용할 때 이러한 전략을 사용할 수가 있다.
❍ Using temporary
쿼리를 해석하기 위해서는, MySQL은 결과를 집어 넣을 임시 테이블을 하나 생성할 필요가 있다. 전형적으로는,
만일 쿼리가 컬럼을 서로 다르게 목록화 한 GROUP BY 및 ORDER BY 구문을 가지고 있는 경우에 이런 것이 일
어나게 된다.
❍ Using where
이것들은 인덱스 스캔이 어떻게 index_merge 조인(join) 타입과 병합(merge)가 되는지를 나타낸다.
Section 7.2.6, “인덱스 병합 최적화”를 참조할 것.
테이블 접근에 대한 Using index 방식과 유사한 Using index for group-by 방식은MySQL이 실제 테이블을
추가적으로 검색을 하지 않고서도 GROUP BY 또는 DISTINCT 쿼리의 모든 컬럼을 추출(retrieve)하기 위해
사용될 수 있는 인덱스를 찾았음을 가리킨다. 또한, 그 인덱스는 각 그룹에 대해 가장 효과적인 방식으로 사용되
기 때문에, 적은 수의 인덱스 엔트리만이 읽혀지게 된다. 자세한 사항은 Section 7.2.13, “GROUP BY 최적
화”를 참조할 것.
이 아이템은 NDB Cluster 테이블에만 적용된다. 이것은 MySQL 클러스터가 인덱스가 되지 않은 컬럼(non-
indexed column)과 항수(constant)간의 직접 비교(direct comparision (=))의 효율성을 개선하기 위해서 조
건문을 푸시 다운(condition pushdown)하는 중이라는 의미를 갖는다. 이와 같은 경우, 조건문은 동시에 값이 검
사되는 클러스터의 모든 데이터 노드로 “푸시 다운(pushed down)”가 된다. 이것은 매치되지 않는 열(non-
matching row)를 네트워크 전체에 보낼 필요성을 없애 주며, 조건문 푸시 다운을 하지 않는 경우에 비해서 5에
10배의 속도 향상을 얻을 수가 있다.
여러분이 아래와 같은 클러스터 테이블을 가지고 있다고 가정하자:
CREATE TABLE t1 (
a INT,
b INT,
KEY(a)
) ENGINE=NDBCLUSTER;
id: 1
select_type: SIMPLE
table: t1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 10
id: 1
select_type: SIMPLE
table: t1
type: range
possible_keys: a
key: a
key_len: 5
ref: NULL
rows: 2
■ 조건문 푸시 다운은 MySQL 클러스터에만 관련이 있으며, 다른 스토리지 엔진을 사용하고 있는 테이블에
대해서 쿼리를 실행할 경우에는 발생하지 않는다.
■ 조건문 푸시 다운 기능은 디폴트로 사용되지 않는다. 이 기능을 활성화 시키기 위해서는, mysqld을 --
engine-condition-pushdown 옵션과 함께 시작하거나, 또는 아래의 명령문을 실행한다:
§ SET engine_condition_pushdown=On;
조건문 푸시 다운, Using where with pushed condition, 그리고 engine_condition_pushdown 등은 모두 5.0
클러스터에서 추가가 되었다.
여러분은 EXPLAIN의 결과에 있는 rows 컬럼 값을 가지고 좋은 조인(join)을 얻는 방법을 알아 낼 수가 있다. 이것은 MySQL이
쿼리를 실행하기 위해서 조사해야 하는 열의 수가 얼마나 되는지 대략적으로 알려 주게 된다. 만일 여러분이 max_join_size 시스
템 변수를 가지고 쿼리를 제한하면, 이러한 열은 다중-테이블 SELECT 명령문을 실행해야 하는지 또는 무시를 해야 하는지를 결
정하는 데 이러한 열 값을 사용할 수도 있게 된다. Section 7.5.2, “서버 파라미터 튜닝하기”를 참조할 것.
아래의 예제는 EXPLAIN에 의해 얻어진 정보를 가지고서 다중-테이블 조인을 어떻게 최적화 시키는 지를 설명한다.
여러분은 아래와 같은 SELECT 명령문을 가지고 있으며 EXPLAIN를 사용해서 이것을 조사하고자 한다고 가정하자:
tt.ProjectReference, tt.EstimatedShipDate,
tt.ActualShipDate, tt.ClientID,
tt.ServiceCodes, tt.RepetitiveID,
tt.CurrentProcess, tt.CurrentDPPerson,
et_1.COUNTRY, do.CUSTNAME
Tt ActualPC CHAR(10)
Tt AssignedPC CHAR(10)
Tt ClientID CHAR(10)
Et EMPLOYID CHAR(15)
Do CUSTNMBR CHAR(15)
Table Index
Tt ActualPC
Tt AssignedPC
Tt ClientID
ClientID,
ActualPC
만일 컬럼 상의 인덱스들을 동일한 타입과 크기로 선언할 경우에는 MySQL이 이를 효과적으로 처리하는데 한가지 문제가 생긴다.
위의 문장에서 보면, VARCHAR 및 CHAR는 크기가 동일하게 선언된다면, 동일한 것으로 간주가 된다. tt.ActualPC는 CHAR
컬럼 길이간의 이러한 문제를 해결 하기 위해서는, ALTER TABLE를 사용해서 ActualPC의 길이를 10 개의 문자에서 15 문자로
늘린다:
ClientID, where
ActualPC
ClientID, where
ActualPC
이렇게 되면, 쿼리는 거의 최적화가 이루어진다. 남아 있는 문제는, MySQL은 tt.ActualPC 컬럼에 있는 값들은 골고루 분포가 되
어 있으나, tt 테이블에 대해서는 그렇지 않다고 가정하고 있다는 점이다. 다행스러운 것은, MySQL로 하여금 키의 분포도를 분석
하도록 만드는 것이 쉽다는 점이다:
추가적인 인덱스 정보를 사용하면, 조인(join)은 완벽해 지고 EXPLAIN은 아래와 같은 결과를 만들게 된다:
ClientID, where
ActualPC
EXPLAIN의 결과에 있는 rows 컬럼은 MySQL 조인(join) 최적화를 통해서 개선된다는 점을 알아두자. 여러분은 rows 가 만들
어 내는 값과 쿼리가 리턴하는 열의 실제 숫자를 비교함으로써 그 숫자가 거의 일치하는지를 검사해야 한다. 만일 그 숫자가 많이
차이가 난다면, SELECT 명령문에서 STRAIGHT_JOIN을 사용하고 FROM 구문에서 테이블의 순서를 다르게 해 줌으로서 보다
나은 성능을 얻을 수가 있을 것이다.
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 대부분의 경우, 여러분은 디스크 검색(disk seek) 시간을 계산해서 쿼리의 성능을 추정할 수 있다. 작은 테이블의 경우에는 한번
7.2.2 쿼리 성능 추정하기 의 디스크 검색으로 열을 찾을 수가 있다(왜냐하면 인덱스가 거의 캐시되어 있기 때문에). 보다 큰 테이블일 경우에는, 여러분은
B-트리 인덱스를 사용해서 이를 추정할 수가 있는데, 하나의 열을 찾기 위해서는 많은 검색을 하여야 한다: log(row_count) / log
(index_block_length / 3 × 2 / (index_length + data_pointer_length)) + 1.
MySQL에서는, 하나의 인덱스 블록은 통상 1,024 바이트가 되며 데이터 포인터(data pointer)는 보통 4 바이트가 된다. 인덱스
의 길이가 3 바이트인 500,000개의 열이 있는 테이블의 경우 (MEDIUMINT의 크기), 공식은 log(500,000)/log(1024/3×2/(3
+4)) + 1 = 4 검색(seek)이 된다.
이 인덱스는 대략 500,000 × 7 × 3/2 = 5.2MB (전형적인 인덱스 버퍼 공간 비율을 2/3로 가정함)의 스토리지 공간을 필요로
하게 되며, 따라서 여러분은 메모리에 충분한 인덱스를 가지고 있으며 열을 찾기 위해서는 한 두 번의 데이터 읽기를 실행하기만 하
면 된다.
하지만, 쓰기의 경우에는, 새로운 인덱스 값을 저장할 위치를 찾는데 4번의 검색을 하여야 하고 인덱스를 업데이트 하고 열을 쓰기
위해서는 2번의 검색을 해야 한다.
위에서 설명하는 것은, 여러분의 어플리케이션이 로그 N에 의해서 성능이 저하된다는 것을 의미하는 것은 아니다. 모든 것이 OS
또는 MySQL에 의해 캐시가 되는 한, 테이블이 점점 커지는 만큼만 느려지게 된다. 데이터가 캐시 되지 못할 정도로 커지게 된 후
에는, 디스크 검색 (로그 N에 의해 늘어난)이 어플리케이션을 한정하기 전까지 점점 속도가 저하되기 시작한다. 이러한 현상을 없
애기 위해서는, 키 캐시의 크기를 데이터가 늘어나는 만큼 늘려 주면 된다. MyISAM 테이블의 경우, 키 캐시의 크기는
key_buffer_size 시스템 변수가 제어한다. Section 7.5.2, “서버 파라미터 튜닝하기”를 참조할 것.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=2&scate=2&idx=15792006-08-08 오후 5:58:20
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 일반적으로, 속도가 느린 SELECT ... WHERE 쿼리를 보다 빠르게 만들기 위해서는, 우선 여러분이 인덱스를 하나 추가 할 수 있
는지를 검사해 본다. 서로 다른 테이블간의 모든 참조 사항들은 보통 인덱스를 가지고서 이루어 진다. 여러분은 EXPLAIN 명령문
7.2.3 SELECT 쿼리의 속도
을 사용해서 SELECT에 사용할 수 있는 인덱스에는 어떤 것들이 있는지를 알아볼 수가 있다. Section 7.2.1, “EXPLAIN를 사용
해서 쿼리 최적화 하기”, 및 Section 7.4.5, “MySQL은 인덱스를 어떻게 사용하는가”를 참조할 것.
● MySQL이 쿼리를 보다 잘 최적화 하도록 하기 위해서는, 데이터를 읽어온 다음에 ANALYZE TABLE를 사용하거나 또는
myisamchk –analyze를 테이블에서 구동 시킨다. 이를 통해서 동일한 값을 가지고 있는 열의 평균 수를 가리키는 각 인덱
스 부분을 업데이트 한다. (고유의 인덱스의 경우, 이 값은 항상 1이다.) MySQL은 이것을 사용해서 항수가 아닌(non-
constant) 수식 형태의 두 개의 테이블을 조인(join)할 때 어떤 인덱스를 선택해야 하는지를 결정한다. 여러분은You can
check the result from the table analysis by using SHOW INDEX FROM tbl_name를 사용한 테이블 분석과
Cardinality 값의 조사를 통해서 그 결과를 검사할 수가 있다. myisamchk --description –verbose는 인덱스 분포에 대
한 정보를 보여 준다.
● 하나의 인덱스에 따라서 인덱스 및 데이터의 정렬을 위해서는, myisamchk --sort-index --sort-records=1 (여러분
이 인덱스 1에 대한 정렬을 하고자 한다고 가정한다)를 사용한다. 만일 여러분이 인덱스의 순서에 따라서 모든 열을 읽고
자 하는 고유의 인덱스를 가지고 있는 경우에는, 이것은 매우 좋은 방법이 된다. 이러한 방식으로 커다란 테이블을 처음으
로 정렬하는 경우에는, 시간이 매우 오래 걸리게 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=2&scate=3&idx=15802006-08-08 오후 5:58:21
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 이 섹션에서는 WHERE 구문을 처리하기 위해 만들 수 있는 최적화 방법에 대해서 설명하기로 한다. 이 섹션에서 사용되는 예문들
은 SELECT 명령문을 사용하지만, DELETE 와 UPDATE 명령문에 있는 WHERE 구문에 대한 최적화에도 동일한 최적화 방식
7.2.4 WHERE 구문 최적화
을 적용할 수가 있다.
MySQL 옵티마이저는 현재에도 계속 개발을 진행하고 있기 때문에, 이 섹션에서 설명하는 것들은 아직 완전하지가 않다. 하지만
MySQL은 이 문서에서 설명하는 것 이외의 많은 부분에서 최적화를 실행하고 있는 중이다.
● 필요 없는 괄호를 없앰:
● 항수 홀딩(Constant folding):
● 모든 가능성을 시도해서 테이블 조인(join)에 대한 가장 좋은 조인(join) 조합을 찾는다. 만일 If all columns in ORDER
BY 와 GROUP BY 구문에 있는 모든 컬럼이 동일한 테이블에서 나온다면, 조인을 진행할 때 그 테이블을 우선 사용한다.
● 만일 ORDER BY 구문이 있고 이와는 틀린 GROUP BY 구문이 존재하거나, 또는 만일 ORDER BY 또는 GROUP BY 구문
이 조인 큐(join queue)에 있는 첫 번째 테이블이 아닌 다른 테이블로부터 컬럼을 가져 온다면, 임시 테이블이 생성된다.
● 만일 여러분이 SQL_SMALL_RESULT 옵션을 사용한다면, MySQL은 메모리에 있는 임시 테이블을 사용한다.
● 각 테이블 인덱스는 쿼리화가 되며, 그리고 테이블 스캔을 사용하는 것이 보다 효과적이라고 옵티마이저가 판단하지 않는
한 가장 좋은 인덱스를 사용하게 된다. 처음에는, 가장 좋은 인덱스가 테이블의 30% 이상을 처리하는지에 따라서 테이블
스캔을 사용하지만, 인덱스 또는 테이블 스캔 사용간의 선택에 대한 정확한 비율은 정해지지 않았다. 옵티마이저는 보다 복
잡해졌고, 또한 테이블 크기, 열의 수, I/O 블록 크기 등의 추가적인 요소로 인해 추정치가 변하였다.
● 어떤 상황에서는, MySQL은 데이터 파일을 참조하지 않은 채로 테이블에서 열을 읽기도 한다. 만일 인덱스에서 사용된 모
든 컬럼이 숫자(numeric)일 경우에는, 인덱스 트리만을 가지고 쿼리를 해석하게 된다.
● 각각의 열을 내보내기 전에는, HAVING 구문과 일치하지 않는 것들은 건너 띄게 된다.
WHERE key_part1=constant;
MySQL은 인덱스 트리만을 가지고 아래의 쿼리를 해석하는데, 인덱스된 컬럼이 숫자(numeric)이라는 가정을 한다:
아래의 쿼리는 별개의 정렬 경로를 사용하지 않는 상태로 정렬된 순서에 있는 열을 추출하기 위해 인덱싱을 사용한다:
ORDER BY key_part1,key_part2,... ;
제목검색
7.2.5 범위 최적화
7.2.5.1 단일 부분 인덱스에 대한 범위 접근 방식
range 접근 방식은 하나 또는 여러 개의 인덱스 값 인터벌(interval)내에 포함되어 있는 테이블 열의 서브 셋(subset)을 추출하기
7.2.5.2 다중 부분 인덱스에 대한 범위 접근 방식
위해서 단일 인덱스를 사용한다. 이것은 단일 부분 또는 다중 부분 인덱스를 위해 사용될 수 있다. 다음에 나오는 섹션에서는
WHERE 구문에서 인터벌(interval)을 어떻게 얻을 수 있는지에 대해 자세히 설명을 하기로 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=2&scate=5&idx=15822006-08-08 오후 5:58:36
:::MySQL Korea:::
제목검색
7.2.5.1. 단일 부분 인덱스에 대한 범위 접근 방식
상위메뉴리스트 ◆
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 단일 부분 인덱스의 경우, 인덱스 값 인터벌(index value intervals)은 WHERE 구문에 있는 조건문에 상응해서 쉽게 표현될 수가
7.2.5 범위 최적화 있으며, 따라서 우리는 “인터벌(interval)”이라는 표현 보다는 범위 조건(range conditions)이라고 표현을 하겠다.
7.2.5.1 단일 부분 인덱스에 대한 범위 접근 방식
단일 부분 인덱스에 대한 범위 조건의 정의는 다음과 같다:
7.2.5.2 다중 부분 인덱스에 대한 범위 접근 방식
● BTREE 와 HASH 인덱스 모두에 대해서는, 항수 값을 가지고 있는 키 부분의 비교는 =, <=>, IN, IS NULL, 또는
IS NOT NULL 연산자를 사용할 경우에 범위 조건이 된다.
● BTREE 인덱스의 경우, 항수 값을 가지는 키 부분의 비교는 >, <, >=, <=, BETWEEN, !=, 또는 <> 연
산자, 또는 LIKE 'pattern' (이때의 'pattern'는 와일드카드로 시작되지 않음)을 사용할 때 범위 조건이 된다.
● 모든 타입의 인덱스의 경우, 다중 범위 조건은 OR 또는 AND 형태의 범위 조건과 연결된다.
● 쿼리 스트링에서 나오는 항수
● 동일한 조인(join)에서 나오는 const 또는 system 테이블의 컬럼
● 서로 연결되어 있지 않는 서브 쿼리의 결과
● 위의 타입에 대한 서브 수식(subexpression)으로만 구성되어 있는 모든 수식
SELECT * FROM t1
SELECT * FROM t1
WHERE key_col = 1
OR key_col IN (15,18,20);
SELECT * FROM t1
MySQL은 각각의 모든 가능한 인덱스에 대해 WHERE 구문으로부터 범위 조건을 추출하고자 시도한다. 추출 과정 동안, 범위 조
건을 구축하는데 사용되지 않는 조건들은 제거(dropped)되고, 범위 중첩(overlapping range)을 만드는 조건들은 서로 연결이 되
며, 비어 있는 범위를 만드는 조건들은 제거된다.
아래의 명령문을 검토해 보면, key1은 인덱스된 컬럼이며, nonkey은 인덱스가 되지 않았다:
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR
2. (key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR
5. nonkey = 4 와 key1 LIKE '%b'를 제거하는데, 그 이유는 이것들은 범위 조건을 위해 사용되지 않기 때문이다.
TRUE를 가지고 이것들을 대체하면 되며, 이렇게 하면 매치가 되는 모든 열은 범위를 스캔 할 때 누락이 생기지 않게 된
다. TRUE를 가지고 대체를 하면, 다음의 것을 얻게 된다:
(key1 < 'abc' AND TRUE) OR (key1 < 'bar' AND TRUE) OR (FALSE)
일반적인 경우(위의 설명에서 예시한 대로), 범위 스캔용으로 사용된 조건은 WHERE 구문보다는 덜 제한적이다. MySQL은
WHERE 구문이 아닌 범위 조건을 충족하는 열을 걸러내기 위한 추가적인 검사를 진행한다.
범위 조건 추출 알고리즘은 임의적인 깊이(arbitrary depth)의 네스티드(nested) AND/OR 구조를 처리하며, 그 결과는 WHERE
구문에서 나오는 조건에 있는 순서와는 관련을 갖지 않는다.
제목검색
7.2.5.2. 다중 부분 인덱스에 대한 범위 접근 방식
상위메뉴리스트 ◆
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 다중 부분 인덱스상의 범위 조건은 단일 부분 인덱스에 대한 범위 조건의 확장이다. 다중 범위 인덱스상의 범위 조건은 한 개 또는
7.2.5 범위 최적화 여러 개의 키 튜플(key tuple) 인터벌 내에 인덱스 열을 놓는 것을 제한한다. 키 튜플(Key tuple) 인터벌은 인덱스로부터 순서를
7.2.5.2 다중 부분 인덱스에 대한 범위 접근 방식
예를 들면, 다중 부분 인덱스가 key1(key_part1, key_part2, key_part3)로 정의가 되고, 키 순서에서 나열된 키 튜플 셋이 다음
과 같다고 가정하자:
NULL 1 'abc'
NULL 1 'xyz'
NULL 2 'foo'
1 1 'abc'
1 1 'xyz'
1 2 'abc'
2 1 'aaa'
인터벌은 위의 데이터 셋의 4번째, 5번째, 그리고 6번째 튜플을 커버(cover)하며 범위 접근 방식에 의해 사용될 수 있다.
● HASH 인덱스의 경우에는, 독립적인 값을 가지고 있는 각각의 인터벌들이 사용된다. 이것은 아래의 형태에 있는 조건에 대
해서만 인터벌이 만들어진다는 것을 의미한다:
• AND ...
● BTREE 인덱스의 경우, 하나의 인터벌을 AND와 결합된 조건에 대해서 사용할 수가 있는데, 여기에서 각각의 조건은 키
부분을 =, <=>, IS NULL, >, <, >=, <=, !=, <>, BETWEEN를 사용하는 항수 값, 또는 LIKE
'pattern' (이때의 'pattern'은 와일드카드로 시작되지 않음)과 비교를 한다. 조건과 매치되는 모든 열을 가지고 있는 단일
키 튜플(key tuple)을 판단할 수 있는 한 하나의 인터벌을 사용할 수가 있게 된다 (또는 만일 <> 또는 != 가 사용되
단일 인터벌은:
인터벌은:
이 예제에서 보면, 첫 번째 줄의 인터벌은 왼쪽 경계에 대해서는 하나의 키 부분을 사용하고 오른쪽 경계에 대해서는 두 개
의 키 부분을 사용하고 있다. 두 번째 줄의 인터벌은 하나의 키 부분만을 사용하고 있다. EXPLAIN의 결과에 있는
key_len 컬럼은 사용된 키 접두사(prefix)의 최대 길이를 나타낸다.
어떤 경우에는, key_len가 사용된 키 부분을 가리키기도 하지만, 여러분이 기대하였던 것이 아닌 경우도 있다.
key_part1 및 key_part2 이 NULL 이라고 가정하자. 그렇게 되면 key_len 컬럼은 아래의 조건에 대해서 두 개의 키 부
분 길이를 표시한다:
제목검색
Note: 만일 여러분이 MySQL의 예전 버전에서 업그레이드를 했다면, 조인(join)최적화에 대한 이러한 형태는 5.0에서부터 소개되
었고, 또한 인덱스에 관련해서 상당한 변화가 있다는 점을 유의해야 한다. (이전 버전에서는, MySQL은 각각의 참조 테이블에 대해
서는 하나의 인덱스만을 사용할 수 있었다.)
EXPLAIN의 결과에서 보면, 인덱스 병합 방식은 type 컬럼 안에 있는 index_merge 형태로 나타난다. 이와 같은 경우, 키 컬럼은
사용된 인덱스 리스트를 가지며, 그리고 key_len는 이러한 인덱스에 대한 가장 긴 키 부분 리스트를 가진다.
예제:
AND t2.key1=t1.some_col;
WHERE t1.key1=1
● Using intersect(...)
● Using union(...)
● Using sort_union(...)
● 만일 범위 스캔이 어떤 키에서 가능하다면, 인덱스 병합은 고려되지 않는다. 예를 들면, 아래의 쿼리를 고려해 보자:
• SELECT * FROM t1 WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
하지만, 옵티마이저는 두 번째 스캔만을 고려한다. 만일 여러분이 원하는 것이 이것이 아니라면, If that is not what you
want, you can make the optimizer consider Index Merge by using IGNORE INDEX 또는 FORCE INDEX을 사용함
으로써 옵티마이저가 인덱스 병합을 고려하도록 만들 수가 있다. 아래의 쿼리는 인덱스 병합을 사용해서 실행된다:
WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
● 만일 여러분의 쿼리가If your query has a AND/OR 네스팅(nesting)을 사용하는 복잡한 WHERE 구문을 가지고 있고
MySQL이 옵티말 플랜(optimal plan)을 선택하지 않는다면, 아래의 아이덴티티(identity) 규칙을 사용해서 단어(term)
를 분산해 본다:
• (x AND y) OR z = (x OR z) AND (y OR z)
● 인덱스 병합은 전체 문장(fulltext) 인덱스에는 적용되지 않는다. 이 부분에 대해서는 향후 MySQL 버전에서 다루기로 한
다.
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 이 접근 알고리즘은 WHERE 구문이 AND와 결합된 서로 다른 키 상에 있는 여러 개의 범위 조건으로 변환될 때 사용될 수 있으
예제:
인덱스 병합 교차 알고리즘은 모든 사용된 인덱스상에서 동시에 스캔을 실행하고 병합된 인덱스 스캔으로부터 전달 받는 열 시퀀스
(row sequence)에 대한 교차를 만들어 낸다.
만일 사용된 인덱스가 쿼리에서 사용된 모든 컬럼을 커버(cover)한다면, 전체 테이블 열은 추출되지 않는다 (이 경우 EXPLAIN
결과는 Extra 필드(field)에 있는 Using index를 가진다). 아래에는 이러한 쿼리의 예가 있다:
만일 사용된 인덱스가 쿼리에서 사용된 모든 컬럼을 커버하지 못한다면, 사용된 모든 키에 대한 범위 조건이 만족스러울 때에만 전
체 열이 추출된다.
만일 병합된 조건 중의 하나가 InnoDB 또는 BDB 테이블의 주요 키(primary key)에 걸쳐지는 조건이라면, 이 조건은 열 추출용으
로 사용되지는 않지만, 다른 조건을 사용해서 추출된 열을 걸러 낼 때(filter out) 사용된다.
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 이 알고리즘에 대한 표준은 인덱스 병합 방식 교차 알고리즘과 유사하다. 이 알고리즘은 OR와 결합된 서로 다른 키 상에서 테이블
7.2.6 인덱스 병합 최적화 의 WHERE 구문이 여러 개의 범위 조건으로 변환될 때 적용될 수 있으며, 각 조건은 아래의 것 중에 하나가 된다:
예제:
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=2&scate=6&idx=15872006-08-08 오후 5:59:06
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 이 접근 알고리즘은 WHERE 구문이 OR에 의해 결합된 여러 개의 범위 조건으로 변환될 때 적용되지만, 인덱스 병합 방식 결합
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=2&scate=6&idx=15882006-08-08 오후 5:59:07
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 MySQL은 col_name = constant_value용으로 사용할 수 있는 col_name IS NULL상의 최적화를 동일하게 수행한다. 예를 들면,
MySQL은 IS NULL를 사용해서 NULL에 대한 검색을 위해 인덱스와 범위를 사용한다.
7.2.7 IS NULL 최적화
예제:
만일 WHERE 구문이 NOT NULL로 선언된 컬럼에 대한 col_name IS NULL 조건을 포함하고 있다면, 그 수식은 최적화와는 거
리가 멀게 된다. 최적화는 컬럼이 NULL을 만들어 내는 경우에는 일어나지 않는다
MySQL은 또한 col_name = expr AND col_name IS NULL와 같은 조합에 대해서도 최적화를 할 수가 있는데, 이러한 형태는 서
브 쿼리 해석에서는 일반적인 것이다. EXPLAIN은 이러한 최적화가 사용되는 경우에 ref_or_null를 표시한다.
최적화된 쿼리의 예문 중에서, 테이블 t2의 a 와 b 컬럼상에 하나의 인덱스가 존재한다고 가정하자:
ref_or_null은 참조 키에서 한번의 읽기를 실행하고, 그 다음에 NULL 키 값을 가지고 열에 대한 별개의 검색을 실행한다.
최적화는 오직 한번의 IS NULL 레벨을 처리한다는 점을 기억하자. 아래의 쿼리에서 보면, MySQL 은 수식 (t1.a=t2.a AND t2.a
IS NULL)에서만 키 룩업(lookup)을 사용하며 b에 있는 키 부분은 사용할 수가 없다:
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 ORDER BY와 연결되어 있는 DISTINCT 는 많은 경우에 임시 테이블을 필요로 한다.
는 컬럼과 함께 MySQL이 어떻게 동작을 하는지를 반드시 알아 두어야 한다. Section 12.10.3, “숨겨진 필드가 있는 GROUP
BY”를 참조.
대부분의 경우, DISTINCT 구문은 GROUP BY의 특별한 경우(case)로 간주된다. 예를 들면, 아래의 두 쿼리는 동일한 것이다:
SELECT c1, c2, c3 FROM t1 WHERE c1 > const GROUP BY c1, c2, c3;
위의 것이 동일한 것이기 때문에, GROUP BY 쿼리에 적용되는 최적화는 DISTINCT 구문을 가지고 있는 쿼리에도 또한 적용이
될 수 있다. 따라서, DISTINCT 쿼리에 대한 최적화 가능성에 대한 보다 자세한 설명은, Section 7.2.13, “GROUP BY 최적
화”를 참조하기 바란다.
LIMIT row_count 를 DISTINCT에 연결을 할 때에는, MySQL은 row_count 고유(unique) 열을 찾는 즉시 멈추게 된다.
만일 여러분이 쿼리에 명명되어 있는 테이블에 있는 컬럼을 사용하지 않는다면, MySQL은 매치되는 것을 처음으로 찾는 즉시 아
직 사용되지 않은 테이블에 대해서는 스캐닝을 멈추게 된다. 아래의 경우, t1이 t2 보다 먼저 사용된다고 가정하면 (여러분은
EXPLAIN로 검사할 수 있음), MySQL은 t2에서 맨 처음 열을 찾게 되면 t2에서의 읽기를 멈추게 된다 (t1에 있는 특정 열에 대
해).
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 MySQL은 아래와 같이 A LEFT JOIN B join_condition을 실행한다:
RIGHT JOIN의 실행은 테이블 규칙을 반대로 하는 LEFT JOIN의 실행과 유사하다.
조인(join) 옵티마이저는 조인되는 테이블의 순서를 계산한다. LEFT JOIN 또는 STRAIGHT_JOIN이 만들어 내는 테이블 읽기
순서는 조인(oin) 옵티마이저가 자신의 업무를 보다 빠르게 진행할 수 있도록 지원하는데, 그 이유는 검사를 해야 할 테이블 순열
(permutation)이 거의 없기 때문이다. 이것은 만일 여러분이 아래와 같은 타입의 쿼리를 실행한다면, MySQL LEFT JOIN이
MySQL로 하여금 d를 읽기 전에 b를 읽도록 하기 때문에 여기에서 전체 스캔을 진행한다는 점을 알아 두자.
SELECT *
WHERE b.key=d.key;
SELECT *
WHERE b.key=d.key;
LEFT JOIN의 경우, 만일 WHERE 조건이 생성된 NULL 열에 대해 항상 거짓(false)가 된다면, LEFT JOIN은 보통의 조인(join)
으로 변경된다. 예를 들면, t2.column1이 NULL이었다면, 아래의 쿼리에서는 WHERE 구문이 거짓이 될 것이다.
이렇게 하는 것이 보다 빠르게 수행되게 만드는 것인데, 그 이유는 MySQL이 t2를 t1 이전에 읽기 때문이다. 특정 테이블 순서를
실행하도록 하기 위해서는, STRAIGHT_JOIN를 사용한다.
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 MySQL 5.0.1 이후에는, 조인(join)을 표현하는 신텍스에서 네스티드 조인(nested join)을 사용할 수 있게 되었다. 아래에서 설명
7.2.10 네스티드 조인(Nested Join) 최적화 하는 내용은 Section 13.2.7.1, “JOIN 신텍스”에서 설명하고 있는 조인 신텍스를 참조한다.
table_factor 신텍스는 SQL 표준의 확장 형태이다. 표준 SQL의 경우에는 table_reference만을 허용하며, 괄호 안에 이것을 넣을
수는 없다. 만일 내부 조인(inner join)과 동일한 형태로서 table_reference 아이템 리스트에 있는 각각의 콤마를 고려한다면, 이
것은 보수적인 확장(conservative extension)이 된다. 예를 들면:
은 아래와 동일하다:
SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
MySQL에서는, CROSS JOIN은 INNER JOIN과 언어적으로 동일한 의미를 표현한다(이 둘은 서로 대체해서 사용할 수가 있다).
표준SQL의 경우, 이 둘은 동일한 것이 아니다. INNER JOIN은 ON 구문과 함께 사용된다; 그렇지 않은 경우에는 CROSS JOIN이
사용된다.
MySQL 5.0.1 이전 버전에서는, table_references에 있는 괄호는 생략 되었고 모든 조인(join) 연산은 왼쪽으로 그룹화가 되었
다. 일반적으로, 괄호는 내부 조인 연산(inner join operation)만을 가지고 있는 조인 수식(join expression)에서만 생략될 수가
있다.
ON t1.a=t2.a
하지만, 두 개의 수식은 동일한 것이 아니다. 이것을 알아 보기 위해, 테이블 t1, t2, 그리고 t3가 다음의 상태를 가지고 있다고 가정
하자:
mysql> SELECT *
-> FROM t1
-> ON t1.a=t2.a;
+------+------+------+------+
|a |a |b |b |
+------+------+------+------+
| 1| 1 | 101 | 101 |
+------+------+------+------+
mysql> SELECT *
+------+------+------+------+
|a |a |b |b |
+------+------+------+------+
| 1| 1 | 101 | 101 |
+------+------+------+------+
mysql> SELECT *
+------+------+------+------+
|a |a |b |b |
+------+------+------+------+
| 1| 1 | 101 | 101 |
+------+------+------+------+
mysql> SELECT *
+------+------+------+------+
|a |a |b |b |
+------+------+------+------+
| 1| 1 | 101 | 101 |
+------+------+------+------+
따라서, 만일 여러분이 외부 조인 연산자(outer join operator)를 사용하는 조인 수식에서 괄호를 생략한다면, 우리는 원래의 수식
에 대한 결과 셋을 변경해야 할지도 모른다.
다음의 수식은:
t2, t3
네스티드 조인은 왼쪽 조인 연산과 함께 처음 쿼리에서 형성되어 있는데 비해서, 두 번째 쿼리에서는 네스티드 조인은 내부 조인 연
산과 함께 구성되어 있다.
처음 쿼리의 경우, 괄호는 생략될 수 있다: 조인 수식의 문법적인 구조는 조인 연산에 대한 실행 순서와 동일하다. 두 번째 쿼리의
경우, 비록 여기에서의 조인 수식은 명백하게 해석될 수 있다고 하더라도 괄호는 생략할 수 없다. (우리의 확장 신텍스의 경우, 비
록 이론적으로는 두 번째 쿼리를 괄호 없이 파싱(parsing)을 시킬 수는 있다고 하더라도, 이 쿼리의 (t2, t3)에서는 괄호가 필요하
게 된다: 우리는 여전히 쿼리에 대해 명확한 이론적 구조를 가지고 있는데, 왜냐하면 LEFT JOIN 및ON 은 수식 (t2,t3)에 대한 왼
쪽과 오른쪽의 구획 문자(delimiter) 역할을 하기 때문이다.)
● 내부 조인(외부 조인이 아님)만을 포함하고 있는 조인 수식의 경우는, 괄호를 생략할 수가 있다. 여러분은 괄호를 제거하
고 왼쪽에서 오른쪽으로 진행 시킬 수가 있다 (또는, 사실은, 테이블을 어떤 순서로도 진행 시킬 수가 있다).
● 일반적인 경우, 내부 조인과 함께 혼합되어 있는 외부 조인에 대해서는 일치하지가 않는다(not true). 괄호를 제거하면 결
과가 변경될 수 있다.
네스티드 외부 조인을 가지고 있는 쿼리는 내부 조인을 가지고 있는 쿼리와 동일한 파이프 라인 방식으로 실행이 된다. 보다 정확
히 표현하면, 네스티드 루프 조인 알고리즘(nested-loop join algorithm)의 변형된 형태가 많이 사용된다. 우리는 3 개의 테이블
T1,T2,T3 에 걸친 조인 쿼리를 가지고 있다고 가정하자:
WHERE P(T1,T2,T3).
여기에서, P1(T1,T2) 및 P2(T3,T3)은 일종의 조인(join) 조건(수식상에서)인데 비해서, P(t1,t2,t3)는 테이블 T1,T2,T3 컬럼
의 조건이 된다
IF P(t1,t2,t3) {
t:=t1||t2||t3; OUTPUT t;
t1||t2||t3는 “열 t1, t2, 및 t3의 컬럼을 연쇄적으로 연결해서 만든 열”을 의미한다. 아래에 있는 예제 중에서, 열의 이름이 나
타나는 NULL은 이것을 해당 열의 각 컬럼에서 사용한다는 것을 의미한다. 예를 들면, t1||t2||NULL은 “열 t1 과 t2의 컬럼을
연쇄적으로 연결해서 만든 열, 그리고 t3의 각 컬럼에 대해서는 NULL”을 의미한다.
ON P1(T1,T2)
WHERE P(T1,T2,T3).
BOOL f1:=FALSE;
BOOL f2:=FALSE;
IF P(t1,t2,t3) {
t:=t1||t2||t3; OUTPUT t;
f2=TRUE;
f1=TRUE;
IF (!f2) {
IF P(t1,t2,NULL) {
t:=t1||t2||NULL; OUTPUT t;
f1=TRUE;
IF (!f1) {
IF P(t1,NULL,NULL) {
t:=t1||NULL||NULL; OUTPUT t;
일반적인 경우, 외부 조인 연산에서 첫 번째의 내부 테이블에 대한 네스티드 루프에 대해서는, 루프가 시작되기 전에 꺼지고
(turned off) 루프를 수행한 후에 검사를 받는 플래그(flag)가 추가된다. 플래그는 외부 테이블의 현재 열에 대해 내부 연산자를 표
시하는 테이블에서 매치되는 것이 발견되면 켜지게 된다(turn on). 만일 루프 사이클 마지막까지 플래그가 여전히 꺼져 있다면, 외
부 테이블의 현재 열에 대해 아무런 매치도 발견되지 않았다는 것이다. 이와 같은 경우, 열은 내부 테이블 컬럼에 대해서 NULL 값
으로 보완 된다. 결과 열은 결과에 대한 마지막 검사를 진행하거나 또는 다음 네스티드 루프로 들어가게 되지만, 그 열이 모든 임베
디드 외부 조인(embedded outer join)의 조인 조건을 만족할 경우에만 해당된다.
우리의 예제에서 보면, 아래의 수식으로 표현된 외부 조인 테이블(outer join table)은 임베디드된다:
내부 조인을 가지고 있는 쿼리에 대해서는, 옵티마이저가 아래의 것과 같은 별도의 네스티드 루프 순서를 선택한다:
IF P(t1,t2,t3) {
t:=t1||t2||t3; OUTPUT t;
외부 조인을 가지고 있는 쿼리의 경우, 옵티마이저는 외부 테이블에 대한 루프가 내부 테이블을 위한 루프보다 앞서는 경우의 순서
만을 선택한다. 따라서, 외부 조인을 가지고 있는 우리의 쿼리에 대해서는, 단지 하나의 네스팅 순서(nesting order)만이 가능하
WHERE P(T1,T2,T3)
BOOL f1:=FALSE;
IF P(t1,t2,t3) {
t:=t1||t2||t3; OUTPUT t;
f1:=TRUE
IF (!f1) {
IF P(t1,NULL,NULL) {
t:=t1||NULL||NULL; OUTPUT t;
그리고:
BOOL f1:=FALSE;
IF P(t1,t2,t3) {
t:=t1||t2||t3; OUTPUT t;
f1:=TRUE
IF (!f1) {
IF P(t1,NULL,NULL) {
t:=t1||NULL||NULL; OUTPUT t;
두 가지의 네스팅에서 보면, T1은 외부 루프에서 처리되어야 하는데, 그 이유는 이것이 외부 조인에서 사용되기 때문이다. T2 및
T3는 내부 조인에서 사용되며, 따라서 이것들은 내부 루프에서 처리되어야 한다. 하지만, 조인이 내부 조인이기 때문에, T2 및 T3
는 둘 중의 하나의 순서로 처리될 수가 있다.
이와 같은 경우, MySQL은 실제로 내부 조인을 가지고 있는 쿼리를 실행하기 위해 아래의 네스티드 루프 스키마를 사용하게 된다:
IF P(t1,t2,t3) {
t:=t1||t2||t3; OUTPUT t;
여러분은 각각의 결합(conjunct) C1(T1), C2(T2), C3(T3)들이 실행될 때 가장 내부에 있는 루프를 가장 외부 루프로 밀어 내
는 것을 볼 수 있을 것이다. 만일 C1(T1)이 매우 제한적인 조건이라면, 이 조건 푸시 다운은 내부 루프에 전달된 테이블 T1에서 열
의 숫자를 현격하게 줄일 수 있게 된다. 결과적으로, 쿼리의 실행 시간이 매우 많이 개선이 되는 것이다.
외부 조인을 가지고 있는 쿼리의 경우, WHERE 조건은 외부 테이블의 현재 열이 내부 테이블에서 매치가 되는 것을 발견한 후에
만 검사된다. 따라서, 조건을 내부 네스티드 루프 밖으로 밀어 내는 최적화는 외부 조인을 가지고 있는 쿼리에는 직접적으로 적용
할 수가 없다. 여기에서 우리는 하나의 매치를 발견할 때 켜지는 플래그가 보호하는 조건 푸시 다운(conditional push-down) 술
어(predicate) 개념을 추가해야 했다.
BOOL f1:=FALSE;
BOOL f2:=FALSE;
t:=t1||t2||t3; OUTPUT t;
f2=TRUE;
f1=TRUE;
IF (!f2) {
t:=t1||t2||NULL; OUTPUT t;
f1=TRUE;
t:=t1||NULL||NULL; OUTPUT t;
하나의 내부 테이블에서 동일하게 네스티드 조인이 되어 있는 다른 테이블로의 접근은 만일 이 접근이 WHERE 조건에서의 술어
에 의해 발생될 경우에는 금지가 된다. (이와 같은 경우, 우리는 조건 키 접근을 사용하였지만, 이 기법은 아직까지 5.0에는 추가되
지 않았다.)
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 많은 경우에 있어서 쿼리의 FROM 구문에 있는 테이블 수식은 단순화 시킬 수가 있다.
옵티마이저가 외부 조인 연산을 가지고 있는 조인 쿼리에 대한 플랜을 계산할 때, 이것은 각각의 연산에 대해서는, 외부 테이블을
내부 테이블보다 먼저 접근하는 플랜에 대해서만 고려를 하게 된다. 옵티마이저의 옵션들은 제한적이 되는데, 그 이유는 이러한 플
랜들만이 네스티드 루프 스키마에 의한 외부 조인 연산을 가진 쿼리를 실행할 수 있도록 하기 때문이다.
이 쿼리의 R(T2)는 T2로부터 많은 수의 매칭 열을 가지고 있다고 가정한다. 만일 우리가 쿼리를 위와 같이 실행 시킨다면, 옵티마
이저는 매우 비 효율적인 실행 플랜을 가지고 테이블 T1을 테이블 T2 전에 접속하는 것 이외에는 선택을 하지 못하게 된다.
T2.B > 3,
T2.B IS NULL,
어떤 조건이 외부 조인 연산에 대해서 널 값 거부인지 아닌지를 검사하는 일반적인 규칙은 간단하다. 아래의 경우에 해당되면 널
값 거부(null-rejected) 조건이 된다:
하나의 조건이 어떤 쿼리에서는 외부 조인 연산에 대해서 널 값 거부가 되고 다른 쿼리에 대해서는 그렇지 않게 될 수도 있다. 아래
의 쿼리에서 보면:
만일 WHERE 조건이 하나의 쿼리에서 외부 조인 연산에 대한 널 값 거부가 되면, 그 외부 조인 연산은 내부 조인 연산으로 대체가
된다.
원래의 쿼리에 대해서는, 옵티마이저는 오직 하나의 접속 순서인T1,T2,T3 와 호환되는 플랜만을 계산한다. 대체되는 쿼리에 대해
서는, 옵티마이저는 접속 시퀀스 T3,T1,T2에 대해서도 추가적으로 고려를 하게 된다.
다음과 같이 우선 변환 된다:
때로는 하나의 임베디드 외부 조인 연산을 대체할 수도 있으나, 임베디드 외부 조인을 변환시킬 수는 없다. 다음의 쿼리는:
ON T2.A=T1.A
ON T2.A=T1.A
(T2,T3)
WHERE 조건은 임베디드 외부 조인에 대해서는 널 값 거부 조건이 아니지만, 임베딩 외부 조인(embedding outer join) T2.
A=T1.A AND T3.C=T1.C의 조인에 대해서는 널 값 거부 조건이 된다. 따라서 위의 쿼리는 아래와 같이 변환 될 수 있다:
(T2, T3)
외부 조인 연산을 내부 조인으로 변환 시키는 알고리즘은 MySQL 5.0.1에서 전체적으로 구현되었다. MySQL 4.1 버전에서는 일
부 기능만이 실행되었다.
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 어떤 경우에는, MySQL은 어떠한 추가 정렬 행위를 하지 않고서도 하나의 인덱스만을 사용해서 ORDER BY 구문을 만족 시킬 수
있게 된다.
7.2.12 ORDER BY 최적화
인덱스의 사용하지 않는 모든 부분과 모든 여분의 ORDER BY 컬럼이 WHERE 구문에서 항수로 되어 있는 한, ORDER BY가 인덱
스와 정확히 매치가 되지 않는다고 하더라도 위의 형태로 사용할 수가 있게 된다. 아래의 쿼리들은 인덱스를 사용해서 ORDER BY
부분을 해석하고 있다:
SELECT * FROM t1
ORDER BY key_part1,key_part2,... ;
SELECT * FROM t1
WHERE key_part1=constant
ORDER BY key_part2;
SELECT * FROM t1
SELECT * FROM t1
WHERE key_part1=1
어떤 경우에는, MySQL이 WHERE 구문과 매치되는 열을 찾기 위해 인덱스를 여전히 사용하고 있다고 하더라도, 그 인덱스를 사
용해서 ORDER BY를 해석하지 못하는 경우가 있다. 아래의 경우가 이에 해당한다:
● 여러분이 많은 테이블을 조인(joining)하는 중이고, ORDER BY에 있는 컬럼들이 열을 복원하는데 사용된 맨 처음의 비 항
수 테이블에서 나온 것들이 아니다. (이것은 EXPLAIN 결과에 있는 const 조인 타입을 가지고 있지 않는 첫 번째 테이블이
다.)
● 여러분은 서로 다른 ORDER BY 와 GROUP BY 수식을 가지고 있다.
● 사용된 테이블 인덱스 타입이 순서에 맞게 열을 저장하지 않는다. 예를 들면, 이것은 MEMORY 테이블에 있는 HASH 인덱
EXPLAIN SELECT ... ORDER BY를 사용하면, 여러분은 MySQL이 인덱스를 가지고 쿼리를 해석할 수 있는지를 알아볼 수가 있
게 된다. 만일 여러분이 Extra 컬럼에 있는 Using filesort를 사용한다면, MySQL은 인덱스를 사용해서 쿼리를 해석할 수 없게 된
다. Section 7.2.1, “EXPLAIN을 사용해서 쿼리 최적화 하기”를 참조.
filesort 최적화는 정렬 키 값과 열 위치 및 쿼리용으로 요구되는 컬럼 기록을 사용한다. filesort 알고리즘은 아래와 같이 동작을 한
다:
만일 ORDER BY의 속도를 증가시키고 싶다면, 여러분이 추가적인 정렬을 실행하지 않고 인덱스를 사용하도록 MySQL을 만들 수
있는지를 검사하면 된다. 만일 이렇게 하는 것이 불가능하다면, 아래의 전략을 사용하도록 한다:
디폴트로, MySQL은 마치 여러분이 쿼리 안에 ORDER BY col1, col2, ... 를 지정한 것처럼 모든 GROUP BY col1, col2, ... 쿼리
를 정렬한다. 만일 여러분이 동일한 컬럼 리스트를 가지고 있는 ORDER BY 구문을 명확하게 포함시킨다면, MySQL은 비록 정렬
이 여전히 일어날 지라도, 어떠한 속도의 저하 없이 이것을 최적화 시키게 된다. 만일 쿼리가 GROUP BY를 포함하고는 있으나 여
러분은 그 결과를 정렬하는 오버헤드를 피하고자 한다면, ORDER BY NULL을 지정해 줌으로서 정렬 동작을 억제 시킬 수가 있
다. 예를 들면:
제목검색
GROUP BY를 위한 인덱스 사용에 있어서 가장 중요한 선결 조건은 모든 GROUP BY 컬럼 참조가 동일한 인덱스에서 속성을 가
져오고, 인덱스는 자신의 키를 순서대로 저장한다는 것이다 (예를 들면, 이것은 BTREE 인덱스이며 HASH 인덱스가 아님). 임
시 테이블 사용을 인덱스 접속으로 대체할 수 있는지는 쿼리에서 사용된 인덱스 부분과, 이 부분을 지정하는 조건, 그리고 선택된
집합 함수에 따라 정해진다.
인덱스 접속을 통한 GROUP BY 쿼리 실행에는 두 가지 방법이 있다. 첫 번째 방법은, 그룹 연산을 모든 범위 술어(존재할 경우)
와 함께 적용시키는 것이며, 두 번째로는 범위 스캔을 우선 실행하고, 그 다음에 결과 튜플 그룹에 대해 스캔을 하는 방법이 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=2&scate=13&idx=15952006-08-08 오후 5:59:37
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 가장 효과적으로 GROUP BY를 처리하는 방법은 인덱스를 사용해서 그룹 필드에서 직접 데이터를 추출할 때이다. 이러한 접속 방
7.2.13 GROUP BY 최적화 식을 통해서, MySQL은 키를 정렬시키는 인덱스 타입의 특성을 사용하게 된다 (예를 들면, BTREE). 이러한 특성은 모든
7.2.13.1 느슨한 인덱스 스캔(Loose index scan) WHERE 조건을 만족시키는 인덱스내의 모든 키를 고려하지 않는 상태로 인덱스에 있는 룩업 그룹(lookup group)을 사용할 수 있
도록 해 준다. 이러한 접속 방식은 인덱스 안에 있는 키 조각(fraction)만을 고려하며, 따라서 이것을 느슨한 인덱스 스캔(loose
7.2.13.2 타이트한 인덱스 스캔(Tight index
scan) index scan)이라고 부른다. 아무런 WHERE 구문이 존재하지 않을 경우, 느슨한 인덱스 스캔은 그룹의 수 만큼의 키를 읽어 오며,
이것은 모든 키 숫자보다는 훨씬 작은 숫자가 된다. 만일 WHERE 구문이 범위 술어를 가지고 있다면 (range 조인 타입에 대한
Section 7.2.1, “Optimizing Queries with EXPLAIN”를 참조할 것), 느슨한 인덱스 스캔은 범위 조건을 만족시키는 각 그룹의
첫 번째 키를 조사하고, 최소 가능 키 숫자를 다시 읽게 된다. 이것은 아래의 조건하에서 가능해 진다:
이러한 쿼리에 대한 EXPLAIN의 결과는 Extra 컬럼에 Using index for group-by를 보여준다.
아래의 쿼리들은 이러한 범주에 속하는 것이며, 여기에는assuming that there is an index 테이블 t1(c1,c2,c3,c4)상에 idx(c1,
c2,c3) 인덱스가 있다고 가정한다:
SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 > const GROUP BY c1, c2;
다음의 쿼리들은 이러한 선택 방식을 가지고서는 실행될 수 없는데, 그 이유는 다음과 같다:
● The fields in the GROUP BY 구문에 있는 필드는 인덱스 시작 부분을 참조하지 못한다:
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 타이트 인덱스 스캔은 쿼리 조건에 따라서 전체 인덱스 스캔 또는 범위 인덱스 스캔이 될 수 있다.
아래의 쿼리는 위에서 설명한 느슨한 인덱스 스캔 접속 방식과는 동작을 하지는 않지만, 타이트한 인덱스 스캔 접속 방식과는 동작
을 한다 (인덱스 idx(c1,c2,c3) t1(c1,c2,c3,c4)에 인덱스 idx(c1,c2,c3)가 존재한다고 가정하자).
● GROUP BY는 키의 처음 부분을 가지고서는 시작하지 않지만, 그 부분에 대한 항수를 제공하는 조건이 존재한다:
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 어떤 경우에는, MySQL은 여러분이 LIMIT row_count은 사용하면서 HAVING은 사용하지 않으면 쿼리를 다른 방식으로 다루게
● 만일 여러분이 LIMIT를 사용해서 적은 수의 열만을 선택한다면, MySQL은 전체 테이블 스캔을 행하는 인덱스를 사용한
다.
● 만일 여러분이 LIMIT row_count를 ORDER BY와 함께 사용한다면, MySQL은 정렬된 결과의 첫 번째 row_count 열을
찾은 즉시 정렬 동작을 마친다. 만일 인덱스를 사용해서 순서를 매기게 된다면, 이것은 속도가 매우 빠르게 된다. 만일 파
일 정렬이 마쳐졌다면, LIMIT 구문이 없이 쿼리와 매치가 된 모든 열은 선택되어야 하고, 이러한 것들은 거의 모두 저장이
되어야 하며, 이런 동작들은 첫 번째 row_count 열이 발견되기 전에 이루어져야 한다. 둘 중의 하나의 경우에라도, 처음의
열이 발견된 후에는, 결과 셋의 나머지 부분에 대한 추가적인 정렬은 필요없게 되며, MySQL은 이를 실행하지 않는다.
● LIMIT row_count를 DISTINCT와 연결을 할 때, MySQL은 고유의 row_count 열(unique rows)을 찾는 즉시 멈추게 된
다.
● 어떤 경우에는, 순서대로(또는 키를 정렬함으로서) 키를 읽고 키 값이 변경될 때까지 요약 계산을 실행함으로써 GROUP
BY를 해석할 수가 있다. 이와 같은 경우, LIMIT row_count 는 필요하지 않은 모든 GROUP BY 값은 계산하지 않는다.
● MySQL이 필요한 열의 수를 클라이언트로 보내고 난 후에, 여러분이 SQL_CALC_FOUND_ROWS를 사용하지 않는 한 쿼
리를 즉시 끝내 버린다.
● LIMIT 0은 재빨리 비어 있는 셋(empty set)을 하나 돌려준다. 이것은 쿼리의 유효성을 검사하는데 유용하게 사용할 수
가 있다. MySQL API 중의 하나를 사용할 경우에, 결과 컬럼 타입을 얻기 위해서도 이것을 사용할 수가 있다. (이것은
MySQL 모니터 (mysql 프로그램)에서는 동작을 하지 않는데, 이것은 단지 이와 같은 경우의 Empty set을 보여주기만 한
다; 대신에 여러분은 이러한 목적으로는 SHOW COLUMNS 또는 DESCRIBE 를 사용하면 된다.)
● 서버가 쿼리를 해석하기 위해서 임시 테이블을 사용한다면, 서버는 얼마의 공간이 필요한지를 계산하기 위해서 LIMIT
row_count 구문을 사용한다.
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 EXPLAIN의 결과는 MySQL이 쿼리를 해석하기 위해 테이블 스캔을 사용할 때 type 컬럼에 있는 ALL을 보여준다. 이것은 일반적
● 테이블이 너무 작아서 키 룩업(lookup)을 실행하는 것보다 테이블 스캔을 하는 것이 더 빠르다. 일반적으로10개 미만의 짧
은 길이의 열을 가진 테이블이 여기에 해당한다.
● 인덱스가 된 컬럼에 대한 ON 또는 WHERE 구문에서는 유용하게 사용할 수 있는 제약이 존재하지 않는다.
● 여러분은 인덱스된 컬럼을 항수 값과 비교할 수 있고 MySQL은 테이블의 대부분을 커버하고 있는 항수를 계산하고 테이
블 스캔이 빠르게 진행되도록 만든다. Section 7.2.4, “WHERE 구문 최적화”를 참조할 것.
● 여러분은 다른 컬럼을 통해서 낮은 기수(cardinality)를 가지고 있는(많은 열이 키 값과 매치가 됨) 열을 사용할 수 있다.
이와 같은 경우, MySQL은 키 값을 사용함으로써 많은 키 룩업(lookup)이 진행이 되며 이에 따라서 테이블 스캔이 보다 빠
를 것이라고 가정을 한다.
작은 테이블의 경우, 테이블 스캔은 종종 a table scan often is appropriate and the performance impact is negligible. 대형 테
이블의 경우, 옵티마이저가 올바르지 않은 테이블 스캔을 선택하지 못하도록 하기 위해서는 아래의 기법을 따라서 시도해 본다:
● 스캔이 된 테이블에 대해서 키 배포를 업데이트 하기 위해서 ANALYZE TABLE tbl_name를 사용한다.
Section 13.5.2.1, “ANALYZE TABLE 신텍스”를 참조할 것.
● 주어진 인덱스를 사용하는 것 보다 테이블 스캔을 하는 것이 보다 비효율적이라고 MySQL에게 말하도록 하기 위해서, 스
캔이 된 테이블에 대해서 FORCE INDEX를 사용한다:
• WHERE t1.col_name=t2.col_name;
● 옵티마이저에게 어떠한 키 스캔도 1,000 개의 키 검색(key seek) 이상을 발생시키지 않는다고 가정하도록 만들기 위해서
는, mysqld을 --max-seeks-for-key=1000 옵션과 함께 시작하거나 또는 SET max_seeks_for_key=1000를 사용
한다. Section 5.2.2, “서버 시스템 변수”를 참조할 것.
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 열을 삽입하는데 필요한 시간은 아래의 요소들을 가지고 판단할 수가 있는데, 여기에서 보여주는 숫자는 대략적인 수치이다:
여기에는 테이블을 처음에 열 때 발생하는 오버헤드는 고려하지 않았는데, 이것은 동시에 구동하는 각 쿼리에 대해서 한번씩 발생
을 한다.
● 추가적인 작업으로는, 많은 수의 인덱스를 가지고 있는 MyISAM 테이블에 대해서 보다 빠른 LOAD DATA INFILE을 만
들 수가 있는데, 이렇게 하기 위해서는 아래의 과정을 따라 진행한다:
● 비 트랜젝셔널 테이블에 대해서 다중 명령문과 함께 실행되는 INSERT 연산의 속도를 향상 시키기 위해서는, 여러분의 테
이블에 대해 잠금을 실행한다:
• ...
• UNLOCK TABLES;
이렇게 함으로써 속도를 개선 시킬 수가 있는데, 그 이유는 인덱스 버퍼는 모든 INSERT 명령문이 실행이 완료된 후에 디
스크에 오직 한번만 플러시 되기 때문이다. 보통의 경우, INSERT 명령문의 개수만큼의 인덱스 버퍼 플러시가 생기게 된
다. 만일 여러분이 단일 INSERT 명령문만을 가지고 모든 열을 삽입할 수가 있다면, 명확한 잠금 명령문은 필요하지 않게
된다.
트랜젝셔널 테이블에 대해서, 보다 빠른 삽입 성능을 얻기 위해서는, LOCK TABLES를 사용하는 대신에, 여러분은
START TRANSACTION 와 COMMIT를 사용해야 한다.
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 업데이트 명령문은 추가적인 쓰기 동작의 오버 헤드를 가지고 있는 SELECT 쿼리와 유사하게 최적화가 이루어진다. 쓰기의 속도
는 업데이트가 되는 데이터의 양과 인덱스의 숫자에 따라 다르게 나타난다. 변경이 되지 않는 인덱스는 업데이트가 되지 않는다.
7.2.17 UPDATE 명령문의 속도
업데이트의 속도를 빠르게 만들 수 있는 다른 방법은 개별적인 업데이트는 지연을 시킨 후에 나중에 하나의 열에 대해서 업데이트
를 한꺼번에 실행하는 것이다. 여러분이 테이블을 잠가 놓았을 경우에는, 여러 개의 업데이트를 한꺼번에 실행하는 것이 한번에 하
나의 업데이트를 실행하는 것 보다 훨씬 빠른 속도를 나타낸다.
동적 열 포멧을 사용하고 있는 MyISAM 테이블의 경우, 열 전체에 대해서 업데이트를 실행할 경우에는 열이 나누어질 수도(split)
있다. 만일 이것을 자주 실행한다면, OPTIMIZE TABLE을 많이 사용하는 것이 중요하다. Section 13.5.2.5, “OPTIMIZE
TABLE 신텍스”를 참조할 것.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=2&scate=17&idx=16012006-08-08 오후 5:59:54
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 개개의 열을 삭제하는데 필요한 시간은 인덱스의 숫자 비율과 정확히 일치한다. 열을 보다 빠르게 삭제를 하기 위해서는,
7.2.18 DELETE 명령문의 속도 key_buffer_size 시스템 변수를 증가 시켜서 키 캐시의 크기를 높이면 된다. Section 7.5.2, “서버 파라미터 튜닝하기”를 참조
할 것.
하나의 테이블에 있는 모든 열을 삭제하기 위해서는, TRUNCATE TABLE tbl_name를 사용하는 것이 DELETE FROM
tbl_name보다 빠를 것이다. Section 13.2.9, “TRUNCATE 신텍스”를 참조할 것.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=2&scate=18&idx=16022006-08-08 오후 5:59:55
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.2. SELECT 및 다른 명령문 최적화 하기 이 섹션에서는 쿼리의 처리 속도를 개선 시키기 위한 여러 가지의 최적화 팁에 대해서 설명을 하기로 한다:
• WHERE hash_col=MD5(CONCAT(col1,col2))
이것은 테이블-레벨 잠금(단일 라이터(writer)를 가지고 있는 다중의 리더(reader))만을 가지고 있는 MyISAM 테이블
과 같은 스토리지 엔진을 사용할 경우에는 매우 중요하다.
제목검색
상위메뉴리스트 ◆ 7.3. 잠금 이슈
7. 최적화(Optimization) 7.3.1. 잠금 방법
7.3. 잠금 이슈 7.3.2. Table 잠금 이
7.3 잠금 이슈 슈
7.3.1 잠금 방법 7.3.3. 동시 삽입
7.3.2 테이블 잠금 이슈
7.3.3 동시 삽입
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=3&scate=0&idx=16042006-08-08 오후 6:00:25
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆ 7.3.1. 잠금 방법
7. 최적화(Optimization)
7.3. 잠금 이슈 MySQL은 MyISAM 및 MEMORY 테이블에 대해서는 테이블 레벨 잠금을 사용하며 BDB 테이블에 대해서는 페이지 레벨의 잠금
많은 경우에, 여러분은 어떤 어플리케이션에 대해 가장 최선의 잠금 방식을 경험적으로 선택할 수 있으나, 주어진 잠금 방식이 다
른 타입에 비해 우수하다고 단정짓는 것은 매우 어렵다. 사용하는 어플리케이션에 따라서 서로 다른 잠금 방식을 사용할 수 있다.
스토리지 엔진을 열 레벨 잠금과 함께 사용하기 위해서는, 여러분이 사용하는 어플리케이션 및 이것이 사용하는 선택 및 업데이트
가 어떤 것들이 있는지를 잘 살펴 보아야 한다. 예를 들면, 대부분의 웹 어플리케이션들은 많은 선택은 하지만, 상대적으로 적은 삭
제를 하며, 업데이트는 주로 키 값을 기반으로 실행하고, 열 삽입은 몇몇 특정 테이블에 대해서만 실행을 한다. MySQL MyISAM
설정은 이런 용도에 잘 들어 맞게 튜닝된 것이다.
MySQL에서의 테이블 잠금은 테이블 레벨 잠금을 사용하는 스토리지 엔진에 대해서는 데드락-프리(deadlock-free)가 된다. 쿼
리를 시작할 때 항상 모든 필요한 잠금을 한번에 요청하고 항상 동일한 순서로 테이블을 잠금으로써 데드락 없앰(Deadlock
avoidance)을 제어할 수가 있게 된다.
+-----------------------+---------+
| Variable_name | Value |
+-----------------------+---------+
| Table_locks_immediate | 1151552 |
| Table_locks_waited | 15324 |
+-----------------------+---------+
만일 MyISAM 테이블이 중간에 어떠한 자유 블록(free block)도 가지고 있지 않다면, 열 삽입은 항상 데이터 파일의 맨 마지막에
이루어진다. 이와 같은 경우, 여러분은 자유롭게 INSERT 및 SELECT 명령문을 동시에 잠금 없이 MyISAM 테이블 용으로 사용
할 수 있다. 즉, 여러분은 다른 클라이언트가 MyISAM 테이블을 읽는 동안에도 이 테이블 안에 열을 삽입할 수가 있다는 것이다.
만일 여러분이 동시 삽입이 불 가능한 경우에도 많은 수의 INSERT 및 SELECT 동작을 한 테이블에서 실행하고자 한다면, 여러분
은 임시 테이블에 열을 삽입하고 나중에 이 임시 파일에 있는 열을 가지고 실제 테이블을 업데이트 하면 된다. 이것은 아래의 코드
를 가지고 실행하면 된다:
InnoDB는 열 레벨의 잠금을 사용하고 BDB는 페이지 레벨의 잠금을 사용한다. 이 두 가지 스토리지 엔진의 경우, 데드락이 발생할
가능성이 있는데, 그 이유는 이 엔진들은 트랜젝션이 시작되는 시점이 아닌SQL 명령문을 실행하는 동안 자동으로 잠금을 얻어내
기 때문이다.
● SELECT은 INSERT 명령문과 동시에 연결이 되어 있고, UPDATE 또는 DELETE 명령문과는 거의 연결이 되어 있지 않
다.
● 어떠한 라이터(writer)도 없이 많은 수의 스캔 또는 GROUP BY 동작이 전체 테이블에서 이루어진다.
제목검색
7. 최적화(Optimization)
7.3. 잠금 이슈 매우 빠른 잠금 속도를 얻기 위해서, MySQL은 InnoDB 및 BDB를 제외한 모든 스토리지 엔진에 대해서는 테이블 잠금을 사용한
7.3.2 테이블 잠금 이슈 다.
InnoDB 및 BDB 테이블에 대해서는, MySQL은 여러분이 LOCK TABLES를 가지고 명확하게 테이블을 잠그는 경우에만 테이블
잠금을 사용한다. 이러한 스토리지 엔진에 대해서는, 우리는 여러분이 LOCK TABLES를 사용하지 말 것을 권장하는데, 그 이유
는 페이지 트랜젝션 분리(isolation)를 위해서 InnoDB은 자동 열 레벨 잠금을 그리고 BDB 는 자동 레벨 잠금을 사용하기 때문이
다.
대형 테이블의 경우, 대부분의 어플리케이션에 대해서는 열 잠금 보다는 테이블 잠금이 보다 좋기는 하지만, 아래와 같이 몇 가지
의 예외적인 경우가 존재한다:
● 테이블 잠금은 많은 수의 쓰레드가 하나의 테이블에서 동시에 읽기를 실행할 수 있도록 해 주지만, 만일 하나의 쓰레드가
테이블에 쓰기를 하고자 한다면, 그 쓰레드는 테이블에 대해서 완벽한 접속(exclusive access)를 우선 가져야만 한다. 업
데이트를 하는 동안에는, 모든 다른 쓰레드는 업데이트가 끝날 때까지 대기를 해야만 한다.
● 일반적인 경우, 테이블 업데이트는 테이블 복원 보다 더 중요하게 고려되는데, 따라서 이것이 우선 순위가 높게 매겨진다.
이것은 테이블에 대해서 많은 양의(heavy) SELECT 실행이 있다고 하더라도 테이블에 대한 업데이트는 “굶음
(starved)”이 되지 말아야 한다는 것을 의미한다.
● 테이블 잠금은 디스크가 꽉 차서 쓰레드를 진행 시키기 전에 여유 공간이 필요하기 때문에 쓰레드가 대기를 해야 하는 경우
에는 문제의 원인이 되기도 한다. 이와 같은 경우, 문제 테이블에 접속을 하고자 하는 모든 쓰레드는 사용 가능한 디스크 공
간이 생길 때 까지 대기 상태가 되어 버린다.
아래의 사항들은 테이블 잠금에 의해 야기되는 경쟁 상황을 피하거나 또는 절감 시킬 수 있는 여러 가지 방법을 설명해 주는 것들이
다:
● 짧은 시간 동안만 테이블을 잠그도록 하기 위해 SELECT 명령문이 빠르게 구동되도록 만든다. 이렇게 하기 위해서는 요
약 테이블을 생성해야 할 것이다.
● Mysqld을 --low-priority-updates와 함께 시작한다. 이것은 테이블을 업데이트(수정)하는 모든 명령문에 대해서
SELECT 명령문 보다 낮은 우선 순위를 할당해 준다. 이렇게 하면, 앞의 시나리오에서 나오는 두 번째 SELECT 명령문은
UPDATE 명령문 보다 먼저 실행이 되며, 처음의 SELECT가 끝날 때까지 대기를 할 필요가 없게 된다.
● SET LOW_PRIORITY_UPDATES=1 명령문을 사용하면, 특정 접속에서 입력된 모든 업데이트에 대해서는 낮은 우선 순
위를 가지도록 지정할 수 있게 된다. Section 13.5.3, “SET 신텍스”를 참조.
● LOW_PRIORITY 속성을 사용해서 특정 INSERT, UPDATE, 또는 DELETE 명령문이 낮은 우선 순위를 가지도록 할 수
있다.
● HIGH_PRIORITY 속성을 사용하면 특정 SELECT 명령문이 높은 우선 순위를 가지도록 만들 수가 있다. Section 13.2.7,
“SELECT 신텍스”를 참조.
● mysqld이 max_write_lock_count 시스템 변수에 대해서 낮은 우선 순위를 가지고 시작을 하도록 해서 MySQL로 하여금
특정 수의 열 삽입이 이루어진 테이블을 기다리는 모든 SELECT 명령문의 우선 순위를 임시적으로 높일 수 있도록 만들
수가 있다. 특정 수의 WRITE 잠금을 실행한 후에 READ 잠금을 허용한다..
● 만일 여러분이 SELECT와 연결되어 있는 INSERT에 문제를 가지고 있다면, MyISAM 테이블 변환(switching)을 고려해
볼만 한데, 이것은 동시 SELECT 및 INSERT 명령문을 지원한다. (Section 7.3.3, “동시 삽입”을 참조.)
● 만일 여러분이 동일한 테이블에서 삽입과 삭제를 혼용해서 사용한다면, INSERT DELAYED 가 매우 큰 도움을 줄 것이
다. Section 13.2.4.2, “INSERT DELAYED 신텍스”를 참조.
● 만일 SELECT 및 DELETE 명령문 혼용에 있어서 어떠한 문제가 발생한다면, DELETE에 대한 LIMIT 옵션이 도움이 될
것이다. Section 13.2.1, “DELETE 신텍스”를 참조할 것.
● SQL_BUFFER_RESULT를 SELECT 명령문과 함께 사용하는 것이 테이블 잠금 기간을 줄이는데 도움이 될 것이다.
Section 13.2.7, “SELECT 신텍스”를 참조할 것.
● 여러분은 mysys/thr_lock.c에 있는 잠금 코드를 변경 시키면 단일 큐를 사용할 수 있게 된다. 이렇게 하면, 쓰기 잠금 및
읽기 잠금은 동일한 우선 순위를 가지게 되며, 몇몇 어플리케이션 실행에 도움이 되기도 한다.
제목검색
상위메뉴리스트 ◆ 7.3.3. 동시 삽입
7. 최적화(Optimization)
7.3. 잠금 이슈 MyISAM 테이블의 경우, 테이블 중간에 삭제된 열이 없다면, 여러분은 SELECT 명령문이 구동 중에 있는 동안에도 열을 추가하
동시 삽입이 사용될 수 있는 환경 아래에서는, INSERT 명령문에 대해서는 DELAYED 수정자(modifier)를 사용할 필요가 거의
없게 된다. Section 13.2.4.2, “INSERT DELAYED 신텍스”를 참조할 것.
만일 여러분이 바이너리로그를 사용하고 있다면, 동시 삽입은 CREATE ... SELECT 또는 INSERT ... SELECT 명령문에 대해서
는 정상 삽입(normal insert)로 변환 된다. 이것은 백업 동작이 진행되는 동안 로그를 적용 시킴으로써 여러분이 테이블의 정확한
복사본을 재 생성할 수 있게 끔 해 준다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=3&scate=3&idx=16072006-08-08 오후 6:00:37
:::MySQL Korea:::
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=4&scate=0&idx=18492006-08-08 오후 6:00:44
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 MySQL은 열 데이터와 인덱스 데이터를 서로 별도의 파일에서 관리한다. 거의 대부분의 다른 데이터 베이스 시스템은 열 데이터
7.4.1 디자인 선택 와 인덱스 데이터를 동일 파일에서 같이 관리를 하고 있다. 우리는 MySQL이 선택한 방식에 현대적인 시스템에 보다 잘 맞는 것이
라고 생각을 하고 있다.
열 데이터를 저장하는 다른 방법은 각 컬럼의 정보를 별도의 구역(area)에 두는 것이다(예를 들면 SDBM 및 Focus). 이렇게 하면
모든 쿼리가 한번 이상 컬럼을 접속해야 하기 때문에 성능의 이슈가 발생한다. 이런 방식은 범용 데이터 베이스에는 그다지 좋은 방
식이 아니라고 생각을 한다.
보다 일반적인 방식은 인덱스와 데이터를 같이 저장하는 것이다. (오라클/ 사이베이스 등등이 이 방식을 사용한다). 이럴 경우, 여
러분은 열에 대한 정보를 인덱스의 리프 페이지(leaf page)에서 찾아 볼 수가 있게 된다. 이런 레이 아웃의 장점으로는, 인덱스가
얼마나 잘 캐시되어 있는지에 따라서, 디스크의 공간을 절약 시켜 준다는 것이다. 이 레이 아웃이 갖는 단점은 다음과 같다:
● 데이터를 가져 오기 위해서는 인덱스 전체를 읽어야 하기 때문에 테이블 스캔의 속도가 느려지게 된다.
● 인덱스 테이블만을 사용해서는 쿼리용 데이터를 추출할 수가 없게 된다.
● 노드에 인덱스를 중복 저장(duplicate)해야 하기 때문에 보다 많은 디스크 공간이 필요하게 된다 (열을 노드에 저장할 수
가 없다).
● 삭제 동작으로 인한 테이블 오버 타임(over time)이 발생한다 (노드에 있는 인덱스는 보통의 경우 삭제 중에는 업데이트
가 되지 않기 때문임).
● 인덱스 데이터만을 캐시하는 것이 보다 어렵다.
제목검색
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 가장 기본적인 최적화 컴퍼넌트 중의 하나는 가능한 한 디스크의 공간을 작게 가지도록 테이블을 디자인 하는 것이다. 이렇게 함으
7.4.2 데이터를 가능한 한 작게 만들기 로써 디스크 읽기의 속도를 개선 시킬 수 있으며, 따라서 테이블이 작을수록 쿼리를 실행하는 동안 실제로 처리되는 컨텐츠가 메인
메모리를 적게 차지하게 된다. 인덱싱 또한 보다 작은 컬럼상에서 이루어 진다면 자원을 덜 차지하게 된다.
MySQL은 여러 가지의 스토리지 엔진(테이블 타입)과 열 포맷을 지원한다. 각각의 테이블에 대해서는, 어떤 스토리지 엔진과 인덱
싱 방식을 사용할 지를 여러분이 결정할 수가 있다. 여러분의 어플리케이션에 맞는 테이블 포맷을 잘 선택하는 것이 성능 향상에 커
다란 도움을 줄 것이다. Chapter 14, 스토리지 엔진과 테이블 타입 을 참조할 것.
여러분은 아래에 열거된 기법을 활용해서 최적의 테이블 타입 및 최소한의 스토리지 공간을 만들어 낼 수 있을 것이다:
● 가능한 한 최적의(가장 작은) 데이터 타입을 사용한다. MySQL에는 디스크 공간 민 메모리를 절약 시켜 주는 다양한 타입
들이 존재 한다. 예를 들면, 보다 작은 테이블을 가지기 위해서는 가능하면 정수 타입을 사용한다. MEDIUMINT이 INT 보
다는 종종 좀더 좋은 선택이 될 수 있는데, 그 이유는 MEDIUMINT 컬럼이 25% 정도 덜 공간을 차지하기 때문이다.
● 가능하다면 컬럼을 NOT NULL로 선언한다. 이렇게 하면 모든 것들이 빨라지고 컬럼 당 1 바이트의 공간을 절약 시킬 수
가 있다. 만일 어플리케이션에서 반드시 NULL을 사용해야 하는 경우라면, 그렇게 하도록 해야 하지만, 단지 모든 컬럼의
디폴트로는 사용하지 말기 바란다.
● MyISAM 테이블의 경우, 여러분이 변수 길이 컬럼(variable-length column) (VARCHAR, TEXT, 또는 BLOB 컬럼)을
가지고 있지 않다면, 고정 크기 열 포맷이 사용된다. 이런 형태는 속도는 빠르겠지만 불행하게도 공간은 더 차지하게 된다.
Section 14.1.3, “MyISAM 테이블 스토리지 엔진 포맷”을 참조할 것. 이런 사항으로 인해, 여러분은 VARCHAR 컬럼
을 CREATE TABLE 옵션 ROW_FORMAT=FIXED와 함께 가지고 있다고 하더라도 고정 길이 열을 가지는 것이 나을 것
콤팩트(compact) InnoDB 포맷은 UTF-8 데이터를 가지고 있는 CHAR 컬럼의 저장 방법도 변경 시켰다.
ROW_FORMAT=REDUNDANT 포맷의 경우, UTF-8 CHAR(N)는 3 × N 바이트로 구성 되었는데, UTF-8 의 엔코
딩된 문자의 최대 길이는 3 바이트로 주어졌다. 대부분의 언어는 주로 단일 바이트 UTF-8 문자로 쓰여질 수 있기 때문
에, 고정 스토리지 길이는 종종 공간을 허비 했다. ROW_FORMAT=COMPACT 포맷을 사용하는 경우에는, InnoDB는
변수를 N 에서 3 × N 바이트의 범위 내에서 할당을 해 준다.
제목검색
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 모든 MySQL 데이터 타입은 인덱스화 될 수 있다. 상호 연관된 컬럼상에서 인덱스 사용은 SELECT 연산의 성능을 향상시키기 위
테이블 당 최대 인덱스 숫자 및 최대 인덱스 길이는 스토리지 엔진별로 정의 된다. Chapter 14, 스토리지 엔진과 테이블 타입을 참
조할 것. 모든 스토리지 엔진은 테이블 당 최소 16개의 인덱스와 최소 256 바이트의 인덱스 길이를 지원한다.
인덱스 정의문에서 col_name(N)를 사용하면, 여러분은 스트링 컬럼에서 첫 번째 문자가 N인 것만을 인덱스할 수가 있다. 이러한
방식으로 컬럼 값의 접두사만을 인덱싱하면 인덱스 파일을 보다 작게 만들 수가 있다. 여러분이 BLOB 또는 TEXT 컬럼을 인덱스
할 때에는, 반드시 인덱스의 접두사(prefix) 길이를 지정해 주어야 한다. 예를 들면:
접두사(Prefixes)는 1000 바이트 길이까지 사용할 수가 있다 (InnoDB 테이블에 대해서는 767 바이트까지). 접두사의 길이 제한
은 바이트 단위이며, 반면에 CREATE TABLE 명령문에 있는 접두사의 길이는 문자의 숫자로 변환된다는 점을 알아 두자. 다중 바
이트 문자 셋을 사용하는 컬럼에 대한 접두사 길이를 지정할 때에는 이점을 명심한다.
여러분은 FULLTEXT 인덱스도 생성할 수가 있다. 이것은 전체 문장(full-text) 검색을 위해 사용된다. MyISAM 스토리지 엔진
만이 FULLTEXT 인덱스를 지원하며 CHAR, VARCHAR, 그리고 TEXT 컬럼에 대해서만 지원을 한다. 인덱싱은 항상 전체 컬럼
에서 이루어지며 부분적인 인덱싱은 지원되지 않는다. 자세한 사항은 Section 12.7, “전체-문장 검색(Full-Text Search) 함
수”를 참조할 것.
MEMORY 스토리지 엔진은 디폴트로 HASH 인덱스를 사용하지만, BTREE 인덱스도 지원을 한다.
제목검색
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 MySQL은 복합(composite) 인덱스를 만들 수가 있다 (즉, 다중 컬럼상의 인덱스). 하나의 인덱스는 최대 15개의 컬럼으로 구성
7.4.4 다중-컬럼 인덱스 될 수 있다. 특정 데이터 타입의 경우,여러분은 컬럼의 접두사를 인덱스할 수 있다 (see Section 7.4.3, “컬럼 인덱스”를 참조).
다중-컬럼 인덱스는 인덱스가 된 컬럼 값의 연쇄 연결로 만들어진 값을 가지고 있는 정렬된 어레이(sorted array)로 간주된다.
MySQL은 WHERE 구문에 있는 인덱스의 첫 번째 컬럼에 대해 비록 여러분이 다른 컬럼의 값은 지정하지 않았다고 하더라도, 여
러분이 알려진 양을 지정할 때 쿼리가 빨리 처리할 수 있도록 다중-컬럼 인덱스를 사용한다.
);
name 인덱스는 last_name 과 first_name 컬럼 전반에 대한 인덱스이다. 이 인덱스는 last_name, 또는 last_name 과 first_name
모두의 알려진 범위에 있는 값을 지정하는 쿼리를 위해 사용된다. 따라서 name 인덱스는 아래의 쿼리에서 사용된다:
WHERE last_name='Widenius'
WHERE last_name='Widenius'
쿼리의 속도를 향상 시키기 위해 MySQL이 인덱스를 사용하는 방법에 대해서는 Section 7.4.5, “MySQL의 인덱스 사용 방
법”에서 보다 자세히 다루기로 한다.
제목검색
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 인덱스는 특정 컬럼 값을 가지고 있는 열을 빨리 찾기 위해서 사용된다. 인덱스를 사용하지 않는다면, MySQL은 첫 번째의 열로부
7.4.5 MySQL의 인덱스 사용 방법 터 전체 테이블에 걸쳐서 연관된 열을 찾아야만 한다. 테이블이 크면 클수록 비용도 늘어나게 되는 것이다. 만일 테이블이 쿼리에
있는 질문 컬럼에 대한 인덱스를 가지고 있다면, MySQL은 모든 데이터를 조사하지 않고 데이터 파일의 중간에서 검색 위치를 재
빨리 알아낼 수가 있다. 만일 테이블이 1,000개의 열을 가지고 있다면, 이것은 최소 100배의 속도 향상을 가질 수가 있다. 만일 여
러분이 대부분의 열을 접속할 필요가 있는 경우라면, 순차적인 읽기(sequential read)가 더 빠르게 되는데, 그 이유는 이 방법이 디
스크 검색을 최소화 하기 때문이다.
대부분의 MySQL 인덱스 (PRIMARY KEY, UNIQUE, INDEX, 그리고 FULLTEXT)는 B-트리에 저장된다. 공간 테이터
(spatial data)의 경우는 R-트리를 사용한다는 것은 예외이며, 또한 MEMORY 테이블도 해시 인덱스(hash indexes)를 지원한다
는 점도 알아 두기 바란다.
스트링은 자동적으로 접두사-(prefix-)와 끝-공간(end-space) 압축이 된다. Section 13.1.4, “CREATE INDEX 신텍
스”를 참조할 것.
인덱스를 사용한다.
● 조인(join)을 실행할 때 다른 테이블에서 열을 추출하기.
● 특정하게 인덱스된 컬럼 key_col을 위한 MIN() 또는 MAX() 값 찾기. 이것은 인덱스에서 key_col 전에 발생하는 모든
키 부분의 WHERE key_part_N = constant를 여러분이 사용할 수 있는지를 검사하는 프리 프로세서(pre-processor)
에 의해 최적화 된다. 이와 같은 경우에는, MySQL은 각각의 MIN() 또는 MAX() 수식에 대해서 단일 키 룩업(lookup)을
하게 되며 이것을 항수로 대체한다. 만일 모든 수식이 항수로 대체가 되면, 쿼리는 즉시 리턴된다. 예를 들면:
• SELECT MIN(key_part2),MAX(key_part2)
• WHERE key_part1=1
만일 다중-컬럼 인덱스가 col1 과 col2에 존재한다면, 적당한 열을 직접 가져올 수 있게 된다. 만일 별개의 단일-컬럼 인덱스가
col1 과 col2에 존재한다면, 옵티마이저는 어떤 인덱스가 가장 적은 열을 찾아내는 가장 제한적인 인덱스를 찾으려고 시도를 한다.
만일 테이블이 다중-컬럼 인덱스를 가지고 있다면, 옵티마이저는 인덱스의 최 좌측 접두사를 사용해서 열을 찾게 된다. 예를 들면,
만일 여러분이 세개의 컬럼 인덱스를 (col1, col2, col3)에서 가지고 있다면, 여러분은 (col1), (col1, col2), 그리고 (col1, col2,
col3)상에서 검색 기능이 있는 인덱스를 가지게 되는 것이다.
MySQL은 컬럼이 인덱스의 최 좌측 접두사를 가지고 있지 않다면, 부분 인덱스를 사용할 수가 없게 된다. 여러분이 아래와 같은
SELECT 명령문을 가지고 있다고 가정하자:
만일 (col1, col2, col3)상에 인덱스가 하나 존재한다면, 처음 두 개의 쿼리만이 인덱스를 사용하게 된다. 세 번째와 네 번째도 인덱
스된 컬럼을 가지고 있기는 하지만, (col2) 와 (col2, col3) 는 (col1, col2, col3)의 최 좌측 접두사가 아니다.
B-트리 인덱스는 =, >, >=, <, <=, 또는 BETWEEN 연산자를 사용하는 수식에서 컬럼 비교를 위해 사용될 수 있다.
또한, LIKE에 대한 인수가 와일드 카드 문자로 시작되지 않는 항수 스크링일 경우에는, LIKE 비교를 위해서도 이 인덱스를 사용
할 수 있다. 예를 들면, SELECT 명령문은 인덱스를 사용한다:
첫 번째 명령문에서 보면, 'Patrick' <= key_col < 'Patricl'를 가지고 있는 열만이 고려되었다. 두 번째 명령문에서는, 'Pat'
첫 번째 명령문의 경우, LIKE 값은 와일드 카드 문자로 시작이 된다. 두 번째 명령문에서는, LIKE 값이 항수가 아니다.
만일 여러분이 ... LIKE '%string%'을 사용하고, string이 3개의 문자 보다 길다면, MySQL 은 스트링용 패턴을 초기화 시키기 위
해Turbo Boyer-Moore algorithm 을 사용하게 되며, 이 패턴을 사용해서 검색을 보다 빠르게 실행한다.
col_name IS NULL을 사용하는 검색은 col_name 이 인덱스 되어진 경우에는 적용할 수가 있다.
WHERE 구문에 있는 모든AND 레벨에 해당하지 않는 모든 인덱스는 쿼리를 최적화하는데 사용되지 않는다. 달리 표현하면, 인덱
스를 사용하기 위해서는, 인덱스의 접두사가 반드시 모든 AND 그룹에서 사용되어야 한다는 것이다.
/* index = 1 OR index = 2 */
때때로, MySQL은 인덱스를 사용할 수 있을 지라도 이것을 사용하지 않는 경우도 있다. MySQL이 인덱스를 사용하기 위해서는 테
이블의 거의 모든 열을 접속할 필요가 있다고 옵티마이저가 판단할 경우가 이에 해당한다. (이와 같은 경우에는, 테이블 스캔이 속
도가 더 빠르다.) 하지만, 만일 이러한 쿼리가 LIMIT를 사용해서 열의 일부분만 추출하는 경우에는, MySQL은 인덱스를 사용하
게 되는데, 그 이유는 결과를 리턴하기 위해서 찾아야 하는 열의 숫자가 작기 때문에 그 만큼 속도가 빠르기 때문이다.
● 이것은 = 또는 <=> 연산자를 사용하는 등식 비교에 대해서만 사용된다 (하지만 매우 빠름). 이것은 값의 범위를 찾
기 위한 < 와 같은 비교 연산자와는 사용되지 않는다.
● 옵티마이저는 ORDER BY 연산의 속도를 증가 시키기 위해 이것을 사용할 수가 없다. (이런 타입의 인덱스는 다음 순서의
엔트리를 위한 검색용으로 사용될 수 없다.)
● MySQL은 두 개의 값 사이에 얼마나 많은 열이 있는지를 추정할 수 없다 (이것은 사용한 인덱스가 어떤 것인지를 결정하
기 위한 범위 옵티마이저가 사용하는 것이다).
단지 전체 키만을 가지고 열에 대한 검색을 할 수가 있다. (B-트리 인덱스를 사용한다면, 키의 최 좌측 접두사가 열 검색에 사용될
수가 있다.)
제목검색
7. 최적화(Optimization) 7.4.6.1. 공유 키 캐시 접속
7.4. 데이터 베이스 구조 최적화 하기 7.4.6.2. 다중 키 캐시
7.4.6.2 다중 키 캐시 7.4.6.5. 키 캐시 블럭 크기
7.4.6.6. 키 캐시 재 구축하기
7.4.6.3 중간 삽입(Midpoint Insertion) 전략
7.4.6.4 인덱스 프리 로딩(Preloading)
7.4.6.5 키 캐시 블럭 크기
디스크의 I/O를 최소화 하기 위해서, MyISAM 스토리지 엔진은 대부분의 데이터 베이스 시스템이 사용하고 있는 전략을 사용하고
7.4.6.6 키 캐시 재 구축하기
있다. 이 엔진은 메모리에 있는 테이블 블록 중에서 가장 자주 사용이 되는 것의 정보를 보관하기 위한 캐시 매커니즘을 사용한다:
● 인덱스 블록의 경우, key cache (또는 key buffer)라고 불리는 특정 구조를 관리한다. 이 구조는 가장 많이 사용된 인덱
스 블록이 있는 블록 버퍼의 숫자를 가진다.
● 데이터 블록의 경우, MySQL는 특별한 캐시를 사용하지 않는다. 대신에 이 시스템은 원(native) OS의 파일 시스템 캐시
에 의존을 한다.
이 섹션에서는 우선 MyISAM 키 캐시의 기본 동작 원리에 대해 설명을 하며, 그런 다음에 키 캐시 성능을 개선시킬 수 있는 기능들
과 여러분이 캐시 동작을 보다 효과적으로 제어할 수 있는 방법에 대해 설명을 하기로 한다:
키 캐시의 크기를 제어하기 위해서는, key_buffer_size 시스템 변수를 사용한다. 만일 이 변수가 0(zero)으로 설정이 된다면, 아무
런 키 캐시도 사용되지 않는다. 키 캐시는 key_buffer_size 값이 너무 작아서 블록 버퍼(8)의 최소 숫자를 할당할 수 없는 경우에
도 키 캐시는 사용되지 않는다.
키 캐시가 동작을 하지 않게 되면, 인덱스 파일은 OS가 제공하는 원(native) 파일 시스템의 버퍼만을 사용해서 접속할 수 있다.
(달리 표현하면, 테이블 인덱스 블록은 테이블 데이터 블록에 적용된 동일한 전략을 사용해서 접속할 수가 있게 된다.)
인덱스 블록은 MyISAM 인덱스 파일에 대한 연속적인 접속 단위(contiguous unit of access)이다. 보통의 경우, 인덱스 블록의
크기는 인덱스 B-트리의 노드 크기와 일치하게 된다. (인덱스는 B-트리 데이터 구조를 사용해서 디스크에 나타낸다. 트리의 맨
밑에 있는 노드는 잎사귀(leaf)노드이다. 잎사귀 노드 위의 것들은 잎사귀 노드가 아니다.)
키 캐시 구조내에 있는 모든 블록 버퍼는 동일한 크기가 된다. 이 크기는 케이블 인덱스 블록의 크기와 같거나, 크거나, 또는 작을
수가 있다. 보통의 경우, 이 두 값들 중의 하나는 다른 하나의 볓 배수가 된다.
테이블 인덱스 블록으로부터 데이터를 접속할 때, 서버는 우선 이것이 키 캐시의 다른 블록 버퍼에서 사용 가능한 것인지를 검사한
다. 만일 가능 하다면, 서버는 디스크가 아닌 키 캐시에 있는 데이터를 접속한다. 즉, 서버는 캐시에서 읽어 오거나 캐시에 쓰게 된
다. 그렇지 않을 경우에는, 서버는 서로 다른 테이블 인덱스 블록(또는 블록)을 가지고 있는 캐시 블록 버퍼를 하나 선택하고 요청
을 받은 테이블 인덱스 블록의 복사본을 가지고 그것을 대체한다. 새로운 인덱스 블록이 캐시에 생기게 되면, 인덱스 데이터는 즉
시 접속될 수가 있게 된다.
만일 대체용으로 선택된 블록이 수정되어지면, 그 블록은 “오염(dirty)”된 것으로 간주된다. 이와 같은 경우가 발생하면, 대체를
하기 전에, 그 내용물을 테이블 인덱스로 플러시 해 버린다.
일반적으로 서버는 LRU (Least Recently Used) 전략을 따르게 된다: 대체용으로 블록을 선택할 때, 서버는 인덱스 블록 중에 최
근에 가장 덜 사용된 것을 고른다. 이러한 선택을 보다 쉽게 하기 위해서, 키 캐시 모듈은 사용
되는 모든 블록에 대해 특별한 큐(LRU chain)를 관리한다. 하나의 블록을 접속하면, 이것은 큐의 맨 마지막으로 들어가게 된다. 블
록을 대체할 필요가 생기면, 큐의 맨 처음에 있는 블록이 최근에 가장 덜 사용된 것이 되며 이 목적에 대한 첫 번째 후보가 되는 것
이다.
제목검색
7.4.6.1. 공유 키 캐시 접속
상위메뉴리스트 ◆
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 쓰레드는 아래의 조건에 관련하여 키 캐시 버퍼를 동시에 접속할 수가 있다:
7.4.6 MyISAM 키 캐시
● 업데이트 되지 않는 버퍼는 여러 개의 쓰레드에 의해 접속될 수 있다.
7.4.6.1 공유 키 캐시 접속
● 업데이트가 되는 버퍼는 업데이트가 완료될 때까지 이 버퍼를 사용하고자 하는 쓰레드를 대기 상태로 만든다.
7.4.6.2 다중 키 캐시
● 다중의 쓰레드는 서로간에 간섭을 하지 않는 한 캐시 블록을 대체하게끔 초기에 요청할 수가 있다 (즉, 쓰레드들이 서로 다
7.4.6.3 중간 삽입(Midpoint Insertion) 전략
른 인덱스 블록을 필요로 하는 한, 이것은 서로 다른 캐시 블록이 대체되게끔 한다).
7.4.6.4 인덱스 프리 로딩(Preloading)
7.4.6.5 키 캐시 블럭 크기
키 캐시에 대한 공유 접속은 서버의 성능을 획기적으로 개선 시켜 준다.
7.4.6.6 키 캐시 재 구축하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=4&scate=6&idx=18562006-08-08 오후 6:01:05
:::MySQL Korea:::
제목검색
7.4.6.2. 다중 키 캐시
상위메뉴리스트 ◆
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 키 캐시에 대한 공유 접속이 서버의 성능을 개선 시켜 주기는 하지만 쓰레드간의 전반적인 경쟁을 해소해 주지는 않는다. 쓰레드들
7.4.6 MyISAM 키 캐시 은 키 캐시 버퍼의 접속을 관리하기 위한 관리 구조에 대해서 서로 경쟁을 한다. 캐 캐시 접속 경쟁을 해소하기 위해서, MySQL는
7.4.6.2 다중 키 캐시
캐시에 서로 별도의 테이블 인덱스를 할당할 수가 있게 된다.
7.4.6.3 중간 삽입(Midpoint Insertion) 전략
7.4.6.4 인덱스 프리 로딩(Preloading)
7.4.6.5 키 캐시 블럭 크기
7.4.6.6 키 캐시 재 구축하기 다중 키 캐시가 존재하는 경우에는, 서버는 주어진 MyISAM 테이블에 대한 쿼리를 실행할 때 어떤 캐시를 사용해야 하는지를 알
고 있어야 한다. 디폴트로는, 모든 MyISAM 테이블 인덱스가 디폴트 키 캐시에 저장된다(cached). 테이블 인덱스를 특정 키 캐시
에 할당하기 위해서는, CACHE INDEX 명령문을 사용한다 (Section 13.5.5.1, “CACHE INDEX 신텍스”를 참조). 예를 들면,
아래의 명령문은 테이블 t1, t2, 및 t3 로 부터 hot_cache라는 이름의 키 캐시를 할당한다.
+---------+--------------------+----------+----------+
+---------+--------------------+----------+----------+
+---------+--------------------+----------+----------+
CACHE INDEX 명령문에서 참조되는 키 캐시는 statement can be created by setting its size with a SET GLOBAL 파라미
터 설정 명령문을 가지고 그 크기를 설정하거나 또는 서버 스타트업 옵션을 사용해서 생성을 할 수가 있다. 예를 들면:
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8384512 |
+-----------------+---------+
디폴트로는 테이블 인덱스는 서버가 스타트업 될 때 메인(디폴트) 키 캐시에 할당된다. 키 캐시를 없애 버리게 되면, 여기에 할당
된 모든 인덱스는 디폴트 키 캐시에 재 할당이 된다.
업무를 바쁘게 처리하는 서버의 경우, 우리는 세 가지 키 캐시를 사용하는 전략을 권장한다:
● “핫(hot)” 키 캐시: 모든 키 캐시에 할당된 공간(space)의 20% 이상을 차지하는 키 캐시. 업데이트는 없이 주로 검색용
으로 사용하는 테이블을 위해서는 이 키 캐시를 사용한다.
● “콜드(cold)” 키 캐시: 모든 키 캐시에 할당된 공간(space)의 20% 정도를 차지하는 키 캐시. 임시 테이블과 같이 중간
크기의 수정용으로 사용되는 테이블용으로는 이 키 캐시를 사용한다.
● “웜(warm)” 키 캐시: 모든 키 캐시에 할당된 공간(space)의 60% 이상을 차지하는 키 캐시. 다른 모든 테이블이 디폴트
로 사용하도록 이 캐시를 디폴트 키 캐시로 적용한다.
● 핫 캐시는 데이터 추출용 쿼리를 위해서만 사용되기 때문에, 이것이 가지고 있는 데이터는 결코 수정이 되지 않는다. 결과
적으로, 하나의 인덱스 블록을 디스크에서 가져올 필요가 있을 때마다, 대체용으로 선택된 캐시 블록의 내용물을 우선 플러
시 할 필요가 없어지게 된다.
● 핫 캐시에 할당된 인덱스의 경우, 만일 인덱스 스캔을 요구하는 쿼리가 존재하지 않는다면, 인덱스 B-트리의 잎사귀 노드
가 아닌 것에 대응하는 인덱스 블록이 캐시 안에 있을 가능성이 매우 높게 된다.
● 임시 테이블에 대해서 매우 자주 실행된 업데이트 동작은 업데이트가 된 노드가 캐시에 있을 경우에는 매우 빠르게 실행이
되며 디스크에서 먼저 읽어올 필요가 없어지게 된다. 만일 임시 테이블의 인덱스 크기가 콜드 키 캐시의 크기와 비슷하다
면, 업데이트 노드가 캐시 안에 있을 가능성이 매우 높게 된다.
CACHE INDEX은 테이블과 키 캐시간의 결합(association)을 설정하지만, 이 결합은 서버가 재 시작을 하면 잃어 버리게 된다. 만
일 여러분이 서버가 시작할 때 마다 이 결합이 이루어 지도록 만들고자 한다면, 옵션 파일을 사용하는 것이 하나의 방법이다: 캐 캐
시를 구성하는 변수 설정을 옵션 파일에 포함시키고, 실행될 CACHE INDEX 명령문을 가지고 있는 파일 이름을 init-file 옵션에
key_buffer_size = 4G
hot_cache.key_buffer_size = 2G
cold_cache.key_buffer_size = 2G
init_file=/path/to/data-directory/mysqld_init.sql
mysqld_init.sql 안에 있는 명령문은 서버가 시작될 때마다 실행된다. 파일 안에는 라인 당 하나의 SQL 명령문을 사용해야 한다.
다음의 예제는 몇몇 테이블을 hot_cache 와 cold_cache에 할당을 해 준다:
제목검색
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 디폴트로, 키 캐시 관리 시스템은 복원(evict)해야 할 키 캐시 블록을 선택하기 위해서 LRU 전략을 사용하지만, 소위 중간 삽입
7.4.6.1 공유 키 캐시 접속
7.4.6.2 다중 키 캐시
7.4.6.3 중간 삽입(Midpoint Insertion) 전략
중간 삽입(Midpoint Insertion) 전략을 사용할 경우, LRU 체인(chain)은 두 부분으로 나뉘어 진다: 핫 서브 체인(hot sub-
7.4.6.4 인덱스 프리 로딩(Preloading)
chain) 및 웜 서브 체인(warm sub-chain). 두 부분이 나눠지는 경계(point)는 정해지지는 않지만, 키 캐시 관리 시스템은 웜 부
7.4.6.5 키 캐시 블럭 크기 분(warm part)가 항상 키 캐시 블록의 최소 key_cache_division_limit 를 가질 수 있도록 “너무 작게(too short)”되지 않도록
7.4.6.6 키 캐시 재 구축하기 만들게 된다. key_cache_division_limit는 구조 키 캐시 변수의 컴퍼넌트(component)이기 때문에, 이것의 값은 캐시 당 설정되어
야 하는 파라미터가 된다.
인덱스 블록을 테이블에서 키 캐시로 읽어 들일 때, 이것은 웜 서브 체인(warm sub-chain)의 맨 마지막에 들어가게 된다. 특정 숫
자만큼의 히트(블록에 대한 접속)가 되고 나면, 이것은 핫 서브 체인(hot sub-chain)으로 개선(promote) 된다. 현재의 버전으로
보면, 블록(3)로 개선(promote)되는데 필요한 히트 수는 모든 인덱스 블록에 대해서 동일하게 적용된다.
핫 서브 체인으로 개선된 블록은 체인의 맨 마지막에 위치하게 된다. 그런 후에, 그 블록은 이 서브 체인 안에서 순환된다
(circulate). 만일 이 블록이 서브 체인의 처음 부분에 오랫동안 있게 된다면, 이것은 다시 웜 체인으로 내려지게 된다. 이렇게 되는
시간은 키 캐시의 key_cache_age_threshold 컴퍼넌트 값을 가지고 판단된다.
중간 삽입(Midpoint Insertion) 전략을 통해 여러분은 캐시 안에 보다 가치를 가지는 블록을 유지할 수 있게 된다. 만일 여러분이
일반적인(plain) LRU 전략을 선호한다면, key_cache_division_limit의 값을 디폴트 100으로 놔 두면 된다.
제목검색
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 만약에 캐시 내에 전체 인덱스 블록을 가질 수 있을 만큼의 충분한 블록이 존재하거나, 또는 인덱스의 잎사귀 노드가 아닌 것과 상
7.4.6 MyISAM 키 캐시 응할 만큼의 최소 블록을 가지고 있다면, 키 캐시를 사용해서 시작을 하기 전에 인덱스 블록과 함께 키 캐시를 읽어 오는 것이 좋을
7.4.6.1 공유 키 캐시 접속 것이다. 이렇게 미리 읽어 오게 되면 여러분은 테이블 인덱스 블록을 가장 효과적인 방법으로 키 캐시 버퍼안에 넣을 수가 있게 된
다: 디스크에서 순차적으로 인덱스 블록을 읽어 옴으로써.
7.4.6.2 다중 키 캐시
7.4.6.3 중간 삽입(Midpoint Insertion) 전략
7.4.6.4 인덱스 프리 로딩(Preloading)
7.4.6.5 키 캐시 블럭 크기 미리 읽어 오지 않게 되면, 블록은 여전히 쿼리가 필요로 하는 형태로 키 캐시 안에 머물러 있게 된다. 비록 블록이 캐시 안에 있게
7.4.6.6 키 캐시 재 구축하기 되더라도, 이것들을 보관할 만큼 충분한 공간이 있기 때문에, 순차적인 순서가 아닌 랜덤(random)한 순서로 디스크에서 블록을 가
져올 수 있게 된다.
'인덱스를 캐시 안으로 미리 읽어 오기 위해서는, LOAD INDEX INTO CACHE 명령문을 사용한다. 예를 들면, 아래의 명령문은
테이블 t1 과 t2의 인덱스 노드(인덱스 블록)을 미리 읽어 온다:
+---------+--------------+----------+----------+
+---------+--------------+----------+----------+
+---------+--------------+----------+----------+
IGNORE LEAVES 수정자(modifier)는 인덱스의 잎사귀 노드가 아닌 블록만을 미리 읽어 오도록 한다. 따라서, 위의 명령문은 t1
로부터 모든 인덱스 블록을 미리 읽어 오지만, t2로부터는 잎사귀 노드가 아닌 블록만을 읽어 오게 된다.
만일 인덱스가 CACHE INDEX 명령어를 사용해서 키 캐시에 할당되었다면, 미리 읽기(preloading)는 인덱스 블록을 그 캐시 안으
로 집어 넣게 된다. 그렇지 않은 경우에는, 인덱스는 디폴트 키 캐시 안으로 들어가게 된다.
제목검색
7.4.6.5. 키 캐시 블럭 크기
상위메뉴리스트 ◆
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 key_cache_block_size 변수를 사용하면 개별적인 키 캐시의 블록 버퍼 크기를 지정할 수가 있게 된다. 이를 통해서 인덱스 파일
7.4.6.1 공유 키 캐시 접속
7.4.6.2 다중 키 캐시
7.4.6.3 중간 삽입(Midpoint Insertion) 전략
I/O 연산은 읽기용 버퍼의 크기가 OS의 원(native) I/O 버퍼와 크기가 동일할 때 가장 좋은 성능을 나타낸다. 하지만 키 노드의 크
7.4.6.4 인덱스 프리 로딩(Preloading)
기를 I/O버퍼의 크기와 똑 같게 만드는 것이 전반적으로 가장 좋은 성능을 보장해 주는 것은 아니다.
7.4.6.5 키 캐시 블럭 크기
7.4.6.6 키 캐시 재 구축하기
현재까지는, 여러분은 테이블에 있는 인덱스 블록의 크기를 제어할 수가 없다. 이 크기는 .MYI 인덱스 파일이 생성될 때 서버에 의
해 설정되며, 테이블 정의문에 존재하는 인덱스의 키 크기에 따라서 정해 진다. 대부분의 경우, 이것은 I/O 버퍼 크기와 동일하게 설
정된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=4&scate=6&idx=18602006-08-08 오후 6:01:14
:::MySQL Korea:::
제목검색
7.4.6.6. 키 캐시 재 구축하기
상위메뉴리스트 ◆
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 키 캐시는 파라미터 값을 업데이트하면 언제든지 재 구성될 수가 있다. 예를 들면:
7.4.6 MyISAM 키 캐시
mysql> SET GLOBAL cold_cache.key_buffer_size=4*1024*1024;
7.4.6.1 공유 키 캐시 접속
7.4.6.2 다중 키 캐시
만일 여러분이 key_buffer_size 또는 key_cache_block_size 키 캐시의 컴퍼넌트에 현재의 값과는 다른 값을 할당한다면, 서버는
7.4.6.3 중간 삽입(Midpoint Insertion) 전략
캐시의 이전 구조를 없애버리며 새로운 값을 기반으로 하는 새로운 구조를 생성하게 된다. 만일 그 캐시가 더티(dirty) 블록을 가지
7.4.6.4 인덱스 프리 로딩(Preloading)
고 있다면, 서버는 이것을 없애기 전에 디스크에 보관을 하고 난 후에 캐시를 재 생성한다. 만일 여러분이 다른 키 캐시 파라미터를
7.4.6.5 키 캐시 블럭 크기
수정할 경우에는 이러한 재 구성은 일어나지 않는다.
7.4.6.6 키 캐시 재 구축하기
키 캐시를 재 구축할 때, 서버는 우선 더티 버퍼에 있는 데이터를 디스크에 플러시를 한다. 이 과정을 마치고 나면, 캐시에 있는 컨
텐츠는 더 이상 사용을 할 수 없게 된다. 하지만, 캐시 재 구축은 캐시에 할당된 인덱스를 사용하고자 하는 쿼리를 막지는 않는다.
대신에, 서버는 원(native) 파일 시스템 캐싱을 사용해서 테이블 인덱스를 직접 접속한다. 파일 시스템 캐싱은 키 캐시를 사용하는
것만큼 효율적이지 못하기 때문에, 쿼리가 실행되기는 하지만, 속도가 느려지게 된다. 캐시가 재 구축된 후에는, 여기에 할당된 인
덱스를 캐싱하기 위해 다시 사용 가능한 상태가 되고, 인덱스에 대한 파일 시스템 캐싱 사용은 중단된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=4&scate=6&idx=18612006-08-08 오후 6:01:16
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 스토리지 엔진은 옵티마이저가 사용한 테이블에 대한 통계 정보를 수집한다. 테이블 통계치는 값 그룹 (value group)을 기반으로
하며, 여기에서 값 그룹은 동일한 키 접두사 값을 가지고 있는 열 셋이다. 옵티마이저의 경우, 중요한 통계 값은 평균 값 그룹 크기
7.4.7 MyISAM 인덱스 통계 수집
가 된다.
인덱스에 대한 평균 값 그룹의 크기는 계속 증가를 함에 따라서, 룩업(lookup)당 열의 평균 숫자는 증가를 하기 때문에, 인덱스는
이러한 두 가지 목적에서는 그리 유용한 것이 되지 못한다: 최적화 목적으로 인덱스를 사용하는 것이 좋을 경우에는, 각각의 인덱
스 값이 테이블에 있는 열의 숫자 보다 작게 되는 것이 바람직하다. 주어진 인덱스 값이 많은 수의 열을 만들어 낸다면, 인덱스는
덜 유용하게 되며 MySQL은 이것을 덜 사용하게 된다.
평균 값 그룹 크기는 테이블 기수(cardinality)와 관련이 되는데, 이것은 값 그룹의 숫자가 된다. SHOW INDEX 명령문은 N/S에
기반한 기수 값을 표시하는데, 여기서 N은 테이블에 있는 열의 숫자이며 S는 평균 값 그룹 크기가 된다. 이 비율은 테이블에 있는
값 그룹의 추정적인 숫자를 만들게 된다.
<=> 비교 연산자를 기반으로 하는 조인(join)의 경우, NULL은 다른 값들과 틀리게 취급되지 않는다: just as for 모든 다
른 N에 대해서 N <=> N 인 것 같이, NULL <=> NULL이 된다.
하지만, = 연산자에 기초한 조인(join)의 경우, NULL은 NULL 값이 아닌 것과 틀리게 취급된다: expr1 또는 expr2 (또는 둘 모
두)이 NULL이 되면, expr1 = expr2 는 트루(true)가 아니다. 이것은 tbl_name.key = expr 형태의 비교에 대한 ref 접속에 영
향을 준다: MySQL은 expr 의 현재 값이 NULL일 경우에는 테이블을 접속할 수가 없게 되는데, 그 이유는 비교 연산이 트루(true)
가 아니기 때문이다.
= 비교에 대해서는, 테이블 안에 얼마나 많은 NULL 값이 존재하느냐는 문제가 되지 않는다. 최적화 목적의 경우, 이에 관련된 값
은NULL이 아닌 값 그룹의 평균 크기가 된다. 하지만, MySQL은 아직까지는 그러한 평균 크기를 수집하거나 사용하는 것을 허용
하지 않고 있다.
MyISAM 테이블의 경우, myisam_stats_method 시스템 변수를 사용해서 테이블 통계 수집 전반에 대한 제어를 할 수가 있다. 이
변수는 두 가지의 가능 값을 가지는데, 그 차이는 아래와 같다:
● myisam_stats_method가 nulls_unequal이 되면, NULL 값은 동일하게 간주되지 않는다. 대신에, 각 NULL 값은 별도의
크기 1인 값 그룹을 형성한다.
만일 여러분이 =가 아니라 <=>를 사용하는 많은 조인을 사용할 생각이라면, NULL 값은 비교문에서 더 이상 특별한 것이
되지 않으며 하나의 NULL은 다른 것과 동일하게 된다. 이와 같은 경우에는, nulls_equal이 적절한 통계 방법이 된다.
● 여러분은, 위에서 설명한 바와 같이, 테이블 통계치가 명확하게 수집되도록 만들 수가 있다. 하지만, MySQL은 통계치를 자
동으로도 수집을 한다. 예를 들면, 테이블에 대한 명령문을 실행하는 도중에, 만일 이 명령문 중에 하나가 테이블을 수정한
다면, MySQL은 통계치를 수집할 수도 있다. (이것은 대량의 삽입 또는 삭제, 또는 몇몇ALTER TABLE 명령문에서 발생
할 수 있다.) 만일 이런 경우가 발생한다면, 그 통계치는 그 시점의 myisam_stats_method 값을 사용해서 수집된다. 따라
서, 만일 여러분이 하나의 방법을 사용해서 통계치를 수집하지만, if you collect statistics using one method, but 테이
블 통계치를 나중에 자동으로 수집을 할 때에는 myisam_stats_method가 다른 방법을 사용하도록 설정한다면, 다른 방법
이 사용될 것이다.
● 주어진 MyISAM 테이블을 위한 통계치를 만들기 위해 사용된 방식이 어떤 것인지를 알려줄 수 있는 방법은 없다.
myisam_stats_method는 MyISAM 테이블에만 적용된다. 다른 스토리지 엔진은 한 가지 방법만을 가지고 테이블 통계치를 수집
제목검색
7. 최적화(Optimization)
7.4. 데이터 베이스 구조 최적화 하기 여러분이 mysqladmin status 명령문을 실행할 때, 여러분은 아래와 비슷한 것을 보게 될 것이다:
여러분이 오직 6개의 테이블만을 가지고 있다면12의 Open tables 값은 다소 수수께끼와 같은 의미를 가질 것이다.
MySQL은 다중-쓰레드 방식이며, 따라서 주어진 테이블에 대해서 동시에 쿼리를 입력하는 클라이언트가 많이 존재하게 된다. 동
일한 테이블에 있는 서로 다른 상태의 클라이언트 쓰레드로 인한 문제를 최소화 하기 위해서는, 테이블을 각각의 동시 쓰레드에 대
해서 독립적으로 열어야 한다. 이것은 메모리를 추가적으로 사용하기는 하지만 일반적으로는 성능을 향상 시켜준다. MyISAM 테
이블을 사용한다면, 테이블을 열게 하는 각각의 클라이언트에 대한 데이터 파일을 위해서는 여분의 파일 디스크립터(descriptor)
가 필요하게 된다. (반대의 경우, 인덱스 파일 디스크립터는 모든 쓰레드간에 공유가 된다.)
table_cache, max_connections, 그리고 max_tmp_tables 시스템 변수는 서버가 열어 놓는 파일의 최대 숫자에 영향을 준다. 만
일 여러분이 이 값들 중의 하나 또는 여러 개를 증가 시킨다면, 여러분은 프로세스 당 오픈 파일 디스크립터(open file descriptor)
의 숫자 한계를 늘릴 수가 있을 것이다. 많은 OS가 여러 가지 방법을 통해 오픈 파일의 한계를 늘릴 수 있도록 허용을 한다.
table_cache는 max_connections과 관련이 있다. 예를 들면, 200개의 동시 구동 접속의 경우, 여러분은 테이블 캐시의 크기를 최
소 200 × N로 만들 수가 있는데, 여기에서N 은 여러분이 실행하는 쿼리 안에 있는 조인(join) 당 테이블의 최대 숫자가 된다. 여
러분은 또한 반드시 임시 테이블 및 임시 파일에 대한 여분의 파일 디스크립터를 보관하고 있어야 한다.
여러분은 지금 사용하고 있는 OS가 table_cache 설정에 포함되어 있는 오픈 파일 디스크립터의 숫자를 다룰 수 있는지를 확인해
야 한다. 만일 table_cache가 너무 크다면, MySQL은 파일 디스크립터 오류를 만들게 되며 접속을 거부하고, 쿼리 실행을 하지 못
하며, 또한 매우 불안정하게 된다. 여러분은 또한 MyISAM 스토리지 엔진은 각각의 고유한 오픈 테이블에 대해서 두 개의 파일 디
스크립터를 필요로 한다는 점을 알고 있어야 한다. 여러분은 mysqld의 스타트 업 옵션인 --open-files-limit를 사용해서
MySQL에서 사용 가능한 파일 디스크립터의 숫자를 늘릴 수가 있다. Section A.2.17, “File Not Found”를 참조할 것.
오픈 파일의 캐시는 table_cache 엔트리 레벨에서 관리된다. 디폴트 값은 64이다; 이것은 --table_cache 옵션을 가지고 변경 시
킬 수가 있다. MySQL은 쿼리를 실행하기 위한 것 보다 많은 수의 테이블을 임시로 오픈 한다는 점을 알아두자.
테이블 캐시가 가득 차게 되면, 서버는 사용할 캐시 엔트리를 저장하기 위해서 아래의 과정을 진행한다:
● 사용 중에 있지 않는 테이블은 풀어 놓는다(release).
● 만일 오픈해야 할 테이블이 필요하기는 하지만 캐시가 가득 찾기 때문에 풀어 놓을 테이블이 없게 된다면, 캐시는 필요한
만큼 임시로 확장이 된다.
캐시가 임시로 확장된 상태이고 테이블이 사용되지 않는 상태가 되면, 테이블은 닫히게 되고 캐시에서 풀어져 나오게 된다.
테이블은 각각의 동시 접속에 대해서 열리게 된다. 이것은 만일 두 개의 쓰레드가 동일한 테이블에 접속으로 하거나 하나의 쓰레드
가 동일한 쿼리에서 한 테이블을 두 번 접속을 할 경우에는 테이블이 두 번 열려야 한다는 것을 의미한다. 각각의 동시 오픈은 테이
블 캐시에 있는 하나의 엔트리를 필요로 한다. MyISAM 테이블의 첫 번째 오픈은 두 개의 파일 디스크립터를 가져 온다: 하나는 테
이더 파일용이고 다른 하나는 인덱스 파일용 임. 테이블에 대한 각각의 여분의 사용은 데이터 파일에 대해서 오직 하나의 파일 디스
크립터만을 가져온다. 인덱스 파일 디스트립터는 모든 쓰레드간에 공유가 된다.
만일 여러분이 HANDLER tbl_name OPEN 명령문을 가지고 테이블을 오픈한다면, 지정 테이블 오브젝트(dedicated table
object)는 그 쓰레드에 할당이 된다. 이 테이블 오브젝트는 다른 쓰레드에 의해서는 공유가 되지 않으며 그 쓰레드가 HANDLER
tbl_name CLOSE를 호출하거나 쓰레드를 종료하기 전까지는 닫히지가 않게 된다. 이런 일이 발생을 하면, 테이블은 테이블 캐시
안으로 다시 들어가게 된다 (캐시가 가득 차지 않았을 경우). Section 13.2.3, “HANDLER 신텍스”를 참조.
여러분은 mysqld의 상태 변수인 Opened_tables을 검사함으로써 여러분이 사용하는 테이블 캐시가 너무 작은지를 알아볼 수가 있
다:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
만일 이 값이 너무 크다면, 여러분은 테이블 캐시의 크기를 늘려주어야 한다. Section 5.2.2, “서버 시스템 변수”, 그리고
제목검색
7. 최적화(Optimization) 만일 여러분이 동일한 데이터 디렉토리 안에 많은 수의 MyISAM 테이블을 가지고 있다면, 테이블을 영
7.4. 데이터 베이스 구조 최적화 하기 고, 닫고, 그리고 생성하는 동작이 느려지게 된다. 만일 여러분이 많은 수의 테이블에서 SELECT 명령문
7.4.9 동일 데이터 베이스에 많은 테이블을 생성하기 위해 드로우 백 을 실행한다면, 테이블 캐시가 가득 차게 될 경우에는 다소 오버 헤드가 발생하게 된다. 여러분이 테이블
(drawback) 하기 캐시의 크기를 증가 시킴으로써 이 오버 헤드를 줄일 수가 있게 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=4&scate=9&idx=18642006-08-08 오후 6:01:23
:::MySQL Korea:::
제목검색
7.5.1 시스템 요소 및 스타트 업 파라미터 튜닝 7.5.4. 컴파일 및 링크 작업이 어떻게 MySQL 속도에 영향을 주는
7.5.2 서버 파라미터 튜닝 가
7.5.5. MySQL의 메모리 사용 방법
7.5.3 쿼리 옵티마이저 성능 제어하기
7.5.6. MySQL의 DNS사용 방법
7.5.4 컴파일 및 링크 작업이 어떻게 MySQL 속도에 영향을 주는가
7.5.5 MySQL의 메모리 사용 방법
7.5.6 MySQL의 DNS사용 방법
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=5&scate=0&idx=16322006-08-08 오후 6:01:33
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.5. MySQL 서버 최적화 하기 우리는 시스템-레벨의 요소를 가지고 시작을 할 것인데, 그 이유는 이런 요소들이 초창기부터 시스템의 성능을 개선 시키기 위해
OS를 잘 다루는 것이 매우 중요하다. 다중 CPU 시스템을 잘 다루기 위해서는, 솔라리스(왜냐하면 이 OS는 쓰레드를 잘 처리한
다) 또는 리눅스(그 이유는 2.4 및 이후 버전의 커널은 SMP를 잘 지원한다)를 다루는 것이 좋다. 구형 커널 버전의 리눅스는 파일
크기가 2GB만큼 디폴트로 사용한다는 점을 알아두자. 만일 여러분이 이러한 커널을 가지고 있고 2GB 보다 큰 파일을 필요로 한다
면, ext2 파일 시스템에 대한 LFS(Large File System)을 가지고 있어야 한다.
다른 팁:
● 만일 여러분이 충분한 RAM을 가지고 있다면, 모든 스왑(swap) 디바이스(device)를 삭제할 수가 있다. 어떤 OS은 여러분
이 사용 가능한 메모리를 가지고 있다고 하더라도 어떤 문장 안에 스왑 디바이스를 사용하기도 한다.
● 외부 잠금을 사용하지 말 것. MySQL 4.0 이후에는, 모든 시스템에서 외부 잠금을 비활성화 하도록 디폴트로 만들어졌다.
--external-locking 및 --skip-external-locking 옵션은 외부 잠금을 명확하게 활성화 및 비 활성화 시킨다.
외부 잠금을 비 활성화 시키는 것은 여러분이 MySQL을 하나의 서버에서만 구동 시키는 한MySQL의 기능성에는 아무런
영향을 주지 않는다는 점을 알아두자. 여러분이 myisamchk를 구동 시키기 전에는 서버를 다운(down)시켜야 한다는 점
(또는 관련된 테이블을 잠그거나 플러시)만을 기억하기 바란다.
여러분이 외부 잠금을 비 활성화 시킬 수 없는 유일한 경우는, 여러분이 여러 개의 하나의 데이터를 사용해서 여러 대의
MySQL 서버(클라이언트가 아님)를 구동시킬 때이거나, 또는 서버로 하여금 우선 테이블을 플러시한 다음에 잠그도록 명
령하지 않은 채로 테이블을 검사하기 위한 myisamchk를 구동 시킬 경우에만 해당된다. 하나의 데이터에 동시에 여러 대
의 MySQL 서버가 접속을 하도록 하는 것은 일반적으로 권장하지 않는 사항임을 알아두기 바란다. (MySQL클러스터는
예외임)
LOCK TABLES 및 UNLOCK TABLES 명령문은 내부 잠금을 사용하는데, 따라서 여러분은 외부 잠금이 비 활성화 되
어 있는 경우에는 이것을 사용할 수 있다.
제목검색
7. 최적화(Optimization)
7.5. MySQL 서버 최적화 하기 여러분은 아래의 명령어를 사용해서 mysqld 서버가 디폴트로 사용하는 디폴트 버퍼의 크기를 알아볼 수가 있다:
7.5.2 서버 파라미터 튜닝
shell> mysqld --verbose --help
이 명령어는 모든 mysqld 옵션 리스트와 구성 가능한 시스템 변수 리스트를 보여 준다. 이 결과에는 디폴트 변수 값이 포함되어 있
고 아래와 같이 보이게 된다:
back_log 50
binlog_cache_size 32768
bulk_insert_buffer_size 8388608
connect_timeout 5
default_week_format 0
delayed_insert_limit 100
delayed_insert_timeout 300
delayed_queue_size 1000
expire_logs_days 0
flush_time 1800
ft_max_word_len 84
ft_min_word_len 4
ft_query_expansion_limit 20
group_concat_max_len 1024
innodb_additional_mem_pool_size 1048576
innodb_autoextend_increment 8
innodb_buffer_pool_awe_mem_mb 0
innodb_buffer_pool_size 8388608
innodb_concurrency_tickets 500
innodb_file_io_threads 4
innodb_force_recovery 0
innodb_lock_wait_timeout 50
innodb_log_buffer_size 1048576
innodb_log_file_size 5242880
innodb_log_files_in_group 2
innodb_mirrored_log_groups 1
innodb_open_files 300
innodb_sync_spin_loops 20
innodb_thread_concurrency 8
innodb_thread_sleep_delay 10000
interactive_timeout 28800
join_buffer_size 131072
key_buffer_size 8388600
key_cache_age_threshold 300
key_cache_block_size 1024
key_cache_division_limit 100
long_query_time 10
lower_case_table_names 1
max_allowed_packet 1048576
max_binlog_cache_size 4294967295
max_binlog_size 1073741824
max_connect_errors 10
max_connections 100
max_delayed_threads 20
max_error_count 64
max_heap_table_size 16777216
max_join_size 4294967295
max_length_for_sort_data 1024
max_relay_log_size 0
max_seeks_for_key 4294967295
max_sort_length 1024
max_tmp_tables 32
max_user_connections 0
max_write_lock_count 4294967295
multi_range_count 256
myisam_block_size 1024
myisam_data_pointer_size 6
myisam_max_extra_sort_file_size 2147483648
myisam_max_sort_file_size 2147483647
myisam_repair_threads 1
myisam_sort_buffer_size 8388608
net_buffer_length 16384
net_read_timeout 30
net_retry_count 10
net_write_timeout 60
open_files_limit 0
optimizer_prune_level 1
optimizer_search_depth 62
preload_buffer_size 32768
query_alloc_block_size 8192
query_cache_limit 1048576
query_cache_min_res_unit 4096
query_cache_size 0
query_cache_type 1
query_cache_wlock_invalidate FALSE
query_prealloc_size 8192
range_alloc_block_size 2048
read_buffer_size 131072
read_only FALSE
read_rnd_buffer_size 262144
div_precision_increment 4
record_buffer 131072
relay_log_purge TRUE
relay_log_space_limit 0
slave_compressed_protocol FALSE
slave_net_timeout 3600
slave_transaction_retries 10
slow_launch_time 2
sort_buffer_size 2097144
sync-binlog 0
sync-frm TRUE
sync-replication 0
sync-replication-slave-id 0
sync-replication-timeout 10
table_cache 64
thread_cache_size 0
thread_concurrency 10
thread_stack 196608
tmp_table_size 33554432
transaction_alloc_block_size 8192
transaction_prealloc_size 4096
updatable_views_with_limit 1
wait_timeout 28800
현재 구동 중에 있는 mysqld 서버의 경우, 여기에 접속을 해서 아래의 명령문을 입력하면 이 서버의 시스템 변수의 현재 값을 알
아 볼 수가 있다:
모든 시스템 변수 및 상태 변수에 대한 전체 설명은, Section 5.2.2, “서버 시스템 변수”, 및 Section 5.2.4, “서버 상태 변
수”를 참조할 것.
MySQL은 매우 확장 가능한 알고리즘을 사용하며, 따라서 여러분은 소량의 메모리만을 사용해서도 이것을 구동 시킬 수가 있다.
하지만, 일반적으로 여러분은 보다 많은 메모리를 사용하면 보다 좋은 성능을 얻어낼 수가 있다.
MySQL 서버를 튜닝할 때에는, key_buffer_size 와 table_cache의 값을 정확히 구성하는 것이 매우 중요하다. 여러분은 다른 변
수를 변경하기 전에 이 변수들을 올바르게 설정했는지에 대해 확인을 해야 한다.
● 만일 여러분이 최소 256MB의 메모리와 많은 테이블을 가지고 있고 중간 정도의 클라이언트와 함께 최고의 성능이 나오도
록 하고 싶다면, 아래와 같은 것을 사용해야 한다:
● 만일 여러분이 128MB의 메모리와 적은 수의 테이블만을 가지고 있지만, 정렬할 것이 많이 있다면, 아래와 같이 사용한다:
• --read_buffer_size=100K &
또는:
--table_cache=32 --read_buffer_size=8K ₩
--net_buffer_length=1K &
여러분이 MySQL을 설치하면, support-files 디렉토리는 my.cnf 샘플 파일을 가지게 된다: my-huge.cnf, my-large.cnf, my-
medium.cnf, 및 my-small.cnf. 여러분은 이것을 시스템 최적화용으로 사용할 수 있을 것이다. (윈도우의 경우, MySQL 설치 디
렉토리를 찾아 보기 바라다.)
만일 여러분이 mysqld 또는 mysqld_safe용의 옵션을 명령어 라인에서 지정하였다면, 이것은 서버의 호출에 대해서만 효력을 나
타낸다. 서버가 구동될 때마다 사용될 수 있도록 하기 위해서는, 이것을 옵션 파일에서 지정해야 한다.
변수 값은 결과의 끝 부분에 나타난다. --verbose 및 --help 옵션이 마지막에 오도록 한다. 그렇지 않으면, 명령어 라인 상에서
이것 뒤에 나오는 옵션들은 결과에 영향을 주지 못하게 된다.
InnoDB 스토리지 엔진 튜닝에 대한 정보는, Section 14.2.11, “InnoDB 성능 튜닝 팁”을 참조하기 바란다.
제목검색
7. 최적화(Optimization)
7.5. MySQL 서버 최적화 하기 쿼리 옵티마이저의 업무는 SQL쿼리를 실행하기 위한 옵티말 플랜(optimal plan)을 찾는 것이다. MySQL 5.0.1에서는 보다 유연
여러 가지의 플랜에 관련해서 옵티마이저가 실행하는 방식은 두 가지의 시스템 변수를 통해서 제어된다:
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=5&scate=3&idx=16352006-08-08 오후 6:01:45
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.5. MySQL 서버 최적화 하기 아래에 있는 대부분의 테스트들은 리눅스에서 MySQL 벤치 마크를 사용해서 실행한 것들이긴 하지만, 여러분은
7.5.4 컴파일 및 링크 작업이 어떻게 MySQL 속도에 영향을 주는가 이를 통해서 다른 OS에 대한 지침을 얻을 수가 있을 것이다.
● 만일 여러분이 pgcc를 사용하고 모든 것을 -O6로 컴파일 한다면, mysqld 서버는 1% gcc 2.95.2 보다
1% 정도 속도가 개선된다.
● 만일 여러분이 동적으로 (-static 없이) 링크를 한다면, 리눅스에서는 13% 정도 속도가 느려지게 된다.
여러분은 여전히 클라이언트 어플리케이션에 대해서는 MySQL 라이브러리르 동적으로 링크 시킬 수가 있
다는 점을 알아 두기 바란다. 성능에 대해서는 서버 쪽이 보다 심각해지는 것이다.
● 동일한 호스트에 있는 서버로 접속을 하는 클라이언트의 경우, 만일 여러분이 유닉스 소켓 파일을 사용하
지 않고 TCP/IP를 사용하는 경우라면, 7.5% 정도의 속도 저하가 생기게 된다. (유닉스의 경우, 만일 여러
분이 호스트 이름 localhost에 접속을 한다면, MySQL은 디폴트로 소켓 파일을 사용한다.)
● 클라이언트에서 서버로의 접속을 TCP/IP로 하는 경우에는, 다른 호스트에 있는 원격 서버로의 접속이 동
일 호스트에 있는 서버로의 접속보다 약 8–11% 정도 느려지게 된다.
● 보안 접속을 사용해서 벤치마크 테스트를 구동 시키면(모든 데이터를 내부 SSL을 가지고 암호화 함) 성능
은 암호화를 하지 않은 접속에 비해 55% 정도 느려지게 된다.
● 만일 여러분이 --with-debug=full를 사용해서 컴파일을 하는 경우에는, 대부분의 쿼리가 20% 정도 느
려지게 된다. 어떤 쿼리들은 심각할 정도로 오래 걸리기도 한다; 예를 들면, MySQL 벤치 마크는 35% 정
도 느려지게 된다. 만일 여러분이 --with-debug (=full 없이)를 사용한다면, 속도는 15% 정도 느려진
다. --with-debug=full을 사용해서 컴파일 된 mysqld의 경우, 여러분은 서버가 시작될 때 --skip-
safemalloc 옵션을 사용해서 런 타임시의 메모리 검사를 비 활성화 시킬 수가 있다. 이렇게 하면 --
with-debug를 사용해서 구성했을 때 얻어지는 수준만큼의 실행 속도를 얻을 수가 있게 된다.
제목검색
7. 최적화(Optimization)
7.5. MySQL 서버 최적화 하기 아래의 리스트는 mysqld 서버가 메모리를 사용하는 방법들을 설명하는 것이다:
접속 버퍼와 결과 버퍼는 필요할 경우 max_allowed_packet까지 동적으로 커지게 된다. 쿼리가 동작을 하는 동안에는, 현
재 쿼리 스트링의 복사본도 역시 할당된다.
● 정렬을 실행하는 대부분의 요청은 정렬 버퍼를 할당하며 결과 셋 크기에 따라서 두 개의 임시 파일을 0으로 만든다.
Section A.4.4, “Where MySQL Stores Temporary Files”를 참조할 것.
● 거의 모든 파싱(parsing)과 계산(calculating)은 로컬 메모리에 저장된다. 작은 아이템의 경우에는 메모리 오버 헤드가 거
의 발생하지 않으며, 따라서 일반적인 슬로우 메모리 할당 및 해제(freeing)은 피해진다. 메모리는 예상치 못한 대형 스트
링에 대해서만 할당된다. 이것은 malloc() 과 free()를 가지고 실행된다.
● 열려 있는 각각의 MyISAM 테이블에 대해서는, 인덱스 파일이 일단 열리게 된다; 데이터 파일은 현재 구동 중에 있는 각각
의 쓰레드게 대해서 한번 열리게 된다. 각각의 현재 쓰레드에 대해서는, 테이블 구조, 각 컬럼에 대한 컬럼 구조, 그리고 3
× N 크기의 버퍼가 할당된다 (여기에서 N 은 최대 열 길이이며, BLOB 컬럼을 계산하지는 않는다). BLOB 컬럼은
BLOB 데이터 길이보다 5에서8 바이트를 더 필요로 한다. MyISAM 스토리지 엔진은 내부 용도로 하나의 열 버퍼를 추가
로 관리한다.
● For each table having BLOB 컬럼을 가지고 있는 각 테이블에 대해서는, 버퍼가 BLOB에 들어 있는 큰 값을 읽을 수 있도
록 동적으로 커진다. 만일 여러분이 테이블을 스캔한다면, BLOB 값 만킄 커다란 버퍼가 할당된다.
● 사용 중에 있는 테이블에 대한 핸들러 구조(Handler structure)는 캐시 안에 저장되며 FIFO 방식으로 다루어진다. 디폴트
로는, 캐시는 64개의 엔트리를 가진다. 만일 테이블이 동시에 구동되는 두 개의 쓰레드에 의해 사용된다면, 캐시는 그 테이
블용으로 두 개의 엔트리를 가지게 된다. Section 7.4.8, “MySQL이 테이블을 열고 닫는 방법”을 참조할 것.
● FLUSH TABLES 명령문 또는 mysqladmin flush-tables 명령어는 한번도 사용되지 않은 테이블은 닫아 버리며 사용 중
에 있는 모든 테이블은 현재 실행 중에 있는 쓰레드가 종료가 되면 닫히게 끔 표시를 해 둔다. 이것은 사용 중에 있는 대부
분의 메모리를 효과적으로 해제 시키는 방법이다. FLUSH TABLES은 모든 테이블이 닫히기 전까지는 리턴되지 않는다.
제목검색
7. 최적화(Optimization)
7.5. MySQL 서버 최적화 하기 새로운 클라이언트가 mysqld에 접속을 하게 되면, mysqld은 그 요청을 처리하기 위해 새로운 쓰레드를 만든다. 이 쓰레드는 우선
7.5.6 MySQL의 DNS사용 방법 호스트 이름 캐시에 있는 호스트 이름을 검사한다. 만약에 여기에 없다면, 쓰레드는 호스트 이름을 알아내기 위한 시도를 한다:
● 만일 OS가 gethostbyaddr_r() 와 gethostbyname_r() 호출을 지원한다면, 쓰레드는 이것들을 사용해서 호스트 이름을
알아내도록 한다.
● 만일 OS가 위와 같은 호출(thread-safe)을 지원하지 않는다면, 쓰레드는 mutex를 잠그고 대신에 gethostbyaddr() 및
gethostbyname()를 호출하게 된다. 이와 같은 경우가 되면, 다른 첫 번째 쓰레드가 mutex의 잠금을 해제하기 전까지는
어떠한 쓰레드도 호스트 이름 캐시에 들어 있지 않는 호스트 이름을 알아낼 수가 없게 된다.
여러분은 --skip-name-resolve 옵션을 사용해서 mysqld를 시작함으로써 DNS 호스트 이름 룩업(lookup)을 비 활성화 시킬
수가 있다. 하지만, 이럴 경우에는, 여러분은 MySQL 그랜트 테이블에 있는 IP번호만을 사용할 수가 있게 된다.
--skip-host-cache 옵션을 사용해서 서버를 시작하면 호스트 이름 캐시를 비 활성화 시킬 수가 있다. 호스트 이름 캐시를 초기
화(clean) 시키기 위해서는, FLUSH HOSTS 명령문 또는 mysqladmin flush-hosts 명령어를 실행하면 된다.
TCP/IP 접속을 전체적으로 허용하지 않기 위해서는, mysqld을 --skip-networking 옵션을 사용해서 시작한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=5&scate=6&idx=16382006-08-08 오후 6:01:52
:::MySQL Korea:::
제목검색
7.6 디스크 이슈 ● 디스크 검색(Disk seek)은 성능 저하의 중요 원인을 제공한다. 이런 문제는 효과적인 캐싱 처리가 불가능할
정도로 데이터의 양이 많아지는 경우에 뚜렷하게 나타난다. 여러분이 다소 랜덤하게 대형 데이터 베이스를
7.6.1 심볼릭 링크 사용하기
접속하는 경우에는, 데이터를 읽기 위해서는 최소 1번의 디스크 검색과 데이터를 쓰기 위해서는 두 번의 디
7.6.1.1 유닉스에 있는 데이터 베이스에 대한 심볼릭 링크 사용하
기 스크 검색이 필요하다는 점을 확실히 알고 있어야 한다. 이런 문제를 최소화 하기 위해서는, 가능한 한 최소
의 디스크 검색이 이루어 지도록 해야 한다.
7.6.1.2 유닉스에 있는 테이블에 대한 심볼릭 링크 사용하기
● 서로 별개의 디스크에 대한 파일 심볼릭 링크(symbolic link) 또는 디스크 스트라이핑(striping)을 사용해
7.6.1.3 윈도우에 있는 데이터 베이스에 대한 심볼릭 링크 사용하
기 서 사용 가능한 디스크 스핀들(spindle)의 숫자를 늘린다:
❍ 심볼릭 링크 사용하기
MyISAM 테이블의 경우, 인덱스 파일과 데이터 파일이 일반적으로 저장되어 있는 데이터 디렉토
리를 다른 디스크로 심볼릭 링크 시킨다. 이렇게 하면 디스크 검색 및 데이터 읽기 시간을 보다 개
선 시킬 수 있다. Section 7.6.1, “심볼릭 링크 사용하기”를 참조할 것.
❍ 스트라이핑
● 안전성을 위해서는, 여러분은 RAID 0+1 (스트라이핑 및 미러링(striping plus mirroring))을 사용하고자
할 수도 있는데, 하지만 이와 같은 경우에는, 2 × N 개의 디스크 드라이브가 필요하게 된다.
● 리눅스의 경우, 여러분은 hdparm를 사용해서 디스크 인터페이스를 구성 한다면 보다 우수한 성능을 얻어낼
수가 있을 것이다. MySQL의 경우, 아래의 옵션을 사용하면 된다:
• hdparm -m 16 -d 1
이때 성능 향상과 안정성은 여러분이 사용하는 시스템의 하드웨어와 매우 밀접하게 된다 .
만일 파일이 언제 최종적으로 접속이 되었는지 알 필요가 없다면 ( 이것은 실제로 데이터 베이스 서버에서
는 필요 없는 사항임), 여러분이 사용하는 파일 시스템을 -o noatime 옵션을 사용해서 마운트 한다. 이렇
게 하면 파일 시스템에 있는 inode에 최종 접속 시간을 업데이트 하지 않게 되며, 이에 따라서 디스크 검색
시간을 절약 시킬 수가 있게 된다.
대부분의 OS에서, 여러분은 파일 시스템을 -o async 옵션과 함께 마운트 시킴으로써 비 동기적인 업데이
트가 되도록 만들 수가 있다. 이렇게 하면, 보다 개선된 성능을 얻어낼 수가 있다. (리눅스에서는 이 플래그
가 디폴트임)
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=6&scate=1&idx=16402006-08-08 오후 6:02:11
:::MySQL Korea:::
제목검색
7. 최적화(Optimization)
7.6. 디스크 이슈 유닉스에서, 데이터 베이스를 심링크 시키는 방법은 우선 여유 공간이 있는 디스크에 디렉토리를 하나 만들고 MySQL 데이터 디렉
shell> cd /path/to/datadir
그 결과, db1 안에 뿐만 아니라, db2에도 테이블 tbl_a가 나타난다. 만일 한 클라이언트가 db1.tbl_a 를 업데이트하고 다른 클라이
언트가 db2.tbl_a를 업데이트 한다면, 문제가 발생될 수 있다.
하지만, 만일 여러분이 정말로 이렇게 실행하고자 하다면, mysys/my_symlink.c의 소스 파일을 수정하면 되는데, 아래의 명령문
을 잘 살펴 보기 바란다:
위의 것을 아래와 같이 수정한다:
if (1)
제목검색
7. 최적화(Optimization)
7.6. 디스크 이슈 여러분은 realpath() 호출을 완벽하게 실행하지 못하는 시스템에서는 테이블을 심링크 시킬 수가 없다. (리눅스 및 솔라리스는
7.6.1 심볼릭 링크 사용하기 realpath()를 지원함). 여러분은 SHOW VARIABLES LIKE 'have_symlink' 명령문을 사용해서 지금 사용하고 있는 시스템이
릭 링크 사용하기
심링크는 MyISAM 테이블에 대해서만 전적으로 지원된다. 다른 스토리지 엔진을 위한 테이블이 사용하는 파일의 경우에는, 심볼
7.6.1.2 유닉스에 있는 테이블에 대한 심볼릭 링크
사용하기 릭 링크를 사용하고자 한다면 예상하지 못한 문제가 나올 수도 있다.
● 데이터 디렉토리에서, 여러분은 항상 (.frm)포맷 파일, (.MYD)데이터 파일, 그리고 (.MYI)인덱스 파일을 가지고 있다.
데이터 파일과 인덱스 파일은 다른 어떤 곳으로도 이동 시킬 수가 있고 데이터 디렉토리에서 심링크로 대체 시킬 수가 있
다. 포맷 파일은 그렇게 할 수가 없다.
● 데이터 파일과 인덱스 파일은 서로 별개의 디렉토리에 독립적으로 심링크 시킬 수가 있다.
● 여러분은 CREATE TABLE에 DATA DIRECTORY 및 INDEX DIRECTORY 옵션을 사용하면 구동 중인 MySQL 서버
가 심링크를 실행하도록 지시할 수가 있다. Section 13.1.5, “CREATE TABLE 신텍스”를 참조. 다른 방법으로는,
mysqld이 구동 중이 아니라면, 명령어 라인에서 ln –s를 실행 시켜서 수동으로 심링크를 만들어 낼 수도 있다.
● Myisamchk는 심링크를 데이터 파일 또는 인덱스 파일로 대체 시킬 수가 없다. 이것은 심링크가 가리키고 있는 파일에서
직접 동작을 한다. 임시 파일은 데이터 파일 또는 인덱스 파일이 저장되어 있는 디렉토리 안에서 만들어진다.
● Note: 심링크를 사용하고 있는 테이블을 종료 시키게 되면, 심링크가 가리키고 있는 심링크 및 파일이 모두 종료된다.
● 만일 여러분이 ALTER TABLE ... RENAME를 사용해서 테이블 이름을 변경 시키고 이것을 다른 데이터 베이스로 이동
시키지 않으면, 데이터 베이스 디렉토리에 있는 심링크는 새로운 이름으로 바뀌게 되고 데이터 파일과 인덱스 파일은 이
에 따라서 이름이 바뀌게 된다.
● 만일 여러분이 ALTER TABLE ... RENAME를 사용해서 테이블을 다른 데이터 베이스로 이동 시킨다면, 테이블은 다른
데이터 베이스 디렉토리로 옮겨지게 된다. 구형의 심링크와 이것이 가리키고 있는 파일들은 삭제가 된다. 달리 말하면, 새
로운 테이블은 심링크가 되지 않는다.
● 만일 여러분이 심링크를 사용하지 않는다면, --skip-symbolic-links 옵션을 mysqld에 사용해서 아무도 mysqld를 사
용해서 데이터 디렉토리 밖에 있는 파일의 이름을 바꾸거나 종료 시킬 수 없도록 해야 한다.
• shell> cd /path/to/datadir/db1
❍ 쿼리 캐시는 “fooled”가 된다 (쿼리 캐시는 tbl1가 업데이트 되지 않았음을 알 수 없고, 따라서 이전 내용만을
리턴한다).
❍ tbl2 에 있는ALTER 명령문은 실패한다.
제목검색
7. 최적화(Optimization)
7.6. 디스크 이슈 심볼릭 링크는 모든 윈도우 서버에 대해서 디폴트로 활성화 되어 있다. 이것은 여러분이 서로 다른 디스크에 있는
7.6.1 심볼릭 링크 사용하기 데이터 베이스 디렉토리를 가져 올 수 있도록 해 준다. 이것은 유닉스에서의 데이터 베이스 심볼릭 링크가 동작하
7.6.1.1 유닉스에 있는 데이터 베이스에 대한 심볼릭 링크 사용하기 는 방식과 유사하지만, 링크 설정 과정은 다르게 된다. 만일 심볼릭 링크가 필요 없다면, --skip-symbolic-
links 옵션을 사용해서 이것을 비 활성화 시키면 된다.
7.6.1.2 유닉스에 있는 테이블에 대한 심볼릭 링크 사용하기
7.6.1.3 윈도우에 있는 데이터 베이스에 대한 심볼릭 링크 사용하기
윈도우에서는, 목적 디렉토리 경로를 가지고 있는 데이터 디렉토리에 파일을 하나 생성함으로써 MySQL에 대한
심볼릭 링크를 만든다. 이 파일은 db_name.sym이라는 이름이 되어야 하고, 여기에서 db_name는 데이터 베이스
의 이름이 된다.
MySQL 데이터 디렉토리가 C:₩mysql₩data이고 D:₩data₩foo에 데이터 베이스 foo가 있도록 한다고 가정하
자. 이에 대한 심볼릭 링크는 다음과 같이 만들어 진다:
http://www.mysqlkorea.com/develop/sub_07.html?lcate=7&mcate=6&scate=1&idx=16432006-08-08 오후 6:02:17
:::MySQL Korea:::
제목검색
8.5.4.3 mysql 자동-재 접속 비활성화 시키기 8.11. mysqlhotcopy — 데이터 베이스 백업 프로그램
제목검색
8. 클라이언트 및 유틸리티 프로그램 아래의 리스트는 MySQL 클라이언트 프로그램과 유틸리티에 대한 개략적인 설명이다:
8.1. 클라이언트 및 유틸리티 프로그램 개요
MyISAM 테이블을 설명, 검사, 최적화, 그리고 복구를 하는 유틸리티. Section 8.2, “myisamchk — MyISAM 테이블
관리 유틸리티”를 참조.
● myisamlog
MyISAM 로그 파일의 컨텐츠를 처리하는 유틸리티. Section 8.3, “myisamlog — MyISAM 로그 파일 컨텐츠 표시하
기”를 참조할 것.
● myisampack
● mysql
● mysqlaccess
호스트 이름, 사용자 이름, 그리고 데이터 베이스 조합(combination)을 위한 접속 권한을 검사하는 스크립트.
● mysqladmin
데이터 베이스 생성 또는 제거, 그랜트 테이블 다시 읽기, 테이블을 디스크로 플러시하기, 그리고 로그 파일 다시 열기 등
과 같은 관리 연산을 수행하는 클라이언트. Mysqladmin은 서버로부터 버전, 프로세스, 그리고 상태 정보를 추출할 때에
도 사용될 수 있다. Section 8.7, “mysqladmin — MySQL 서버 관리를 위한 클라이언트”를 참조할 것.
● mysqlbinlog
바이너리 로그에서 명령문을 읽어 오기 위한 유틸리티. 바이너리 로그 파일에 저장되어 있는 실행된 명령문의 로그는 크래
시 복구를 위해서도 사용될 수 있다. Section 8.8, “mysqlbinlog — 바이너리 로그 파일 처리를 위한 유틸리티”를 참조
할 것.
● mysqlcheck
테이블 검사, 복구, 분석, 그리고 최적화를 수행하는 테이블 관리 클라이언트. Section 8.9, “mysqlcheck — 테이블 관
리 및 복구 프로그램”을 참조할 것.
● mysqldump
MySQL 데이터 베이스를 SQL 명령문 또는 탭으로 분리된 텍스트 파일 형태로 파일안으로 덤프하는 클라이언트.
Section 8.10, “mysqldump — 데이터 베이스 백업 프로그램”을 참조할 것.
● mysqlhotcopy
서버가 구동되는 동안 MyISAM 테이블의 백업을 만드는 유틸리티. Section 8.11, “mysqlhotcopy — 데이터 베이스 백
업 프로그램”을 참조할 것.
● mysqlimport
LOAD DATA INFILE을 사용해서 텍스트 파일을 연관된 테이블로 임포트(import)하는 클라이언트. Section 8.12,
● mysqlshow
데이터 베이스, 테이블, 컬럼, 그리고 인덱스 정보를 표시하는 클라이언트. Section 8.13, “mysqlshow — 데이터 베이
스, 테이블, 그리고 컬럼 정보 표시하기”를 참조할 것.
● mysql_zap
패턴과 일치하는 프로세스를 죽이는(kill) 유틸리티. Section 8.14, “mysql_zap — 패턴과 일치하는 프로세스 죽이기
(Kill)”를 참조할 것.
● perror
시스템 또는 MySQL에러 코드의 의미를 표시하는 유틸리티. Section 8.15, “perror — 에러 코그 설명”을 참조할 것.
● replace
입력 텍스트에서 스트링 대체를 수행하는 유틸리티. Section 8.16, “replace — 스트링 대체 유틸리티”를 참조할 것.
MySQL AB는 관리를 위한 GUI 툴도 여러 가지를 제공하고 있다. 이러한 툴에 대해서는 Chapter 4, MySQL 프로그램 을 참조하
기 바란다.
각각의 MySQL 프로그램은 서로 다른 옵션들을 가지고 있다. 대부분의 프로그램은 --help 옵션을 가지고 있으며, 여러분은 이것
을 사용해서 각 프로그램이 사용할 수 있는 옵션들을 살펴볼 수가 있다. 예를 들면, mysql –help를 시도해 본다.
MySQL 클라이언트/서버 라이브러리를 사용해서 서버와 통신을 하는 클라이언트 프로그램은 아래와 같은 환경 변수를 사용한다:
MYSQL_UNIX_PORT The default Unix socket file; used for connections to localhost
TMPDIR The directory where temporary tables and files are created
여러분은 옵션 파일에서 또는 명령어 라인에서 옵션을 지정함으로써 모든 표준 프로그램에 대해서 환경 변수에 지정되어 있는 값
또는 디폴트 옵션 값을 덮어 씌울 수가(override) 있다. Section 4.3, “프로그램 옵션 지정하기”를 참조할 것.
제목검색
제목검색
8.2. myisamchk — MyISAM 테이블 관리 유 이 섹션에서는 myisamchk가 수행하는 모든 타입의 테이블 관리 연산을 위해서 사용될 수 있는 옵션들에 대해서 설명하기로 한
틸리티 다..
● --debug=debug_options, -# debug_options
● --silent, -s
침묵 모드(Silent mode). 에러가 발생될 때에만 결과를 작성한다. 여러분은 –s를 두 번 사용해서 (-ss) myisamchk
로 하여금 아주 침묵하도록 만들 수가 있다.
● --verbose, -v
버보스(Verbose) 모드. 프로그램이 실행하고 있는 사항에 대해 자세한 정보를 표시한다. 이것은 -d 와 –e를 사용해서
실행시킬 수가 있다. –v를 여러 번 사용할 수도 있다 (-vv, -vvv).
● --version, -V
● --wait, -w
테이블이 잠겨 있는 경우에 에러를 가지고 종료하는 대신에, 테이블이 풀릴 때까지 대기를 한다. 만일 여러분이 외부 잠금
을 비 활성화 한 상태로 mysqld를 구동 시킨다면, 테이블은 또 다른 myisamchk 명령어에 의해서만 잠겨질 수 있다는 점
을 알아두자.
decode_bits 9
ft_max_word_len version-dependent
ft_min_word_len 4
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
sort_buffer_size는 정렬 키에 의해 키가 복구될 때 사용되며, 여러분이 –recover를 사용하는 경우는 일반적인 경우가 된다.
키 버퍼를 통한 복구는 정렬을 사용하는 것 보다 디스크 공간을 덜 사용하지만, 속도는 더 느려지게 된다.
만일 여러분이 모다 빠른 복구를 하고자 한다면, key_buffer_size 와 sort_buffer_size 변수를 여러분이 사용 가능한 메모리의
25% 정도로 늘려 준다. 여러분은 이 두 변수를 모두 크게 만들 수가 있는데, 그 이유는 한번에 하나만 사용되기 때문이다.
stats_method는--analyze 옵션이 주어졌을 때 인덱스 통계 수집을 위해서는 NULL 값을 어떻게 다루어야 하는지를 나타낸다.
이것은 myisam_stats_method 시스템 변수와 비슷하게 동작을 한다. 보다 자세한 정보는 Section 5.2.2, “Server System
Variables”, 그리고 Section 7.4.7, “MyISAM Index Statistics Collection”에 있는 myisam_stats_method에 대한 설명을 참
조하기 바란다. MySQL 5.0의 경우, stats_method는 MySQL 5.0.14에서 추가 되었다. 이 보다 오래된 버전의 경우, 통계 수집 방
식은 nulls_equal과 같다.
만일 여러분이 myisamchk를 사용해서 테이블 인덱스를 수정하는(예를 들면 복구 또는 분석) 연산을 실행하고자 한다면, 여러분
이 다른 것들을 지정하지 않는 한 최소 최대 문자 길이에 대한 디폴트 전체 텍스트 파라미터 및 스톱워드 파일을 사용해서
FULLTEXT 인덱스를 재 구축한다. 이것은 쿼리에서 문제가 발생한다.
이러한 파라미터들은 서버에만 알려져 있기 때문에 문제가 발생하는 것이다. 이것들은 MyISAM 인덱스 파일에는 저장되지 않는
다. 여러분이 서버에서 최소 최대 문자 길이 또는 스톱워드를 수정할 경우에 이러한 문제를 피하기 위해서는, 여러분이 mysqld용으
로 사용한 것과 같은 ft_min_word_len, ft_max_word_len, 그리고 ft_stopword_file값을 myisamchk에 지정해 주면 된다. 예를
들면, 만일 여러분이 최소 문자 길이를 3으로 설정을 했다면, myisamchk를 사용해서 아래와 같이 테이블을 복구할 수가 있다:
myisamchk 및 서버가 전체 텍스트 파라미터에 대해서 동일한 값을 확실하게 사용하도록 하기 위해서는, 옵션 파일의 [mysqld]
및 [myisamchk] 섹션 모두에 이것을 지정해 준다:
[mysqld]
ft_min_word_len=3
[myisamchk]
ft_min_word_len=3
myisamchk를 사용할 수 있는 다른 방법으로는 REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE, 또는 ALTER
TABLE를 사용하는 것이다. 이러한 명령문들은 서버가 실행하는 것이며, 서버는 올바른 전체 텍스트 파라미터 값을 알게 된다.
제목검색
8.2. myisamchk — MyISAM 테이블 관리 유틸리티 Myisamchk은 테이블 검사 연산에 대해서 아래의 옵션들을 지원한다:
8.2.2 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
검사된 것으로 테이블을 표시하지 않는다. 이 옵션은 잠금을 사용하지 않는 다른 어플리케이션이 사용하고 있는 테
이블을 검사하기 위해 myisamchk를 사용하는 경우에 유용하다.
● --update-state, -U
테이블을 검사해서 그 테이블이 깨졌는지를 알려주기 위해 정보를 .MYI 파일에 저장한다. 이 옵션은 --check-
only-changed 옵션의 효과를 전체적으로 얻기 위해서는 사용할 수 있지만, 만일을 전체적 mysqld 서버가 그 테이
블을 사용하고 있고 여러분이 외부 잠금을 비 활성화 시킨 채로 구동 시키는 경우에는 이 옵션을 사용할 수 없다.
제목검색
8.2. myisamchk — MyISAM 테이블 관리 유틸리티 myisamchk은 테이블 복구 연산을 위해서 아래의 옵션들을 지원한다:
● --character-sets-dir=path
● --correct-checksum
● --data-file-length=len, -D len
● --extend-check, -e
데이터 파일로부터 가능한 모든 열을 복구하기 위한 시도를 한다. 일반적인 경우, 이것은 많은 수의 가비지
(garbage) 열도 같이 찾게 된다. 꼭 필요한 경우가 아니면 이 옵션을 사용하지 않도록 한다.
● --force, -f
● --keys-used=val, -k val
● --max-record-length=len
myisamchk이 열을 가지게 위해 메모리를 할당하지 못하는 경우에는, 주어진 길이보다 긴 열은 건너 띄도록 한다.
● --parallel-recover, -p
Uses the same technique as -r 및 –n과 같은 형태의 기법을 사용하지만, 다른 쓰레드를 사요해서 모든 키를 병
렬로 생성한다. 아직은 베타 테스트 중인 코드이다.
● --quick, -q
● --recover, -r
● --safe-recover, -o
● --set-character-set=name
● --set-collation=name
● --sort-recover, -n
● --tmpdir=path, -t path
정렬용 임시 파일을 위해서 사용되는 디렉토리의 경로. 만일 이것이 설정되지 않으면, myisamchk은 TMPDIR 환
경 변수의 값을 사용하게 된다. tmpdir은 임시 파일을 생성하기 위한 라운드-로빈 방식으로 연속적으로 사용된 디
렉토리의 경로 리스트로 설정될 수 있다. 디렉토리 이름간의 구분 문자는 유닉스에서는 콜론 (‘:’)이고 윈도우,
넷웨어, 그리고 OS/2에서는 세미 콜론 (‘;’)이 된다.
● --unpack, -u
제목검색
8.2. myisamchk — MyISAM 테이블 관리 유틸리티 Myisamchk은 테이블 검사 및 복구 이외의 동작에 대해서는 아래의 옵션을 지원한다:
8.2.4 다른 myisamchk 옵션
● --analyze, -a
● --block-search=offset, -b offset
● --description, -d
● --set-auto-increment[=value], -A[value]
● --sort-index, -S
내림 차순(high-low order)으로 트리 블록을 정렬한다. 이것은 검색을 최적화 시키고 인덱스를 사용하는 테이블
스캔을 보다 빠르게 실행한다.
● --sort-records=N, -R N
제목검색
8.2. myisamchk — MyISAM 테이블 관리 유 여러분이 myisamchk 구동 시킬 때에는 메모리 할당이 매우 중요하다. Myisamchk은 메모리 관련 변수가 설정되면 더 이상 메모
틸리티 리를 사용하지 않게 된다. 만일 여러분이 매우 큰 테이블에서 myisamchk를 사용하고자 한다면, 우선 얼마나 많은 메모리를 사용
8.2.5 myisamchk 메모리 사용 할 지를 결정해야 한다. 디폴트는 복구를 실행하기 위해서 약 3MB를 사용하는 것이다. 이 보다 큰 값을 사용한다면, 여러분은
myisamchk 실행 속도를 보다 빠르게 만들 수가 있게 된다. 예를 들면, 만일 여러분이 32MB이상의 메모리를 가지고 있다면, 여러
분은 아래와 같이 옵션을 사용할 수 있을 것이다:
● 데이터 파일의 두 배 크기가 필요하다 (원본 파일과 복사본). 만일 여러분이 --quick를 사용해서 복구를 한다면, 이 공간
은 필요 없게 된다; 이와 같은 경우에는, 인덱스 파일만이 재 생성된다. 이 공간은 원본 데이터 파일과 동일한 파일 시스템
에서 필요하게 된다! (복사본은 원본 파일의 디렉토리와 동일한 곳에 생성된다.)
● 이전 인덱스 파일을 대체하는 새로운 인덱스 파일을 위한 공간. 이전(구형) 인덱스 파일은 복구 동작이 시작될 때 잘려 나
간다 (truncated). 이 공간은 원본 인덱스 파일과 동일한 파일 시스템에서 필요하게 된다!
● --recover 또는 --sort-recover (--safe-recover를 사용할 때가 아님)를 사용할 때에는, 정렬 버퍼용 공간이 필요
여러분은 키 길이와 row_pointer_length의 길이를 myisamchk -dv tbl_name를 사용해서 검사할 수가 있다. 이 공간은
임시 디렉토리에 할당된다 (TMPDIR 또는 --tmpdir=path에 의해 지정됨).
만일 여러분이 복구를 하는 과정 중에 디스크 공간에 관련된 문제를 가지게 되면, --recover를 사용하지 말고 --safe-recover
를 시도해 보기 바란다.
제목검색
8.3 myisamlog — MyISAM 로그 파일 컨텐츠 표시하기 shell> myisamlog [options] [log_file [tbl_name] ...]
디폴트 연산은 업데이트다 (-u). 만일 복구(recovery)를 실행하면 (-r), 모든 쓰기(all write)와 가능한 업데이트
(possibly update) 그리고 삭제가 실행되고 에러는 카운트만 된다. 디폴트 로그 파일 이름은, 아무런 log_file 인수도 주
어지지 않을 경우라면, myisam.log이 된다. 만일 테이블 이름을 명령어 라인에서 주게 되면, 그 테이블만이 업데이트가
된다.
myisamlog는 아래의 옵션들을 지원한다:
● -?, -I
● -c N
N 명령어만을 실행한다.
● -f N
● -i
● -o offset
시작 오프셋을 지정한다.
● -p N
● -r
복구 동작을 실행한다.
● -R record_pos_file record_pos
● -u
● -v
버보스 모드(Verbose mode). 프로그램이 진행한 내용을 자세히 보여준다. 보다 많은 정보를 얻고자 한다면
이 옵션을 여러 번 사용할 수 있다.
● -w write_file
쓰기 파일을 지정한다.
● -V
버전 정보를 보여준다.
제목검색
8. 클라이언트 및 유틸리티 프로그램 myisampack 유틸리티는 MyISAM 테이블을 압축한다. Myisampack은 테이블에 있는 컬럼을 개별적으로 압축한다.
8.4. myisampack — 압축된, 읽기 전용 MyISAM 테이블 일반적으로, myisampack는 데이터 파일을 40%-70% 정도 압축을 한다.
만들기 테이블이 나중에 사용될 때에는, 서버는 압축을 해제하고자 하는 컬럼의 정보를 메모리로 읽어 온다. 이렇게 하면 각
8.4 myisampack — 압축된, 읽기 전용 MyISAM 테이블 만들 각의 열에 접속을 할 때 보다 성능이 좋아 지는데, 그 이유는 여러분은 정확히 하나의 열만을 압축 해제할 수 있기 때문
기 이다.
MySQL은 압축된 테이블에 메모리 매핑을 실행할 때 mmap()를 사용한다. 만일 mmap()이 동작을 하지 않는다면,
MySQL은 일반적인 읽기/쓰기 동작을 실행한다.
아래의 사항에 대해서는 주의를 하기 바란다:
● --help, -?
● --backup, -b
● --character-sets-dir=path
● --debug[=debug_options], -# [debug_options]
● --force, -f
● --join=big_tbl_name, -j big_tbl_name
명령어 라인에서 이름을 지정한 모든 테이블을 하나의 테이블 big_tbl_name로 조인(join)시킨다. 결합이 되
어야 할 모든 테이블은 반드시 동일한(identical) 구조를 가지고 있어야 한다 (같은 컬럼 이름과 타입,같은 인
덱스, 등등).
● --packlength=len, -p len
● --silent, -s
● --test, -t
● --tmpdir=path, -T path
● --verbose, -v
● --version, -V
● --wait, -w
것은 좋은 방법이 아니다.
아래의 명령어들은 전형적인 테이블 압축 세션을 보여 주는 것들이다:
shell> ls -l station.*
-rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.MYD
-rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.MYI
-rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm
table description:
Key Start Len Index Type Root Blocksize Rec/key
1 2 4 unique unsigned long 1024 1024 1
2 32 30 multip. text 10240 1024 1
6 31 1
7 32 30
8 62 35
9 97 35
10 132 35
11 167 4
12 171 16
13 187 35
14 222 4
15 226 16
16 242 20
17 262 20
18 282 20
19 302 30
20 332 4
21 336 4
22 340 1
23 341 8
24 349 8
25 357 8
26 365 2
27 367 2
28 369 4
29 373 4
30 377 1
31 378 2
32 380 8
33 388 4
34 392 4
35 396 4
36 400 4
37 404 1
38 405 4
39 409 4
40 413 4
41 417 4
42 421 4
43 425 4
44 429 20
45 449 30
46 479 1
47 480 1
48 481 79
49 560 79
50 639 79
51 718 79
52 797 8
53 805 1
54 806 1
55 807 20
56 827 4
57 831 4
87.14%
Remember to run myisamchk -rq on compressed tables
shell> ls -l station.*
-rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.MYD
-rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.MYI
-rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm
table description:
Key Start Len Index Type Root Blocksize Rec/key
1 2 4 unique unsigned long 10240 1024 1
2 32 30 multip. text 54272 1024 1
5 11 20 table-lookup 4 0
6 31 1 3 9
7 32 30 no endspace, not_always 5 9
8 62 35 no endspace, not_always, no empty 6 9
9 97 35 no empty 7 9
10 132 35 no endspace, not_always, no empty 6 9
11 167 4 zerofill(1) 2 9
12 171 16 no endspace, not_always, no empty 5 9
13 187 35 no endspace, not_always, no empty 6 9
14 222 4 zerofill(1) 2 9
15 226 16 no endspace, not_always, no empty 5 9
16 242 20 no endspace, not_always 8 9
17 262 20 no endspace, no empty 8 9
18 282 20 no endspace, no empty 5 9
19 302 30 no endspace, no empty 6 9
20 332 4 always zero 2 9
21 336 4 always zero 2 9
22 340 1 3 9
23 341 8 table-lookup 9 0
24 349 8 table-lookup 10 0
25 357 8 always zero 2 9
26 365 2 2 9
27 367 2 no zeros, zerofill(1) 2 9
28 369 4 no zeros, zerofill(1) 2 9
29 373 4 table-lookup 11 0
30 377 1 3 9
31 378 2 no zeros, zerofill(1) 2 9
32 380 8 no zeros 2 9
33 388 4 always zero 2 9
34 392 4 table-lookup 12 0
● normal
● empty-space
● empty-zero
● empty-fill
자신의 타입의 전체 바이트 범위를 갖추지 못하는 정수 컬럼의 숫자. 이것은 보다 작은 타입으로 변경된다. 예
를 들면, BIGINT 컬럼(8 바이트)은 자신의 모든 값이 -128 에서 127 사이의 범위에 있다면 TINYINT 컬럼
(1 바이트) 형태로 저장된다.
● pre-space
스페이스가 앞에 두고(leading space) 저장된 10진 컬럼의 숫자. 이와 같은 경우, 각각의 값은 앞에 나오는
스페이스의 숫자를 카운트 한다.
● end-space
● table-lookup
● zero
모든 값이 0인 컬럼의 숫자.
● Original trees
● After join
● Type
❍ constant
동일한 값을 가지는 모든 열.
❍ no endspace
❍ no endspace, not_always
❍ no endspace, no empty
❍ table-lookup
❍ zerofill(N)
❍ no zeros
0을 저장하지 않는다.
❍ always zero
● Huff tree
● Bits
제목검색
8.5 mysql — MySQL 명령어 라인 툴 8.5.3. 텍스트 파일로부터 SQL 명령문 실행하기
http://www.mysqlkorea.com/develop/sub_07.html?lcate=8&mcate=5&scate=0&idx=16872006-08-08 오후 6:03:45
:::MySQL Korea:::
제목검색
8.5.1 mysql 옵션
● --help, -?
● --auto-rehash
● --batch, -B
● --character-sets-dir=path
● --column-names
● --compress, -C
● --database=db_name, -D db_name
● --debug[=debug_options], -# [debug_options]
● --debug-info, -T
● --default-character-set=charset_name
charset_name를 디폴트 문자 셋으로 사용한다. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”를 참조할
것.
● --delimiter=str
● --execute=statement, -e statement
명령문을 실행하고 종료한다. 디폴트 결과 포맷은 --batch이 만든 것과 비슷하다. Section 4.3.1, “명령어 라인에서 옵
션 사용하기”을 참조할 것.
● --force, -f
● --host=host_name, -h host_name
● --html, -H
● --ignore-spaces, -i
함수 이름 다음에 나오는 스페이스를 무시한다. 이 옵션의 효과는 IGNORE_SPACE SQL 모드에 대한 설명에서 다루어
져 있다 (Section 5.2.5, “서버 SQL 모드”를 참조할 것).
● --line-numbers
● --local-infile[={0|1}]
LOAD DATA INFILE에 대한 LOCAL 기능을 활성화 또는 비활성화 시킨다. 아무런 값이 없다면, 이 옵션은 LOCAL을
활성화 시킨다. 이 옵션은 LOCAL을 명확하게 비활성화 또는 활성화 시키기 위해 --local-infile=0 또는 --local-
infile=1 형태로 표현된다. 만일 서버가 이 옵션을 지원하지 않으면, LOCAL를 활성화 시키는 의미가 없게 된다.
● --named-commands, -G
● --no-auto-rehash, -A
● --no-beep, -b
● --no-named-commands, -g
네임드 명령어를 비 활성화 시킨다. 세미 콜론 (‘;’)을 가지고 끝나는 라인의 처음 부분에서는 ₩* 형태만을 사용하거
나, 또는 네임드 명령어만을 사용한다. mysql은 디폴트로 이 옵션이 활성화 된 상태로 시작을 한다. 하지만, 이 옵션을 사
용한다고 하더라도, 긴-포맷 명령어는 맨 처음 라인에서부터 시작을 한다. Section 8.5.2, “mysql 명령어”를 참조할
것.
● --no-pager
● --no-tee
결과를 파일로 복사하지 말도록 한다. Section 8.5.2, “mysql 명령어”를 참조하여 티 파일(tee file)에 대해서 알아 본
다.
● --one-database, -o
명령어 라인에서 지명된 디폴트 데이터 베이스에 대한 것을 제외하고 다른 명령문은 무시를 한다. 이 옵션은 바이너리 로
그에서 다른 데이터 베이스를 업데이트하지 못하도록 하는 경우에 유용하다.
● --pager[=command]
● --password[=password], -p[password]
서버에 접속을 할 때 사용하는 패스워드. 만일 여러분이 짧은 옵션 형태 (-p)를 사용한다면, 옵션과 패스워드 중간에 스페
이스를 가질 수 없다. 만일 여러분이 명령어 라인에서 --password 또는 -p 옵션 다음에 password 값을 생략한다면, 프
롬프트가 나오게 된다.
명령어 라인에서 패스워드를 지정하는 것은 안전한 방법이 아니다. Section 5.9.6, “패스워드보안 유지하기”를 참조할
것.
● --port=port_num, -P port_num
● --prompt=format_str
● --protocol={TCP|SOCKET|PIPE|MEMORY}
사용할 접속 프로토콜.
● --quick, -q
각각의 쿼리 결과를 캐시에 넣지 않고, 결과가 나올 때 마다 한 줄씩 출력한다. 결과가 느리게 나오는 경우에는 서버의 속
도를 느리게 만든다. 이 옵션을 사용하면, mysql은 히스토리 파일(history file)을 사용하지 않게 된다.
● --raw, -r
● --reconnect
서버에 대한 접속을 잃게 되면, 자동으로 재 접속을 시도하게 된다. 접속을 잃게 될 때 마다 한번씩 재 접속을 시도하게 된
다. 재 접속 동작을 없애기 위해서는, --skip-reconnect를 사용한다.
● --safe-updates, --i-am-a-dummy, -U
● --secure-auth
4.11. 이전 버전 포맷의 패스워드는 서버에 보내지 못하도록 한다. 새로운 패스워드 포맷을 사용하지 않는 접속을 막을 때
사용할 수 있다.
● --show-warnings
● --sigint-ignore
● --silent, -s
● --skip-column-names, -N
● --skip-line-numbers, -L
에러가 발생한 라인 번호를 쓰지 않도록 한다. 에러 메시지를 포함하는 결과 파일을 비교하고자 할 경우에 유용한 옵션이
다.
● --socket=path, -S path
localhost에 접속을 하는 경우, 사용할 유닉스 소켓 파일, 또는 윈도우에서 사용할 네임드 파이프의 이름.
● --table, -t
테이블 포맷으로 결과를 출력한다. 이것은 인터액티브 모드에서는 디폴트이지만, 배치 모드에서도 결과를 테이블 모드를
만들기 위해 사용될 수 있다.
● --tee=file_name
결과물에 대한 복사본은 주어진 파일에 첨부한다. 이 옵션은 배치 모드에서는 동작하지 않는다. Section 8.5.2, “mysql
명령어”를 참조할 것.
● --unbuffered, -n
● --user=user_name, -u user_name
● --verbose, -v
버보스 모드(Verbose mode). 프로그램이 실행한 사항에 대해 자세한 정보를 출력한다. 이 옵션은 여러 번 반복 사용을
할 수가 있다. (예를 들면, -v -v –v는 배치 모드에서도 테이블 결과 포맷을 만들어 낸다.)
● --version, -V
● --vertical, -E
쿼리의 과 열을 횡(vertically)으로 출력한다 (컬럼 값 당 하나의 라인). 이 옵션을 사용하지 않으면, 각각의 명령문을 ₩G
를 사용해서 종료 시킴으로써 횡으로 결과를 표시하도록 만들 수가 있다.
● --wait, -w
● --xml, -X
● connect_timeout
● max_allowed_packet
● max_join_size
● net_buffer_length
● select_limit
유닉스에서는, mysql 클라이언트는 실행된 명령문의 레코드를 히스토리 파일에 작성한다. 디폴트로는, 히스토리 파일의 이름이 .
mysql_history 이며 홈 디렉토리 안에서 생성된다. 다른 이름을 지정하기 위해서는, MYSQL_HISTFILE 환경 변수의 값을 설정한
다.
만일 여러분이 히스토리 파일을 관리하고 싶지 않다면, 우선 .mysql_history 를 제거하고, 그 다음에 아래의 기법 중에 하나를 사용
한다:
제목검색
8.5. mysql — MySQL 명령어 라인 툴 mysql 은 여러분이 입력하는 각각의 SQL 명령문을 서버에 전달해서 실행이 되도록 한다. 여기에는 mysql은 또한 자체가 해석할
8.5.2 mysql 명령어 수 있는 명령어 셋이 있다. 이러한 명령어 리스트는, help 또는 ₩h를 mysql> 프롬프트에서 입력하면 볼 수가 있다:
mysql> help
Note that all text commands must be first on line and end with ';'
connect (₩r) Reconnect to the server. Optional arguments are db and host.
delimiter (₩d) Set statement delimiter. NOTE: Takes the rest of the line as
new delimiter.
pager (₩P) Set PAGER [to_pager]. Print the query results via PAGER.
source (₩.) Execute an SQL script file. Takes a file name as an argument.
outfile.
charset (₩C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
각각의 명령어는 긴 폼과 짧은 폼을 모두 가지고 있다. 긴 폼은 대소 문자를 구분하지 않지만 짧은 포맷은 구분을 한다. 긴 폼은 뒤
에 세미 콜론 터미네이터를 선택적으로 가질 수 있지만, 짧은 폼은 가질 수가 없다.
delimiter 명령어에서는, 백 슬레쉬 (‘₩’) 문자를 사용하지 말아야 하는데, 그 이유는 이 문자가 MySQL에서는 이스케이프
(escape)문자이기 때문이다.
status 명령어는 여러분이 사용하고 있는 서버 및 접속 정보를 제공한다. 만일 여러분이 --safe-updates 모드에서 서버를 구동
중이라면, status는 여러분이 사용하는 쿼리에 영향을 주는 mysql 변수 값도 출력을 하게 된다.
쿼리와 그 결과에 로그를 하기 위해서는, tee 명령어를 사용한다. 스크린에 표시되는 모든 데이터는 주어진 파일에 첨부가 된다. 이
것은 디버깅 목적으로도 유용하게 사용할 수가 있다. 여러분은 이 기능을 명령어 라인에서 --tee 옵션을 사용해서 활성화 시킬
수 있거나, 또는 tee 명령어를 사용해서 인터액티브(interactive)하게 활성화 시킬 수가 있다. tee 파일은 notee 명령어를 사용해
서 비 활성화 시킬 수 있다. Tee를 다시 실행 시키면 재 활성화 시킬 수가 있게 된다. 파라미터를 사용하지 않으면, 이전
(previous) 파일이 사용된다. tee 명령어는 각 명령문이 실행된 후에, 그리고 mysql이 다음 프롬프트를 출력하기 전에 쿼리 결과
를 파일에 플러시한다는 점을 알아두자.
--pager 옵션을 사용하면, less, more와 같은 유닉스 프로그램, 또는 다른 비슷한 프로그램을 사용해서 인터액티브 모드에서 쿼
리 결과를 검색 또는 브라우즈(browse)할 수 있게 된다. 만일 여러분이 이 옵션에 아무런 값을 지정하지 않으면, mysql은
PAGER 환경 변수의 값을 검사하고 이것을 페이저에 설정한다. 결과 페이징은 pager 명령어를 가지고 활성화 시킬 수 있으며
nopager를 가지고 비활성화 시킬 수 있다. 명령어는 옵션 인수를 가진다; 만일 옵션 인수가 주어진다면, 페이징 프로그램은 그것
을 설정한다. 인수가 없다면, 페이저는 명령어 라인에서 설정된 페이저로 설정되거나, 또는 아무런 페이저가 없는 경우에는 stdout
가 된다.
결과 페이징은 popen() 함수를 사용하기 때문에 유닉스에서만 동작을 하는데, 윈도우에서는 이 함수를 지원하지 않는다. 윈도우
의 경우, tee 옵션은 비록 어떤 환경에서는 편리한 방식은 아닐 지라도 쿼리 결과를 저장하는데 대신 사용될 수도 있다.
● 위의 예에서 -S 옵션을 주목하도록 한다. 여러분은 이것이 수평으로 넓은(wide) 쿼리 결과를 브라우징(browsing)하는
데 매우 유용하다는 점을 알 수 있을 것이다. 때때로 매우 넓은 결과를 스크린에서 읽기가 어려울 때가 있다. less에 대한 -
S 옵션은 여러분이 왼쪽과 오른 쪽 화살표 키를 사용해서 결과를 수평(horizontally)으로 스크롤(scroll)할 수 있게끔 해
준다. 또한 이 옵션을 less과 함께 사용하면 수평-브라우즈(horizontal-browse) 모드를 온(on)/오프(off)시킬 수도 있
게 된다. 보다 자세한 정보는, less 매뉴얼 페이지를 읽도록 한다:
또한, 여러분은 tee 와 pager 함수를 서로 연결시킬 수도 있다. tee 파일을 활성화 시키고 pager를 less에 설정하면, 여러분은
and you are able to browse the results using the less 프로그램을 사용해서 그 결과를 브라우즈할 수 있고 동시에 모든 것을
파일에 첨부 시킬 수 있게 된다. pager 명령어와 함께 사용된 유닉스 tee와 tee 명령어에 빌트-인(built-in)된 mysql간의 차이점
은, 여러분이 유닉스 tee를 사용하지 못하는 경우가 되더라도 빌트-인 tee는 동작을 한다는 점이다. 빌트-인 tee 는 또한 스크린
에 표시되는 모든 것을 로그 하지만, pager와 함께 사용된 유닉스 tee는 그렇게 되지 않는다. 부가적으로, tee 파일 로깅은 mysql
내부에서 인터 액티브하게 온(On)/오프(Off)될 수 있다 이 기능은 여러분이 어떤 쿼리만을 파일에 로그하고자 할 때 유용하게 사
용할 수 있다.
디폴트 mysql> 프롬프트는 재 구성될 수 있다. 프롬프트를 정의하기 위한 스트링은 아래의 특수 시퀀스를 갖는다:
Option Description
₩u Your username
₩n A newline character
₩t A tab character
₩_ A space
₩P am/pm
₩S Semicolon
• (user@host) [database]>
● 옵션 파일 사용. MySQL 옵션 파일의 [mysql] 그룹에 있는 prompt 옵션을 설정한다. 홈 디렉토리에 있는 /etc/my.cnf 또
는 .my.cnf 파일을 사용한다. 예를 들면:
• [mysql]
• prompt=(₩₩u@₩₩h) [₩₩d]>₩₩_
이 예문에서 보면, 백 슬레시가 두 번 반복 사용된 점을 유의한다. 만일 옵션 파일에 있는prompt 옵션을 사용해서 프롬프
트를 설정한다면, 특별 프롬프트 옵션을 사용할 때 백 슬레시를 두 번 사용하는 것이 좋다. 사용이 허용된 프롬프트 옵션
셋 및 옵션 파일에서 인식되는 특수 이스케이프(escape) 시퀀스 셋에는 오버랩(oberlap)되는 것들이 몇 가지 존재한다.
(이러한 시퀀스들은 Section 4.3.2, “옵션 파일 사용하기”에 나와 있다.) 따라서, 백 슬레시를 중복해서 사용하지 않게
되면 이러한 오버랩으로 인해 문제가 생길 수도 있게 된다. 예를 들면, ₩s는 현재 초(second) 값으로 해석되는 대신에 스
페이스로 해석이 된다. 아래의 예문에서는 현재의 시간을 HH:MM:SS> 포맷으로 옵션 파일 안에 포함 시키기 위한 프
롬프트 정의 방법을 보여준다:
[mysql]
prompt="₩₩r:₩₩m:₩₩s> "
● 인터 액티브하게 프롬프트를 설정한다. prompt (또는 ₩R) 명령어를 사용해서 인터 액티브하게 프롬프트를 변경 시킬 수
가 있다. 예를 들면:
• (user@host) [database]>
• mysql>
제목검색
하지만, SQL 명령문을 파일 안에 넣은 다음에 mysql로 하여금 그 파일을 읽어 오도록 만들 수도 있다. 이렇게 하기 위해서는, 실행
하고자 하는 명령문을 가지고 있는 텍스트 파일 text_file that 을 생성해야 한다. 그 다음에 아래와 같이 mysql를 호출한다:
만일 그 파일의 첫 줄에 USE db_name 명령문을 놓는다면, 명령어 라인에서 데이터 베이스 이름을 지정할 필요가 없어진다:
mysql> ₩. file_name
때로는 여러분이 사용한 스크립트의 진행 과정을 출력하도록 만들고 싶을 경우가 있다. 이렇게 하기 위해서는 아래와 같이 명령문
을 파일에 삽입하면 된다:
배치 모드에 대한 보다 자세한 정보는 Section 3.5, “배치 모드에서 mysql 사용하기”를 참조할 것.
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=8&mcate=5&scate=4&idx=16912006-08-08 오후 6:04:04
:::MySQL Korea:::
제목검색
8.5. mysql — MySQL 명령어 라인 툴 어떤 쿼리 결과들은 화면에 수평이 아닌 횡으로 출력을 하는 것이 보다 읽기 편할 경우가 있다. 쿼리를 세미 콜론이 아닌 ₩G로 끝
8.5.4 mysql 팁 맺게 되면 그 결과가 화면에 횡으로 표시가 된다. 예를 들면, newlines 을 포함하는 긴 텍스트 값들은 횡으로 표시하는 것이 보다
msg_nro: 3068
time_zone: +0200
mail_from: Monty
reply: monty@no.spam.com
sbj: UTF-8
Regards,
Monty
file: inbox-jani-1
hash: 190402944
제목검색
8.5. mysql — MySQL 명령어 라인 툴 초보 사용자의 경우, 유용하게 사용할 수 있는 스타트업 옵션이 --safe-updates (또는 --i-am-a-dummy)일 것이다. 이것
8.5.4 mysql 팁 은 여러분이 DELETE FROM tbl_name 명령어를 입력하면서 WHERE 구문을 잊고 사용하지 않을 경우에 도움이 될 것이다. 보통
8.5.4.1 쿼리 결과를 횡으로(Vertically) 출력하기 의 경우, 이 같은 명령문은 테이블에서 모든 열을 삭제한다. --safe-updates를 사용하면, 여러분은 키 값을 지정한 열만 삭제할
수가 있다. 이렇게 하면 실수를 막을 수가 있다.
8.5.4.2 --safe-updates 옵션 사용하기
8.5.4.3 mysql 자동-재 접속 비활성화 시키기
--safe-updates 옵션을 사용하면, mysql은 MySQL 서버에 접속을 할 때 아래의 명령문을 입력한다:
● 여러분이 WHERE 구문에 키 항수 값을 지정하지 않거나 또는 LIMIT 구문을 제공하지 않으면(또는 둘 다) UPDATE 또
는 DELETE 명령문을 실행할 수가 없다. 예를 들면:
1,000 에서 1,000,000 사이의 한계를 지정하기 위해서는, --select_limit 및 --max_join_size 옵션을 사용해서 디폴트를 무시
제목검색
8.5. mysql — MySQL 명령어 라인 툴 만일 mysql 클라이언트가 쿼리를 보내는 도중에 서버와 접속이 끊어지게 되면, 클라이언트는 즉시 자동으로 서버와 재 접속을 시
8.5.4 mysql 팁 도하고 쿼리를 다시 전송한다.하지만, mysql이 재 접속에 성공한다고 하더라도, 처음에 했던 접속은 종료가 되었기 때문에 이전에
8.5.4.1 쿼리 결과를 횡으로(Vertically) 출력하기 설정된 모든 세션 오브젝트와 설정 값들은 잃어 버리게 된다: 임시 테이블, 오토 커밋(autocommit) 모드, 그리고 사용자 정의 및
세션 변수 등. 또한, 현재의 모든 트랜젝션도 롤백된다. 이러한 동작은 매우 위험할 수도 있는데, 왜냐하면 아래의 예에서 보면, 서
8.5.4.2 --safe-updates 옵션 사용하기
버가 여러분이 알지 못하는 상태에서 셧 다운 되고 재 시작이 되기 때문이다.:
8.5.4.3 mysql 자동-재 접속 비활성화 시키기
Connection id: 1
+------+
|a |
+------+
| NULL |
+------+
사용자 변수 @a는 접속과 함께 잃게 되고, 재 접속이 된 후에는 재 정의가 되지 않는다. 만일 접속이 끊어지면 에러를 발생 시키고
mysql을 종료하도록 하고자 한다면, mysql 클라이언트를 --skip-reconnect 옵션과 함께 시작하면 된다.
제목검색
8.6. mysqlaccess - 접속 권한을 검사하기 위 Mysqlaccess는 Yves Carlier가 제공해 준 진단 프로그램이다. 이것은 호스트 이름, 사용자 이름, 그리고 데이터 베이스 컴비네이
한 클라이언트 션(combination)에 대한 접속 권한을 검사한다. Mysqlaccess은 user, db, 그리고 host 테이블만을 사용해서 접속을 검사한다는
8.6 mysqlaccess - 접속 권한을 검사하기 위한 클 점을 알아두자. 이것은 tables_priv, columns_priv, 또는 procs_priv 테이블에서 지정이 된 테이블, 컬럼, 또는 루틴 권한 등은 검
라이언트 사를 하지 않는다.
● --help, -?
● --brief, -b
● --commit
임시 테이블에서 원본 그랜트 테이블로 새로운 접속 권한을 복사한다. 새로운 권한이 효력을 갖도록 하기 위해서는 그랜
트 테이블을 플러시 해야 한다. (예를 들면, mysqladmin reload 명령어를 실행한다.)
● --copy
● --db=db_name, -d db_name
● --debug=N
● --host=host_name, -h host_name
● --howto
● --old_server
서버가 마치 전체적으로 WHERE 구문을 처리하는 방법을 모르는 구형 MySQL 서버(3.21 이전 버전)인 것처럼 만든다.
● --password[=password], -p[password]
● --plan
● --preview
● --relnotes
● --rhost=host_name, -H host_name
● --rollback
● --spassword[=password], -P[password]
● --superuser=user_name, -U user_name
● --table, -t
● --user=user_name, -u user_name
● --version, -v
만일 여러분이 사용하고 있는 MySQL 배포판이 표준 설치 위치가 아닌 곳에 설치되어 있다면, 여러분은 반드시 mysqlaccess이
mysql 클라이언트를 찾고자 하는 위치를 변경 시켜야 한다. 라인 18에 있는 mysqlaccess 스크립트를 적당히 편집한다:
mysql이 실제로 저장되어 있는 위치를 가리키도록 경로를 변경한다. 만일 여러분이 이렇게 변경하지 않고 mysqlaccess을 구동시
키게 되면, Broken pipe 에러가 발생한다.
제목검색
8.7. mysqladmin - MySQL 서버를 mysqladmin은 관리 연산을 수행하는 클라이언트이다. 여러분은 이것을 사용해서 서버의 구성 및 현재의 상태를 검사할 수 있고, 데이터 베
관리하기 위한 클라이언트 이스를 생성 및 제거할 수 있다.
mysqladmin은 아래의 명령어들을 지원한다. 아래의 명령어 중에는 명령어 뒤에 인수를 가지는 것들도 있다.
● create db_name
● debug
● drop db_name
● extended-status
서버 상태 변수 및 그 값을 보여준다.
● flush-hosts
● flush-logs
모든 로그를 플러시한다.
● flush-privileges
● flush-status
● flush-tables
모든 테이블을 플러시한다.
● flush-threads
● kill id,id,...
● old-password new-password
이것은 password 명령어와 유사하지만, 패스워드를 구형 (4.1 이전 버전) 패스워드 해싱 포맷을 사용해서 저장한다.
(Section 5.8.9, “Password Hashing as of MySQL 4.1”을 참조.)
● password new-password
새로운 패스워드를 설정한다. 이것은 여러분이 서버에 접속하기 위해 mysqladmin와 함께 사용하는 계정용 패스워드를 new-
password 로 변경 시킨다. 따라서, 여러분이 동일한 계정을 사용해서 mysqladmin (또는 다른 클라이언트 프로그램)을 호출하는
다음 시점부터는 이 새로운 패스워드를 사용해야 한다.
만일 new-password 값이 스페이스 또는 여러분이 사용하는 명령어 해석기에서 특별하게 취급되는 다른 문자를 가지고 있는 경
우에는, 인용 부호를 사용해서 이것들을 지정해 주어야 한다. 윈도우에서는, 이중 인용 부호를 사용해야 한다; 단일 인용 부호는 패
스워드의 일부분으로 간주된다. 예를 들면:
● ping
서버가 제대로 동작 중인지를 검사한다. 서버가 구동 중에 있다면, mysqladmin 는 0을 리턴하고, 그렇지 않다면 1을 리턴한다.
mysqladmin 은 Access denied일 경우에도 0을 리턴하는데, 그 이유는 서버가 접속을 거부하기는 했지만 구동 중이기 때문이며,
이것은 서버가 구동을 하지 않는 상황과는 다른 것이다.
● processlist
액티브 서버 쓰레드의 리스트를 보여준다. 이것은 SHOW PROCESSLIST 명령문의 결과와 유사한 내용을 출력한다. 만일 --
verbose 옵션을 주게 되면, 그 결과는 SHOW FULL PROCESSLIST와 비슷하게 나온다. (Section 13.5.4.19, “SHOW
PROCESSLIST 신텍스”를 참조.)
● reload
● refresh
● shutdown
서버를 종료 시킨다.
● start-slave
● status
서버 상태 메시지를 짧게 보여준다.
● stop-slave
● variables
서버 시스템 변수 및 그 값을 보여 준다.
● version
+----+-------+-----------+----+---------+------+-------+------------------+
+----+-------+-----------+----+---------+------+-------+------------------+
+----+-------+-----------+----+---------+------+-------+------------------+
● Uptime
● Threads
● Questions
● Slow queries
The number of queries that have taken more than long_query_time 시간 보다 길게 걸린 쿼리의 숫자. Section 5.12.4, “슬
로우 쿼리 로그”를 참조.
● Opens
● Flush tables
● Open tables
현재 열려 있는 테이블의 숫자.
● Memory in use
만일 여러분이 유닉스 소켓 파일을 사용해서 로컬 서버에 접속을 할 때 mysqladmin shutdown을 실행하게 되면, mysqladmin은 서버가 올
바르게 종료 되었다는 것을 확인하기 위해 서버의 프로세스 ID 파일이 제거될 때까지 대기를 하게 된다.
● --help, -?
● --character-sets-dir=path
● --compress, -C
● --count=N, -c N
● --debug[=debug_options], -# [debug_options]
디버깅 로그를 작성한다. debug_options 스트링은 종종 'd:t:o,file_name'이 되기도 한다. 디폴트는 'd:t:o,/tmp/mysqladmin.
trace'.
● --default-character-set=charset_name
디폴트 문자 셋으로 charset_name 를 사용한다. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”을 참조.
● --force, -f
drop db_name 명령어에 대해 확인을 문의하지 않게 한다. 여러 개의 명령어를 사용하면, 에러가 발생하더라도 계속 진행을 한다.
● --host=host_name, -h host_name
● --password[=password], -p[password]
서버에 접속을 할 때 사용하는 패스워드. 만일 여러분이 축약 폼 (-p)을 사용한다면, 이 옵션과 패스워드 사이에는 스페이스를 두
면 안 된다. 만일 --password 또는 -p 옵션 뒤에 패스워드를 지정하지 않으면, 프롬프트가 나오게 된다.
● --port=port_num, -P port_num
● --protocol={TCP|SOCKET|PIPE|MEMORY}
사용할 접속 프로토콜.
● --relative, -r
--sleep 옵션을 함께 사용했을 때의 값과 현재의 값을 비교해 준다. 현재의 버전까지는, 이 옵션은 extended-status 명령어에서
만 동작을 한다.
● --silent, -s
● --sleep=delay, -i delay
● --socket=path, -S path
localhost에 접속을 할 경우, 사용할 유닉스 소켓 파일, 또는 윈도우에서의 네임드 파이프 이름.
● --user=user_name, -u user_name
● --verbose, -v
● --version, -V
버전 정보를 보여 주고 종료한다.
● --vertical, -E
결과를 횡으로 출력한다. 이것은 –relative와 유사하지만, 이 옵션은 결과를 횡으로 출력한다.
● --wait[=count], -w[count]
접속을 하지 못하는 경우, 종료를 하는 대신에 대기를 하고 다시 접속을 시도한다. 만일count 값을 주게 되면, 이 값은 재 시도 횟수
를 나타내는 것이다. 디폴트는 한 번이다.
● connect_timeout
● shutdown_timeout
제목검색
8.8. mysqlbinlog - 바이너리 로그 파일을 처 서버가 만드는 바이너리 로그 파일은 바이너리 포맷으로 작성된다. 이 파일을 텍스트 포맷으로 검사를 하기 위해서는,
리하기 위한 유틸리티 mysqlbinlog 유틸리티를 사용하면 된다. 리플리케이션 셋업에서 슬레이브가 작성한 릴레이 로그 파일을 읽기 위해서도
8.8 mysqlbinlog - 바이너리 로그 파일을 처리하 mysqlbinlog를 사용할 수가 있다. 릴레이 로그는 바이너리 로그 파일과 같은 포맷을 가지고 있다.
기 위한 유틸리티
Mysqlbinlog은 아래와 같이 호출한다:
예를 들면, binlog.000003라는 이름의 바이너리 로그 파일의 내용물을 보여 주기 위해서는, 아래의 명령어를 사용한다:
이 명령어를 실행하면 binlog.000003에 포함되어 있는 모든 이벤트가 나오게 된다. 이벤트 정보는 실행된 명령문, 명령문 실행 시
간, 명령문을 입력한 클라이언트의 쓰레드 ID, 실행된 타임 스탬프 등등의 정보가 포함되어 있다.
보통의 경우, 여러분은 바이너리 로그 파일을 직접 읽고 이것을 로컬 MySQL 서버에 적용하기 위해 mysqlbinlog를 사용하게 된
다. 또한, 이것을 --read-from-remote-server 옵션과 함께 사용해서 원격 서버로부터 바이어리 로그를 읽는 것도 가능하다.
여러분이 원격 바이너리 로그를 읽을 경우, 접속 파라미터 옵션을 지정해서 서버와의 접속 방법을 지시할 수도 있다. 이렇게 할 수
있는 옵션으로는 --host, --password, --port, --protocol, --socket, 그리고 –user가 있다; 이 옵션들은 여러분이 --
read-from-remote-server 옵션을 함께 지정해야만 기능을 발휘한다.
바이너리 로그 및 릴레이 로그는 Section 5.12.3, “바이너리 로그”, 그리고and Section 6.3.4, “리플리케이션 릴레이 및 상태
파일”을 참조할 것.
● --help, -?
● --character-sets-dir=path
● --database=db_name, -d db_name
● --debug[=debug_options], -# [debug_options]
● --disable-log-bin, -D
바이너리 로깅을 비 활성화 시킨다. 이것은 여러분이 --to-last-log 옵션을 사용하고 그 결과를 동일한 MySQL 서버에
보내는 경우에 무한 루프를 피하기 위해서 유용하게 사용할 수 있다. 또한, 이 옵션은 서버 크래시 이후에 여러분이 로그
한 명령문이 중복되는 것을 피하기 위해서도 유용하게 사용된다.
이 옵션은 여러분이 SUPER 권한을 가지고 있어야 한다. 이것은 mysqlbinlog로 하여금 남아있는 결과의 바이너리 로깅
을 비 활성화 시키기 위해 자신의 결과에 있는 SET SQL_LOG_BIN=0 명령문을 비 활성화 시키도록 만든다. SET 명령
문은 여러분이 SUPER 권한을 가지고 있지 않는 한 효력을 갖지 못한다.
● --force-read, -f
이 옵션을 사용하면, 만일 mysqlbinlog가 인식하지 못하는 바이너리 로그 이벤트를 읽는 경우에, 서버는 경고를 출력하
고, 이벤트를 무시하고 계속 진행을 한다.이 옵션을 사용하지 않으면, mysqlbinlog이 이와 같은 이벤트를 읽는 경우 멈추
게 된다.
● --hexdump, -H
코멘트에 있는 로그의 헥스(hex)덤프를 출력한다. 이로 인한 결과는 리플리케이션 디버깅에 유용하게 사용될 수 있다. 헥
스 덤프는 나중에 설명하기로 한다. 이 옵션은 5.0.16에서 추가 되었다.
● --host=host_name, -h host_name
● --local-load=path, -l path
● --offset=N, -o N
● --password[=password], -p[password]
서버에 접속을 할 때 사용하는 패스워드. 축약형 옵션 (-p)을 사용할 경우에는, 이 옵션과 패스워드 사이에는 스페이스를
사용하지 않는다. 만일 --password 또는 -p 옵션 다음에 패스워드를 지정하지 않으면, 프롬프트가 나오게 된다.
● --port=port_num, -P port_num
● --position=N, -j N
● --protocol={TCP|SOCKET|PIPE|MEMORY}
사용할 접속 프로토콜.
● --read-from-remote-server, -R
로컬 로그 파일을 읽는 대신에 MySQL 서버에서 바이너리 로그를 읽는다. 모든 접속 파라미터 옵션은 이 옵션을 같이 지
정하지 않는 한 무시된다. 이러한 파라미터 옵션에는 --host, --password, --port, --protocol, --socket, 그리고
–user가 있다.
● --result-file=name, -r name
● --short-form, -s
● --socket=path, -S path
Localhost에 접속을 하는 경우, 사용하게 될 유닉스 소켓 파일, 또는 윈도우에서의 네임드 파이프 이름.
● --start-datetime=datetime
datetime 인수와 동일하거나 느린 타임 스탬프를 가지고 있는 이벤트가 처음으로 발생할 때 바이너리 로그를 읽기 시작한
다. datetime 값는 여러분이 mysqlbinlog를 구동 시키는 시스템의 로컬 타임 존과 연관된다. 이 값은 DATETIME 또는
TIMESTAMP 데이터 타입에 적합한 포맷 형태를 가져야 한다. 예를 들면:
이 옵션은 포인트-인-타입(point-in-time) 복구시에 유용하다. Section 5.10.2, “백업 및복구전략의 예”를 참조할
것.
● --stop-datetime=datetime
datetime 인수와 동일하거나 빠른 타임 스탬프를 가지고 있는 이벤트가 처음으로 발생할 때 바이너리 로그를 읽기를 종료
한다. 이 옵션은 포인트-인-타입(point-in-time) 복구시에 유용하다. datetime 값에 대한 정보는 --start-datetime
옵션에 대한 설명을 참조하기 바란다.
● --start-position=N
● --stop-position=N
N 인수와 동일하거나 보다 큰 위치를 가지고 있는 이벤트가 처음 발생할 때 바이너리 로그를 읽기를 멈춘다
● --to-last-log, -t
MySQL 서버로부터 요청 받은 바이너리 로그의 끝에서 멈추는 대신에, 마지막 바이너리 로그의 끝이 될 때까지 프린트를
계속한다. 만일 여러분이 이 결과를 동일한 MySQL 서버에 보낸다면, 무한 루프가 발생할 수도 있다. 이 옵션은 --
read-from-remote-server를 필요로 한다.
● --user=user_name, -u user_name
● --version, -V
● open_files_limit
바이너리 로그에 포함되어 있는 명령문을 실행하기 위해서, mysqlbinlog의 결과를 mysql 클라이언트에 전달할 수 있다. 이것은 여
러분이 오래된 백업을 가지고 있을 때 크래시를 복구하기 위해서 사용할 수가 있다 (Section 5.10.1, “데이터 베이스 백업”을 참
조). 예를 들면:
또는:
만일 여러분이 명령문의 로그를 우선 수정할 필요가 있다면, mysqlbinlog의 결과를 텍스트 파일로 보낼 수가 있다 (예를 들면, 실
행되지 않기를 원하는 명령문을 제거하기 위해). 이 파일을 수정한 다음에, 이것을 mysql 프로그램의 입력 값으로 사용해서 그 명
령문을 실행 시킨다.
mysqlbinlog은 --start-position 옵션을 가지고 있는데, 이것은 바이너리 로그 안에서 주어진 위치와 동일하거나 보다 큰 오프셋
을 가지고 있는 명령문만을 출력한다 (주어진 위치는 반드시 하나의 이벤트 시점과 매치가 되어야 한다). 또한, 이것은 주어진 날
짜 및 시간을 가지고 있는 이벤트를 발견할 때 종료하고 시작하는 옵션을 가지기도 한다. 이것을 사용하면 여러분은 --stop-
datetime 옵션을 사용해서 포인트-인-타입 복구를 실행할 수가 있다.
만약에 MySQL 서버에서 하나 이상의 바이너리 로그를 가지고 있다면, 이 모든 것을 한번에 서버에 연결해서 처리하는 것이 안전
한 방법이다. 아래에서 보여주는 것은 안전하지 못한 예이다:
서버에 서로 다르게 접속을 해서 바이너리 로그를 처리하게 되면, 맨 처음의 로그 파일이 CREATE TEMPORARY TABLE 명령
문을 가지고 있고 두 번째 로그가 임시 테이블을 사용하는 명령문을 가지고 있는 경우에는 문제가 발생하게 된다. 맨 처음의
mysql 프로세스가 종료될 때, 서버는 임시 테이블을 제거한다. 두 번째 mysql 프로세스가 이 테이블을 사용하고자 시도하면, 서버
는 “unknown table.”이라고 알려주게 된다.
이와 같은 문제를 없애기 위해서는, 여러분이 처리하고자 하는 모든 바이너리 로그 컨텐츠에 대해서 한번의 접속을 사용하도록 한
다. 아래에 이렇게 하는 방법을 보여준다:
mysqlbinlog는 원본 데이터 파일을 사용하지 않고 LOAD DATA INFILE 연산을 재 실행하는 결과를 만들어 낸다. mysqlbinlog
은 그 데이터를 임시 파일에 복사를 하고 이 파일을 참조하는 LOAD DATA LOCAL INFILE 명령문을 작성한다. 이 파일이 작성
되는 디폴트 디렉토리의 위치는 시스템에 따라 달라진다. 이 디렉토리를 명확히 지정하기 위해서는 --local-load 옵션을 사용한
다.
mysqlbinlog이 LOAD DATA INFILE 명령문을 LOAD DATA LOCAL INFILE 명령문으로 변환 시키기 때문에 (즉, LOCAL를
추가 함), 이 명령문을 처리하는 클라이언트 및 서버 모두는 반드시 LOCAL 기능을 처리할 수 있도록 구성되어야 한다.
Section 5.7.4, “LOAD DATA LOCAL를 사용한 보안 이슈”를 참조.
Warning: LOAD DATA LOCAL 명령문용으로 생성된 임시 파일은 여러분이 실제로 이 명령문을 실행할 때까지 필요한 것이기 때
문에 자동으로 삭제가 되지 않는다. 더 이상 이 명령문의 로그가 필요하지 않게 되면 그 때에 임시 파일을 삭제 하도록 한다. 이 파
일은 임시 파일 디렉토리에서 찾을 수 있으며 original_file_name-#-#와 같은 이름을 가지고 있다.
# at 4
# 00000004 9d fc 5c 43 0f 01 00 00 00 5e 00 00 00 62 00 00 00 00 00
# 00000017 04 00 35 2e 30 2e 31 35 2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|
# 00000027 6f 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |og..............|
# 00000037 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
# 00000047 00 00 00 00 9d fc 5c 43 13 38 0d 00 08 00 12 00 |.......C.8......|
# 00000057 04 04 04 04 12 00 00 4b 00 04 1a |.......K...|
# at startup
ROLLBACK;
헥스 덤프로 만들어지는 결과에는 아래와 같은 것들이 포함된다. 이 포맷은 나중에 변경될 예정이다.
01 START_EVENT_V3 This indicates the start of a log file written by MySQL 4 or earlier.
Used for LOAD DATA INFILE statements. This indicates the start of
08 CREATE_FILE_EVENT execution of such a statement. A temporary file is created on the slave.
Used in MySQL 4 only.
Contains data for use in a LOAD DATA INFILE statement. The data is
09 APPEND_BLOCK_EVENT
stored in the temporary file on the slave.
0f FORMAT_DESCRIPTION_EVENT This indicates the start of a log file written by MySQL 5 or later.
11 BEGIN_LOAD_QUERY_EVENT Used for LOAD DATA INFILE statements in MySQL 5 and later.
12 EXECUTE_LOAD_QUERY_EVENT Used for LOAD DATA INFILE statements in MySQL 5 and later.
제목검색
8.9. mysqlcheck - 테이블 관리 mysqlcheck 클라이언트는 테이블을 검사, 복구, 최적화, 그리고 분석을 한다.
(Maintenance) 및 복구 프로그램
8.9 mysqlcheck - 테이블 관리(Maintenance) mysqlcheck는 myisamchk과 유사한 기능을 구현하지만, 전혀 다른 방식으로 동작을 한다. 가장 주된 차이점은, mysqlcheck는
및 복구 프로그램 mysqld 서버가 구동될 때만 사용될 수 있는데 비해서, myisamchk는 이 서버가 없는 경우에도 사용될 수 있다는 점이다.
mysqlcheck를 사용할 때 얻을 수 있는 장점으로는 여러분이 테이블을 검사하기 위해서 서버를 종료할 필요가 없다는 것이다.
mysqlcheck은 SQL 명령문인 CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, 그리고 OPTIMIZE TABLE를 사용자
입장에서 편리하게 사용한다. 이것은 여러분이 원하는 연산을 위해서 어떤 명령문을 사용할 것인지를 판단하고, 서버에게 이 명령
문을 전달해서 실행을 하도록 만든다. 각각의 명령문이 함께 실행하는 스토리지 엔진에 대해서는 Chapter 13, SQL 명령문 신텍스
를 참조하면 된다.
test.t
note : The storage engine for the table doesn't support check
만일 여러분이 db_name 다음에 어떠한 테이블 이름도 지정하지 않거나 또는 여러분이 --databases 또는 --all-databases 옵
션을 사용하는 경우에는, 전체 데이터 베이스가 검사된다.
mysqlcheck는 다른 클라이언트 프로그램과 비교해서 특별한 특성이 하나 있다. 테이블 검사에 대한 디폴트 동작 (--check)은
바이너리의 이름을 재 지정함으로써 변경 시킬 수가 있다. 만일 여러분이 디폴트로 테이블을 복구하는 툴을 가지고가 한다면, 간단
히 mysqlcheck를 mysqlrepair이름으로 복사를 하거나, 또는 mysqlcheck를 mysqlrepair라는 이름으로 심볼릭 링크를 만들기
만 하면 된다. 만일 여러분이 mysqlrepair를 호출한다면, 이것은 테이블을 복구하게 된다.
● --help, -?
● --all-databases, -A
모든 데이터 베이스에 있는 모든 테이블을 검사한다. 이것은 --databases 옵션을 사용하고 명령어 라인에서 모든 데이
터 베이스 이름을 지정하는 것과 동일한 기능을 한다.
● --all-in-1, -1
각 테이블에 대해서 명령문을 하나씩 입력하는 대신에, 실행 시키고자 하는 데이터 베이스에 있는 모든 테이블 이름을 가
지고 있는 각 데이터 베이스에 대해서 하나의 명령문을 실행 시킨다.
● --analyze, -a
테이블을 분석한다.
● --auto-repair
만일 검사를 한 테이블이 깨졌다면, 자동으로 이것을 복구 시킨다. 모든 테이블을 검사한 후에 필요한 모든 복구를 실행한
다.
● --character-sets-dir=path
● --check, -c
● --check-only-changed, -C
● --check-upgrade, -g
서버의 현재 버전과 호환성이 없는 테이블을 검사하기 위해서 CHECK TABLE를 FOR UPGRADE 옵션과 함께 호출한
다. 이 옵션은 MySQL 5.0.19 에서 추가 되었다.
● --compress
● --databases, -B
네임드 데이터 베이스에 있는 모든 테이블을 처리한다. 일반적인 경우, mysqlcheck는 명령어라인에 있는 첫 번째 이름을
데이터 베이스 이름을 간주하고 그 다음의 이름을 테이블 이름으로 간주한다. 이 옵션을 사용하면, 모든 이름 인수를 데이
터 베이스 이름으로 간주하게 된다.
● --debug[=debug_options], -# [debug_options]
● --default-character-set=charset_name
charset_name를 디폴트 문자 셋으로 사용한다. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”를 참조할
것.
● --extended, -e
만일 여러분이 이 옵션을 사용해서 테이블을 검사한다면, 시간은 오래 걸리지만 100%의 일관성을 보장받을 수가 있다.
만일 이 옵션을 테이블 복구용으로 사용한다면, 복구하는데 시간이 오래 걸릴 뿐만 아니라 필요 없는 열도 많이 생성되게
된다!
● --fast, -F
● --force, -f
● --host=host_name, -h host_name
● --medium-check, -m
--extended 연산 보다는 빠른 검사를 실행한다. 이것은 모든 에러에 대해서 99.99%의 신뢰도를 보장하는데, 대부분의
경우 이 정도면 충분하다.
● --optimize, -o
● --password[=password], -p[password]
서버에 접속을 할 때 사용할 패스워드. 만일 축약형 옵션(-p)을 사용할 경우에는, 이 옵션과 패스워드 사이에는 스페이스
를 두지 말도록 한다. 만일 --password 또는 -p 옵션 다음에 패스워드를 지정하지 않으면, 프롬프트가 나오게 된다.
● --port=port_num, -P port_num
● --protocol={TCP|SOCKET|PIPE|MEMORY}
사용할 접속 프로토콜.
● --quick, -q
이 옵션을 사용해서 테이블을 검사한다면, 잘못된 링크를 검사하기 위한 열 스캐닝을 검사하지 못하도록 한다. 이 방법이
가장 빠른 검사 방법이다.
이 옵션을 사용해서 테이블을 복구한다면, 이것은 인덱스 트리만을 복구하려고 할 것이다. 가장 빠른 복구 방법이다.
● --repair, -r
● --silent, -s
● --socket=path, -S path
localhost에 접속하는 경우, 사용할 유닉스 소켓 파일, 또는 윈도우 네임드 파이프 이름.
● --tables
● --use-frm
MyISAM 테이블에서의 복구 연산의 경우, 테이블의 .MYI 헤더가 깨졌다고 하더라도 테이블 복구를 실행하기 위해서 .
frm 파일로부터 테이블 구조를 가져온다.
● --user=user_name, -u user_name
● --verbose, -v
● --version, -V
제목검색
8.10. mysqldump - 데이터 베이스 백업 프로 mysqldump 클라이언트는 Igor Romanenko가 작성한 백업 프로그램이다. 이것은 데이터베이스를 덤프하거나 또는 백업 또는 데
그램 이터를 다른 SQL 서버(MySQL서버가 아닌)에 전달하기 위해서 데이터 베이스를 모을 때 사용하는 프로그램이다. 덤프에는 테이
8.10 mysqldump - 데이터 베이스 백업 프로그램 블을 생성하거나 또는 안주(populate)시키기 위한 SQL명령문이 포함되어 있다.
만일 여러분이 서버에서 백업을 진행하고 있고, 또한 여러분이 사용하는 테이블이 MyISAM 테이블이라면, mysqlhotcopy를 대신
사용하는 것이 좋은데, 그 이유는 이것이 보다 빠른 백업과 복원을 실행하기 때문이다. Section 8.11, “mysqlhotcopy — 데이터
베이스 백업 프로그램”을 참조할 것.
If you do not name any tables following db_name or if you use the --databases or --all-databases option, entire
databases are dumped.
To get a list of the options your version of mysqldump supports, execute mysqldump --help.
만일 여러분이 최근의 mysqldump 프로그램을 사용해서 구형 MySQL 서버로 덤프를 실행하고자 한다면, --opt 또는 --
extended-insert 옵션을 사용하지 말도록 한다. 대신에 --skip-opt 옵션을 사용한다.
● --help, -?
● --add-drop-database
● --add-drop-table
● --add-locks
Surround each table dump with LOCK TABLES 과 UNLOCK TABLES 명령문을 사용해서 각각의 테이블 덤프를 둘
러 싼다(surround). 이렇게 하면 덤프 파일을 다시 읽어올 때 보다 빠른 삽입을 실행할 수가 있다. Section 7.2.16,
“INSERT 명령문의 속도”를 참조.
● --all-databases, -A
모든 데이터 베이스에 있는 모든 테이블을 덤프한다. 이것은 --databases 옵션을 사용해서 명령어 라인에서 모든 데이
터 베이스 이름을 입력하는 것과 동일한 기능을 실행한다.
● --allow-keywords
● --character-sets-dir=path
● --comments, -i
프로그램 버전, 서버 버전, 그리고 호스트와 같은 추가적인 정보를 덤프 파일에 기록한다. 이 옵션은 디폴트로 활성화 된
다. --skip-comments를 사용하면, 디폴트 활성화를 없앨 수 있다.
● --compact
간략한 결과를 만들게 한다. 이 옵션은 코맨트를 없애주며 --skip-add-drop-table, --no-set-names, --skip-
disable-keys, 그리고 --skip-add-locks 옵션을 활성화 시킨다.
● --compatible=name
다른 데이터 시스템 또는 구형 MySQL 서버와의 호환성을 보다 많이 갖도록 결과를 만든다. name의 값은 ansi,
mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, 또는
no_field_options가 될 수 있다. 여러 개의 값을 사용하기 위해서는, 각각을 콤마로 구분시킨다. 이러한 값들은 서버 SQL
모드를 설정하기 위한 대응 값들과 동일한 의미를 갖게 된다. Section 5.2.5, “서버 SQL 모드”를 참조할 것.
이 옵션은 다른 서버와의 호환성을 보장하지는 않는다. 단지 덤프를 한 결과가 다른 SQL 서버와 호환성을 보다 많이 가지
도록 만들어줄 뿐이다. 예를 들면, --compatible=oracle는 오라클 타입의 데이터 또는 코멘트 신텍스와 매핑되는 것은
아니다.
● --complete-insert, -c
● --compress, -C
● --create-options
● --databases, -B
● --debug[=debug_options], -# [debug_options]
● --default-character-set=charset_name
charset_name를 디폴트 문자 셋으로 사용한다. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”을 참조. 만
일 지정하지 않으면, mysqldump은 utf8를 사용한다.
● --delayed-insert
● --delete-master-logs
마스터 리플리케이션 서버에서, 덤프 연산을 실행한 후에 바이너리 로그를 삭제한다. 이 옵션은 자동으로 --master-
data를 활성화 시킨다.
● --disable-keys, -K
각각의 테이블에 대해서, INSERT 명령문을 /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; 그리고 /*!
40000 ALTER TABLE tbl_name ENABLE KEYS */; 명령문을 사용해서 둘러싼다(surround). 이것은 모든 열이 삽입
된 후에 인덱스가 생성되기 때문에 덤프 파일을 읽어 오는데 보다 빠른 속도가 나오게 된다. 이 옵션은 MyISAM 테이블
에 대해서만 효과가 있다.
● --extended-insert, -e
이들 옵션은 -T 옵션과 함께 사용되며 LOAD DATA INFILE에 대한 대응 구문과 같은 의미를 가진다. Section 13.2.5,
“LOAD DATA INFILE 신텍스”를 참조.
● --first-slave, -x
● --flush-logs, -F
덤프를 시작하기 전에 MySQL 서버 로그 파일을 플러시한다. 이 옵션은 RELOAD 권한을 필요로 한다. 만일 여러분이 이
옵션을 --all-databases (또는 -A) 옵션과 함께 결합해서 사용한다면, 로그는 각각의 덤프된 데이터 베이스에 대해서
플러시 된다는 점을 알아야 한다. 한가지 예외는 --lock-all-tables 또는 --master-data를 사용하는 경우이다: 이와
같은 경우, 로그는 모든 테이블이 잠기는 시점에 오직 한번만 플러시된다. 만일 동일한 시점에 덤프 및 로그 플러시가 일어
나도록 하기 위해서는, --flush-logs를 --lock-all-tables 또는 --master-data와 함께 사용하도록 한다.
● --force, -f
● --host=host_name, -h host_name
● --hex-blob
16진법(hexadecimal)을 사용해서 바이너리 컬럼을 덤프한다 (예를 들면, 'abc'는 0x616263가 된다). 이렇게 할 수 있
는 데이터 타입은 BINARY, VARBINARY, 그리고 BLOB가 된다. MySQL 5.0.13까지는, BIT 컬럼도 해당된다.
● --ignore-table=db_name.tbl_name
주어진 테이블을 덤프하지 않는데, 이것은 데이터 베이스 및 테이블 이름을 사용해서 지정해야 한다. 여러 개의 테이블을
무시하기 위해서는, 이 옵션을 여러 번 사용한다.
● --insert-ignore
● --lock-all-tables, -x
● --lock-tables, -l
덤프를 하기 전에 모든 테이블을 잠근다. MyISAM 테이블의 경우에는 동시 삽입을 허용하기 위해서 테이블을 READ
LOCAL로 잠근다. InnoDB 및 BDB와 같은 트랜젝션이 되는 테이블의 경우, --single-transaction이 보다 좋은 옵션이
되는데, 그 이유는 이것은 테이블을 전혀 잠글 필요가 없기 때문이다.
여러 개의 데이터 베이스를 덤프할 때에는, --lock-tables은 각각의 데이터 베이스에 대해서 테이블을 개별적으로 잠근
다는 점을 알아두기 바란다. 따라서, 이 옵션은 덤프 파일에 있는 테이블이 데이터 베이스간에 논리적으로 일관성을 가지
는 것에 대해서는 보장을 하지 않는다. 서로 다른 데이터 베이스에 있는 테이블들은 완벽하게 틀린 상태에서 덤프가 된다.
● --master-data[=value]
바이너리 로그 파일 이름과 위치(position)을 결과에 작성한다. 이 옵션은 RELOAD 권한이 필요하고 바이너리 로그는 반
드시 활성화 되어야 한다. 만일 이 옵션 값이 1 이면, 그 위치 및 파일 이름은 CHANGE MASTER 명령문 형태로 덤프 결
과에 작성되는데, 이것은 여러분이 슬레이브를 설정하기 위해 이 SQL 덤프를 사용하는 경우에 슬레이브 서버로 하여금 마
스터의 바이너리 로그에 있는 올바른 위치에서 시작을 하도록 만든다. 만일 이 옵션 값이 2와 같다면, CHANGE
MASTER 명령문은 SQL 코멘트처럼 작성된다. 만일 값이 생략되면, 이것이 디폴트 동작이 된다.
--master-data 옵션은 --single-transaction을 함께 지정하지 않는 한, --lock-all-tables를 온(ON) 시킨다 (이
와 같은 경우, 글로벌 읽기 잠금은 덤프가 시작되는 짧은 시점에만 얻을 수 있다). --single-transaction에 대한 설명을
함께 참조한다. 모든 경우에, 로그 상의 모든 동작은 정확히 덤프가 일어나는 시점에 발생을 한다. 이 옵션은 자동으로 --
lock-tables를 오프(Off) 시킨다.
● --no-autocommit
각각의 덤프된 테이블에 대한 INSERT 명령문을 SET AUTOCOMMIT=0 과COMMIT 명령문안에 넣는다.
● --no-create-db, -n
이 옵션은 --databases 또는 --all-databases 옵션이 주어질 경우에 결과에 포함되는 CREATE DATABASE 명령문
을 무력화 시킨다.
● --no-create-info, -t
● --no-data, -d
테이블에 대한 어떠한 열 정보도 작성하지 않는다. 이것은 테이블에 대해서 CREATE TABLE 명령문만을 덤프하고자 할
경우에 매우 유용하다.
● --opt
● --order-by-primary
주요(primary) 키 또는 맨 처음의 유니크 인덱스(만일 인덱스가 존재한다면)를 사용해서 각각의 테이블 열을 정렬한다.
이것은 InnoDB 테이블 안으로 집어넣을 MyISAM 테이블을 덤프할 때 유용하게 사용되지만, 덤프 자체를 매우 오래 걸리
게 한다.
● --password[=password], -p[password]
● --port=port_num, -P port_num
● --protocol={TCP|SOCKET|PIPE|MEMORY}
접속용 프로토콜.
● --quick, -q
이 옵션은 대형 테이블을 덤프할 때 유용하다. 이것은 mysqldump로 하여금 테이블에 대한 열을 서버에서 한번에 한 열
씩 추축하도록 만들고 추출한 열을 쓰기 전에 메모리에 버퍼링 하도록 만든다.
● --quote-names, -Q
인용 부호를 사용해서 데이터 베이스, 테이블, 그리고 컬럼 이름을 둘러 쌓도록 한다. 만일 ANSI_QUOTES SQL 모드가
활성화 되어 있다면, 그 이름도 인용 부호화 시킨다. 이 옵션은 디폴트로 활성화 되어 있다. 이것은 --skip-quote-
names으로 비 활성화 시킬 수 있으나, 이 옵션은 --quote-names을 활성화 시킬 수 있는 –-compatible과 같은 옵션
다음에 주어져야 한다.
● --result-file=file, -r file
주어진 파일로 결과를 직접 넣는다. 이 옵션은 윈도우에서 새 라인 문자 ‘₩n’가 ‘₩r₩n’ 캐리지 리턴/새 라인 시퀀
스로 변환되지 못하도록 하기 위해서 사용된다.
● --routines, -R
덤프된 데이터 베이스에서 스토어드 루틴(함수 및 프로시저)를 덤프한다. --routines을 사용해서 만들어지는 결과는
CREATE PROCEDURE 루틴을 재 생성하기 위한 CREATE FUNCTION 명령문을 갖게 된다. 하지만, 이러한 명령문들
은 루틴 생성 및 수정 타임 스탬프와 같은 속성을 가지지 않는다. 이것은 루틴이 리로드(reload)될 때, 리로드 시간과 동일
한 타임 스탬프를 가지고서 생성된다는 것을 의미한다.
만일 여러분이 재 생성될 루틴이 원래의 타임 스탬프 속성을 가지도록 하기 위해서는, --routines를 사용하지 말도록 한
다. 대신에, mysql 데이터 베이스에 대해 적절한 권한을 가지고 있는 MySQL 계정을 사용해서 mysql.proc 테이블의 내
용물을 직접 덤프 및 리로드 하도록 한다.
이 옵션은 MySQL 5.0.13 에 추가되었다. 이 버전 이전에는 스토어드 루틴을 덤프할 수가 없었다. 루틴 DEFINER 값은
5.0.20 이후에 덤프가 되었다. 이것은 5.0.20 이전에는, 루틴이 리로드될 때, 리로딩 사용자에 대해서 디파이너(definer)
셋을 가지고 생성된다는 것을 의미하는 것이다. 만일 루틴이 원래의 디파이너를 가지고 재 생성되도록 하고자 한다면, 앞
에서 설명한 방식으로 mysql.proc 테이블의 내용물을 직접 덤프 및 로드한다.
● --set-charset
SET NAMES default_character_set를 결과에 추가한다. 이 옵션은 디폴트로 활성화 된다. SET NAMES 명령문을 무
시하기 위해서는, --skip-set-charset를 사용한다.
● --single-transaction
이 옵션은 서버에서 데이터를 덤프하기 전에 BEGIN SQL 명령문을 실행한다. 이것은 InnoDB 및 BDB와 같은 트랜젝션
이 되는 테이블에서만 유용한데, 그 이유는 이것이 BEGIN이 다른 어플리케이션을 블러킹하지 않은 채로 입력될 때 데이
● --socket=path, -S path
● --skip-comments
● --tab=path, -T path
탭으로 구분된 데이터 파일을 만든다. 각가의 덤프 테이블의 경우, mysqldump은 테이블을 생성하는 CREATE TABLE
명령문을 갖는 tbl_name.sql 파일과, 그것의 데이터를 가지고 있는 tbl_name.txt 파일을 생성한다. 이 옵션 값은 파일을
작성하는 디렉토리가 된다.
디폴트로는t, .txt 데이터 파일이 컬럼 값과 각 라인의 끝에 있는 새 라인(newline) 값 사이에 탭 문자를 사용해서 포맷된
다. 이 포맷은 --fields-xxx 및 --lines--xxx 옵션을 사용해서 명확하게 지정될 수 있다.
Note: 이 옵션은 mysqldump가 mysqld 서버가 구동되는 서버에서 실행될 때에만 사용될 수 있다. 여러분은 반드시
FILE 권한이 있어야 하고, 또한 서버는 반드시 여러분이 지정하는 디렉토리에 파일을 작성할 수 있어야 한다.
● --tables
--databases 또는 -B 옵션을 무력화 시킨다. 이 옵션 다음에 나오는 모든 이름 인수는 테이블 이름으로 간주된다.
● --triggers
각각의 덤프 테이블에 대한 트리거를 덤프한다. 이 옵션은 디폴트로 활성화 되어 있다; --skip-triggers로 비 활성화 시
킬 수 있다.이 옵션은 MySQL 5.0.11 에 추가 되었다. 이전에는, 트리거를 덤프할 수 없었다.
● --tz-utc
● --user=user_name, -u user_name
● --verbose, -v
● --version, -V
● --where='where_condition', -w 'where_condition'
주어진 WHERE 조건문에 의해 선택된 열만을 덤프한다. 만일 스페이스 또는 다른 문자가 여러분이 사용하는 명령어 해석
기에서 특별하게 인식되는 경우에는 인용부호를 사용해야 한다.
Examples:
--where="user='jimf'"
-w"userid>1"
-w"userid<1"
● --xml, -X
● max_allowed_packet
● net_buffer_length
클라이언트/서버 통신용 버퍼의 초기 크기. 다중-열-삽입 명령문을 생성할 때 (--extended-insert or –opt 옵션을
사용하는 것과 같이), mysqldump는 열을 최대 net_buffer_length 길이 만큼 만든다. 만일 여러분이 이 변수의 값을 늘린
다면, MySQL 서버에 있는 net_buffer_length 변수가 최소한 이 만큼의 크기가 되는지를 확인해야 한다.
또는 아래와 같이 한다:
mysqldump는 또한 하나의 MySQL 서버에서 다른 MySQL 서버로 데이터를 복사해서 데이터 베이스를 안주 시키기 위한 용도로
매우 유용하게 사용할 수가 있다:
이 백업은 덤프가 시작되는 시점에 모든 테이블에서 글로벌 읽기 잠금만 있으면 된다 (FLUSH TABLES WITH READ LOCK).
이 잠금이 이루어지면 즉시, 바이너리 로그는 읽혀지고 잠금이 릴리즈 된다. 만일 FLUSH 명령문이 실행될 때 하나의 기다란 업데
이트 명령문이 구동된다면, MySQL 서버는 이 명령문이 종료할 때까지 기다리게 되고, 덤프 연산은 잠금을 풀어 버린다. 만일
MySQL 서버가 받은 업데이트 명령문이 짧은 실행을 하는 것이라면, 초기의 잠금 기간(period)은 크게 중요하지 않게 된다.
또는:
> all_databases.sql
--master-data 와 --single-transaction를 동시에 사용하면 테이블이 InnoDB 스토리지 엔진에 저장되어 있는 경우에 포인
트-인-타임 복구에 대해서 적절한 온라인 백업을 만들 수가 있게 된다.
백업 만들기에 대한 보다 자세한 정보는 Section 5.10.1, “데이터 베이스 백업”, 그리고 Section 5.10.2, “백업과 복구 전략에
대한 예제”를 참조하기 바란다.
제목검색
8. 클라이언트 및 유틸리티 프로그램 Mysqlhotcopy는 Perl 스크립트로서 Tim Bunce이 작성한 프로그램이다. 이것은 데이터 베이스 백업을 빠르게 실행하기
8.11. mysqlhotcopy — 데이터 베이스 백업 프로그램 위해 LOCK TABLES, FLUSH TABLES, 그리고 cp 또는 scp를 사용한다. 이것은 데이터 베이스 또는 단일 테이블을 백
8.11 mysqlhotcopy — 데이터 베이스 백업 프로그램 업하는데 가장 빠른 방법이기는 하지만, 데이터 베이스 디렉토리가 설치되어 있는 동일 머신에서만 구동을 한다.
Mysqlhotcopy는 MyISAM 및 ARCHIVE 테이블 백업만을 할 수 있다. 이것은 유닉스와 NetWare에서 구동이 된다.
shell> mysqlhotcopy db_name [/path/to/new_directory]
shell> mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory
레귤러 수식과 매치가 되는 주어진 데이터 베이스에 있는 테이블을 백업한다:
shell> mysqlhotcopy db_name./regex/
테이블 이름에 대한 레귤러 수식은 (‘~’)를 앞에 사용해서 이름을 무시하도록 할 수 있다:
shell> mysqlhotcopy db_name./~regex/
mysqlhotcopy는 아래의 옵션을 지원한다:
● --help, -?
● --addtodest
목적 디렉토리(존재 한다면)의 이름을 변경하지 않는다; 단순히 파일을 여기에 추가만 한다.
● --allowold
목적 디렉토리가 있으면 종료를 하지 않는다; _old 접미사를 추가해서 이것의 이름을 변경 시킨다.
● --checkpoint=db_name.tbl_name
● --chroot=path
mysqld이 연산을 하는 chroot 자일(jail)의 베이스 디렉토리. path 값은 mysqld에 주어지는 --chroot 옵션과
매치가 되어야 한다.
● --debug
● --dryrun, -n
● --flushlog
● --host=host_name, -h host_name
로컬 서버에 TCP/IP접속을 만들기 위해 사용할 로컬 호스트의 호스트 이름. 디폴트로는, 유닉스 소켓 파일을 사용
해서 localhost에 접속을 하게 된다.
● --keepold
● --method=command
● --noindices
백업에 전체 인덱스 파일을 포함 시키지 않는다. 이렇게 하면 백업 파일이 작아지고 속도가 빨라진다. 다시 읽혀지
는 테이블에 대한 인덱스는 나중에 myisamchk –rq를 사용해서 구조를 변경 시킬 수가 있다.
● --password=password, -ppassword
서버에 접속을 할 때 사용할 패스워드. 이 옵션의 경우에는 다른 MySQL 프로그램과는 달리 패스워드를 반드시
지정해야 한다는 점을 알아두기 바란다. 여러분은 옵션 파일을 사용해서 패스워드를 지정할 수 있다.
● --port=port_num, -P port_num
● --quiet, -q
● --record_log_pos=db_name.tbl_name
● --regexp=expr
● --resetmaster
● --resetslave
● --socket=path, -S path
● --suffix=str
● --tmpdir=path
● --user=user_name, -u user_name
제목검색
8. 클라이언트 및 유틸리티 프로그램 mysqlimport 클라이언트 프로그램은 LOAD DATA INFILE SQL 명령문에 대해서 명령어 라인 인터 페이스를 제공한
8.12. mysqlimport — 데이터 임포트(Import) 프로그램 다. mysqlimport에 대한 대부분의 옵션은 LOAD DATA INFILE 신텍스 구문과 직접적으로 상관이 된다.
8.12 mysqlimport — 데이터 임포트(Import) 프로그램 Section 13.2.5, “LOAD DATA INFILE 신텍스”를 참조할 것.
mysqlimport는 다음과 같이 호출한다:
shell> mysqlimport [options] db_name textfile1 [textfile2 ...]
명령어 라인에서 지정을 한 각각의 텍스트 파일의 경우, mysqlimport는 파일 이름에서 확장자를 떼어 낸 다음에 그 값
을 파일의 내용물을 임포트 할 테이블 이름으로 판단한다. 예를 들면, patient.txt, patient.text, 그리고 patient는 모두
patient 라는 이름의 테이블에 임포트가 된다.
mysqlimport는 아래의 옵션을 지원한다:
● --help, -?
● --character-sets-dir=path
● --columns=column_list, -c column_list
이 옵션은 콤마로 구분된 컬럼 이름 리스트를 자신의 값으로 가져간다. 컬럼 이름의 순서는 데이터 파일 컬럼을
테이블 컬럼과 어떻게 매치를 시켜야 하는지를 나타낸다.
● --compress, -C
● --debug[=debug_options], -# [debug_options]
● --default-character-set=charset_name
● --delete, -D
이 옵션들은 LOAD DATA INFILE에 대해서 상응되는 구문들과 같은 의미를 가지고 있다. Section 13.2.5,
“LOAD DATA INFILE 신텍스”를 참조할 것.
● --force, -f
● --host=host_name, -h host_name
주어진 호스트 상에 있는 MySQL 서버에 데이터를 임포트 한다. 디폴트 호스트는 localhost.
● --ignore, -i
● --ignore-lines=N
● --local, -L
● --lock-tables, -l
텍스트 파일을 처리하기 전에 쓰기를 위해 모든 테이블을 잠근다. 이것은 모든 테이블이 서버에서 동기화 되도
록 해 준다.
● --low-priority
● --password[=password], -p[password]
● --port=port_num, -P port_num
● --protocol={TCP|SOCKET|PIPE|MEMORY}
사용할 접속 프로토콜.
● --replace, -r
● --silent, -s
● --socket=path, -S path
localhost에 접속을 하는 경우에 사용되는, 유닉스 소켓 파일, 또는 윈도우 네임드 파이프의 이름.
● --user=user_name, -u user_name
● --verbose, -v
● --version, -V
shell> ed
a
100 Max Sydow
101 Count Dracula
.
w imptest.txt
32
q
shell> od -c imptest.txt
0000000 1 0 0 ₩t M a x S y d o w ₩n 1 0
0000020 1 ₩t C o u n t D r a c u l a ₩n
0000040
shell> mysqlimport --local test imptest.txt
test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
shell> mysql -e 'SELECT * FROM imptest' test
+------+---------------+
| id | n |
+------+---------------+
| 100 | Max Sydow |
| 101 | Count Dracula |
+------+---------------+
제목검색
8. 클라이언트 및 유틸리티 프로그램 mysqlshow 클라이언트는 어떤 데이터 베이스가 있고, 어떤 테이블, 어떤 테이블 컬럼 또는 인덱스가 있는지를 쉽게
8.13. mysqlshow — 데이터 베이스, 테이블, 그리고 컬럼 보여주는 프로그램이다.
정보를 보여 준다 mysqlshow는 몇몇 SQL SHOW 명령문에 대해서 명령어 라인 인터 페이스를 제공한다. Section 13.5.4, “SHOW
8.13 mysqlshow — 데이터 베이스, 테이블, 그리고 컬럼 정보 신텍스”를 참조할 것. 이와 같은 명령어를 직접 사용해서도 동일한 정보를 얻을 수가 있다. 예를 들면, 여러분은you
를 보여 준다 can issue them from the mysql 클라이언트 프로그램에서 이것들을 입력할 수가 있다.
mysqlshow는 아래와 같이 호출한다:
shell> mysqlshow [options] [db_name [tbl_name [col_name]]]
● 만일 아무런 데이터 베이스도 주어지지 않으면, 데이터 베이스 이름 리스트가 나오게 된다.
● 만일 아무런 테이블도 주어지지 않으면, 데이터 베이스 있는 모든 매칭 테이블이 나오게 된다.
● 만일 아무런 컬럼도 주어지지 않으면, 매칭되는 모든 컬럼과 컬럼 타입이 나오게 된다.
● --help, -?
● --character-sets-dir=path
● --compress, -C
● --count
테이블 당 열 수를 보여준다. 이것은 non-MyISAM 테이블에 대해서는 속도가 느리다. 이 옵션은 MySQL
5.0.6에서 추가되었다.
● --debug[=debug_options], -# [debug_options]
● --default-character-set=charset_name
● --host=host_name, -h host_name
● --keys, -k
● --password[=password], -p[password]
● --port=port_num, -P port_num
● --protocol={TCP|SOCKET|PIPE|MEMORY}
접속 프로토콜.
● --show-table-type, -t
테이블 타입을 가리키는 컬럼을 보여준다. SHOW FULL TABLES과 동일하다. 이 타입은 BASE TABLE 또
는 VIEW가 된다. 이 옵션은 MySQL 5.0.4에서 추가되었다.
● --socket=path, -S path
● --status, -i
● --user=user_name, -u user_name
● --verbose, -v
버보스 모드(Verbose mode). 프로그램이 실행하는 정보를 자세히 보여준다. 이 옵션을 여러 번 사용하면 보
다 많은 정보를 얻을 수가 있다.
● --version, -V
제목검색
8. 클라이언트 및 유틸리티 프로그램 mysql_zap은 패턴과 일치하는 프로세스를 죽이는 프로그램이다. 이것은 ps 명령어 및 유닉스 신호를 사용하기 때문
8.14. mysql_zap — 패턴과 일치하는 프로세스 죽이기(Kill) 에, 유닉스와 유닉스와 유사한 시스템에서 구동이 된다.
● --help, -?, -I
● -f
● -t
http://www.mysqlkorea.com/develop/sub_07.html?lcate=8&mcate=14&scate=0&idx=17032006-08-08 오후 6:05:40
:::MySQL Korea:::
제목검색
8. 클라이언트 및 유틸리티 프로그램 대부분의 시스템 에러의 경우, MySQL은 내부 텍스트 메시지와 더불어, 아래의 스타일 중의 한 형태로 시스템 에러 코드를 출력하
8.15. perror — 에러 코드 설명 다:
● --ndb
● --silent, -s
● --verbose, -v
● --version, -V
제목검색
from 은 변경을 고려하는 스트링을 의미하며 to 는 대체할 스트링을 의미한다. 하나 또는 여러 쌍의 스트링이 존재할 수 있다.
-- 옵션을 사용해서 스트링 대체가 어디에서 끝이 나고 파일 이름이 어디에서 시작이 되는지를 가리킬 수가 있다. 이와 같은 경
우, 명령어 라인에서 지정된 파일은 그 자리에서 수정이 되며, 따라서 여러분은 변환을 하기 전에 원본을 복사하는 것이 좋다.
replace는 실제로 수정이 되는 입력 파일에 대한 내용을 출력한다.
만일 – 옵션이 주어지지 않으면, replace는 표준 입력 값을 읽게 되고 표준 결과 값을 작성하게 된다.
replace는 유한 상태 머신(finite state machine)을 사용해서 보다 긴 스트링을 우선 매치한다. 이것은 스트링을 스왑(swap)하기
위해서도 사용될 수 있다. 예를 들면, 아래의 명령어는 주어진 파일 file1 과 file2에 있는 a 와 b를 스왑한다.
shell> replace a b b a -- file1 file2 ...
replace 프로그램은 msql2mysql에 의해서 사용될 수 있다. Section 22.9.1, “msql2mysql — Convert mSQL Programs for
Use with MySQL”를 참조할 것.
replace는 아래의 옵션을 지원한다:
● -?, -I
● -# debug_options
● -s
침묵 모드(Silent mode).
● -v
● -V
제목검색
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=9&mcate=1&scate=0&idx=17072006-08-08 오후 6:06:41
:::MySQL Korea:::
제목검색
9. 언어 구조 (Language Structure)
9.1.1 스트링(Strings)
'a string'
"another string"
만일 ANSI_QUOTES SQL 모드가 활성화 되어 있다면, 스트링 리터럴은 단일 인용 부호만을 사용할 수 있는데, 그 이유는 이중 부
호를 사용하게 되면 이것을 식별자(identifier)로 해석하기 때문이다.
예제:
SELECT _latin1'string';
이러한 형태의 스트링 신텍스에 관한 보다 자세한 정보는 Section 10.3.5, “문자 스트링 리터럴 문자 셋 및 콜레션”을 참조 할
것.
스트링 안에서는, 어떤 시퀀스는 특별한 의미를 갖게 된다. 이러한 시퀀스들은 각각 이스케이프 문자로 알려져 있는 백 슬레시로 시
작이 된다. MySQL은 아래의 이스케이프 시퀀스를 인식한다:
₩b A backspace character.
₩t A tab character.
다른 모든 이스케이프 시퀀스의 경우, 백 슬레시는 무시가 된다. 즉, 이스케이프 문자는 이스케이프가 아닌 것처럼 해석이 된다. 예
를 들면, ‘₩x’ 는 단지 ‘x’로 해석된다.
이러한 시퀀스들은 대소 문자를 구분한다. 예를 들면, ‘₩b’는 백 스페이스로 해석되지만, ‘₩B’는 ‘B’로 해석된다.
ASCII 26 문자는 ‘₩Z’로 해석되며 윈도우에서 END-OF-FILE을 나타내는 ASCII 26 문제를 해결하도록 한다. 파일 안에 있
는 ASCII 26는 여러분이 mysql db_name < file_name를 시도할 경우에 문제를 발생 시킨다.
‘₩%’ 와 ‘₩_’ 시퀀스는 이것들이 와일드 카드 문자로 해석되어야 하는 곳의 패턴-매칭 문장에서 ‘%’ 와 ‘_’의 리터럴
인스턴스를 검색하기 위해 사용된다. Section 12.3.1, “스트링 비교 함수”에 있는 LIKE 연산자에 대한 설명을 살펴 보기 바란
다. 만일 여러분이 비-패턴-매칭 문장에서 ‘₩%’ 또는 ‘₩_’를 사용할 경우, 이것들은 스트링 ‘₩%’ 와 ‘₩_’로 해석되
고, ‘%’ 와 ‘_’로는 해석되지 않게 된다.
+-------+---------+-----------+--------+--------+
+-------+---------+-----------+--------+--------+
+-------+---------+-----------+--------+--------+
+-------+---------+-----------+--------+--------+
+--------------------+
| This
Is
Four
Lines |
+--------------------+
+------------------------+
| disappearing backslash |
+------------------------+
만일 여러분이 스트링 컬럼 속에 (예를 들면 BLOB 컬럼) 바이너리 데이터를 삽입하고자 한다면, 아래의 문자는 반드시 이스케이
프 시퀀스를 사용해서 표시되어야 한다:
NUL NUL byte (ASCII 0). Represent this character by ‘₩0’ (a backslash followed by an ASCII ‘0’ character).
어플리케이션 프로그램을 작성할 때, 이러한 특수 문자를 가지고 있는 스트링은 반드시 MySQL 서버에 보내지는 SQL 명령문에서
이 스트링을 사용하기 전에 올바르게 이스케이프가 되어야 한다. 여러분이 이것을 두 가지 방식으로 처리할 수가 있다:
● 특수 문자를 이스케이프하는 함수를 사용해서 스트링을 처리한다. C 프로그램에서는, 문자를 이스케이프 시키기 위해서
mysql_real_escape_string() C API 함수를 사용할 수 있다. Section 22.2.3.52, “mysql_real_escape_string()”을 참
조. Perl DBI 인터페이스는 특수 문자를 적당한 이스케이프 문자로 변환시키는 방법으로 quote 방식을 제공해 준다.
Section 22.4, “MySQL Perl API”를 참조. 다른 언어 인터 페이스에서도 이와 유사한 방식을 제공해 준다.
● 특수 문자를 확실하게 이스케이프 시키기 위한 다른 방안으로는, 많은 수의 MySQL API가 특수 마커(marker)를 명령문
스트링에 삽입할 수 있도록 해 주는 플레이스홀더(placeholder)를 제공하고 있으며, 여러분이 명령문을 입력하게 되면 데
이터 값을 이것들과 묶어 버린다. 이와 같은 경우, API는 이 값에서 이스케이프 특수 문자를 조심스럽게 처리한다.
제목검색
상위메뉴리스트 ◆ 9.1.2. 숫자
9. 언어 구조 (Language Structure)
9.1. 리터럴 값(Literal Values) 정수는 숫자(digit)의 시퀀스 형태로 표현된다. 소수점은 10진법의 구분자(separater)로서 ‘.’을 사용한다. 두 가지 형태의 숫자
유효한 정수 값의 예를 보면:
1221
-32
294.42
-32032.6809e+10
148.00
정수를 소수점 문장 안에서 사용할 수도 있다; 이것은 소수점 숫자와 동일하게 취급된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=9&mcate=1&scate=2&idx=17092006-08-08 오후 6:06:50
:::MySQL Korea:::
제목검색
9. 언어 구조 (Language Structure)
9.1. 리터럴 값(Literal Values) MySQL은 16 진수 값을 지원한다. 숫자 문장에서는, 이 값은 마치 정수처럼 동작을 한다 (64-비트 표현식). 스트링 문자에서는,
9.1.3 16진수 값 이 값은 바이너리 스트링처럼 동작을 하며, 각각의 16진수 쌍은 하나의 문자로 변환이 된다:
-> 'MySQL'
-> 10
-> 'Paul'
16진수 값의 디폴트 타입은 스트링이다. 만일 이 값을 확실하게 숫자로 처리하고 싶다면, CAST(... AS UNSIGNED)를 사용하면
된다:
-> 'A', 65
x'hexstring' 신텍스는 표준 SQL를 기반으로 한다. 0x 신텍스는 ODBC에 기반을 둔다. BLOB 컬럼에 대한 값을 지원하기 위해서
ODBC가 16진수 스트링을 사용하는 경우도 종종 있다.
여러분은 HEX() 함수를 사용해서 스트링 또는 숫자를 16진수 포맷의 스트링으로 변환 시킬 수가 있다:
-> '636174'
-> 'cat'
제목검색
9. 언어 구조 (Language Structure)
9.1. 리터럴 값(Literal Values) 항수(constants) TRUE 와 FALSE는 각각 1 과 0로 해석된다. 항수 이름은 대소 문자 구분을 하지 않는
-> 1, 1, 0, 0
http://www.mysqlkorea.com/develop/sub_07.html?lcate=9&mcate=1&scate=4&idx=17112006-08-08 오후 6:06:52
:::MySQL Korea:::
제목검색
9. 언어 구조 (Language Structure)
9.1. 리터럴 값(Literal Values) MySQL 5.0.3 이후, 비트-필드(bit-field) 값을 b'value' 표기법을 사용해서 작성할 수 있게 되었다. value 는 여러 개의 0 과 1
+------+----------+----------+----------+
+------+----------+----------+----------+
| 10 | 1010 | 12 |A |
+------+----------+----------+----------+
http://www.mysqlkorea.com/develop/sub_07.html?lcate=9&mcate=1&scate=5&idx=17122006-08-08 오후 6:06:53
:::MySQL Korea:::
제목검색
9. 언어 구조 (Language Structure)
9.1. 리터럴 값(Literal Values) NULL 값은 “데이터가 없음(no data)”을 의미한다. NULL은 대소 문자 구분을 하지 않는다.
9.1.6 NULL 값
NULL 값은 숫자 타입의 0 또는 스트링 타입의 빈 스트링(empty string)과는 다른 것임을 알아야 한다. Section A.5.3, “NULL
값 사용의 문제점”을 참조할 것.
LOAD DATA INFILE 또는 SELECT ... INTO OUTFILE를 사용해서 실행되는 텍스트 파일 임포트 또는 익스포트의 경우,
NULL은 ₩N 시퀀스를 가지고 표시가 된다. Section 13.2.5, “LOAD DATA INFILE 신텍스”를 참조할 것.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=9&mcate=1&scate=6&idx=17132006-08-08 오후 6:06:54
:::MySQL Korea:::
제목검색
9.2 데이터 베이스, 테이블, 인덱스, 컬럼 그리고 별칭 이름 데이터 베이스, 테이블, 인덱스, 컬럼 그리고 별칭은 식별자이다. 이 섹션에서는 MySQL에서 사용할 수 있는 식별자
(Alias Names) 에 대해서 설명하기로 한다.
9.2.1 식별자 수식어 (Identifier Qualifiers) 아래의 테이블에서는 각각의 식별자 타입의 최대 크기를 보여 준다.
Database 64
Table 64
Column 64
Index 64
Alias 255
식별자는 유니 코드(UTF-8)을 사용해서 저장된다. 이것은 .frm 파일에 저장되는 테이블 정의문에 있는 식별자 및
mysql 데이터 베이스에 있는 그랜트 테이블에 저장되는 식별자에 적용이 된다. MySQL 5.0의 그랜트 테이블(그리
고 다른 테이블)에 있는 스트링 컬럼의 크기는 문자의 수로 주어진다. 이것은 (MySQL의 이전 버전과는 달리) 여러
분이 이러한 컬럼에 저장되는 값에 대해서 다중-바이트 문자를 사용할 수 있다는 것을 의미하는 것이다.
식별자는 인용 부호를 사용할 수도 있고 사용하지 않을 수도 있다. 만일 식별자가 사용 지정된 단어이거나 또는 특수
문자를 가지고 있다면, 여러분은 반드시 이것을 참조할 때마다 인용 부호를 사용해야 한다. (예외 사항: 사용이 검증
된 이름 안에서 점(period)이 붙어 있는 단어는 반드시 식별자 이어야 하고, 따라서 이것이 사용 지정 단어라고 하더
라고 인용 부호를 사용할 필요는 없게 된다.) 사용 지정 단어 리스트에 대해서는 Section 9.5, “MySQL에서 사용이
지정된 단어 다루기”를 참조할 것. 특수 문자는 알파뉴메릭(alphanumeric) 문자 셋 이외의 문자들을 의미한다.
식별자 인용 부호 문자는 백틱(backtick) (‘`’)이다:
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
만일 ANSI_QUOTES SQL 모든가 활성화 되어 있다면, 이중 인용 부호를 사용해서 식별자를 처리하는 것이 가능하
다:
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax. (...)
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
Note: ANSI_QUOTES 모드는 서버로 하여금 이중 인용 부호를 사용한 스트링을 식별자로 해석하게끔 하기 때문에,
이 모드가 활성화 되어 있는 경우에는 반드시 스트링 리터럴을 단일 인용 부호를 사용해서 처리해야만 한다. 이중 인
용 부호를 사용해서는 처리가 않된다.
서버 SQL 모드는 Section 5.2.5, “서버 SQL 모드”에서 설명한 방식으로 제어가 된다.
식별자 인용 문자는 여러분이 식별자를 인용 부호화할 경우에 식별자 안에 포함 시킬 수가 있다. 만일 식별자 안에 포
함 시켜야 할 문자가 식별자 자체를 인용 부호화 하는데 사용한 것과 같을 경우에는, 이중 인용 부호를 사용하면 된
다. 아래의 명령문은 c"d라는 이름의 컬럼을 가지고 있는 a`b 라는 이름의 테이블을 생성한다.
mysql> CREATE TABLE `a``b` (`c"d` INT);
M 과 N 이 정수인 경우에 Me 또는 MeN 형태의 이름을 사용하지 말 것을 권고한다. 예를 들면, 식별자로서 1e 또는
2e2 와 같은 형태는 피해야 하는데, 그 이유는 1e+3 와 같은 수식이 애매 모호해지기 때문이다. 문장에 관련해서는,
이러한 이름은 수식 1e + 3 또는 숫자 1e+3로 해석될 수도 있다.
MD5()을 사용해서 테이블 이름을 생성할 때에는 주의를 해야 하는데, 그 이유는 이것이 위에서 설명한 것과 유사한
애매 모호한 포맷 또는 올바르지 못한 이름을 만들기 때문이다.
제목검색
9. 언어 구조 (Language Structure)
9.2. 데이터 베이스, 테이블, 인덱스, 컬럼 그리고 별칭 이름 MySQL 은 단일 식별자 또는 여러 개의 식별자로 구성된 이름을 허용한다. 여러 부분으로 이름을 만들 경우에는
(Alias Names) 점 (‘.’) 으로 구분을 해야 한다. 여러 부분으로 되어 있는 이름의 첫 부분은 최종 식별자가 해석되는 곳에 있는
9.2.1 식별자 수식어 (Identifier Qualifiers) 문장에 영향을 주는 수식어 형태로 동작을 한다.
tbl_name.col_name The column col_name from table tbl_name of the default database.
db_name.tbl_name.col_name The column col_name from table tbl_name of the database db_name.
을 참조해야 한다.
수식이 된 이름에서 점(period) 다음에 나오는 단어는 반드시 식별자이어야 하며, 따라서 이것이 사용 지정된 단어
일 지라도 인용 부호화 할 필요는 없다.
신텍스 .tbl_name는 디폴트 데이터 베이스에 있는 테이블 tbl_name을 의미한다. 이 신텍스는 몇몇 ODBC 프로그
램이 테이블 이름을 ‘.’ 문자를 사용해서 앞세우기 때문에 ODBC와는 호환성을 가지게 된다.
제목검색
9. 언어 구조 (Language Structure)
9.2. 데이터 베이스, 테이블, 인덱스, 컬럼 그리 MySQL에서는, 데이터 베이스는 데이터 디렉토리에 있는 디렉토리와 연결이 된다(correspond). 하나의 데이터 베이스에 들어 있
고 별칭 이름(Alias Names) 는 각각의 테이블은 데이터 베이스 디렉토리에 들어 있는 파일과 최소한 한 개가 연결이 된다 (또한, 스토리지 엔진에 따라서 여러
9.2.2 식별자 대소 문자 구분 개와 연결될 수도 있음). 결론적으로, 사용하는OS 환경이 대소 문자를 구분하는지에 따라서 데이터 베이스와 테이블 이름에 대한
대소 문자 구분이 이루어지게 된다. 이것이 의미하는 것은 데이터 베이스와 테이블 이름이 대부분의 유닉스에서는 대소 문자를 구
분하며, 윈도우에서는 그렇지 않다는 것을 가리킨다. 하지만 Mac OS X의 경우는 예외인데, 이 OS는 유닉스 기반이기는 하지만 이
것이 사용하는 디폴트 파일 시스템 (HFS+)은 대소 문자를 구분하지 않는다. 하지만, Mac OS X 역시 UFS를 지원하며, 이것은 대
소 문자를 구분한다. Section 1.9.4, “표준 SQL에 대한 MySQL의 확장”을 참조할 것. lower_case_table_names 시스템 변수
또한 이 섹션 후반부에서 설명하는 식별자 대소 문자 구분을 서버가 처리하는 동작에 영향을 준다.
Note: 비록 데이터 베이스 및 테이블 이름이 어떤 플랫폼에서는 대소 문자를 구분하지 않는다 하더라도, 여러분은 동일한 명령문
내에서는 대소 문자를 혼용해서 데이터 베이스 및 테이블 이름을 지정하지 않도록 한다. 아래의 명령문은 하나의 동일 테이블을
my_table 및 MY_TABLE로 참조를 하기 때문에 동작을 하지 않게 된다:
컬럼, 인덱스, 스토어드 루틴, 그리고 트리거의 이름은 모든 플랫폼에서 대소 문자를 구분하지 않으며, 컬럼 별칭도 마찬가지이다.
디폴트로는, 테이블 별칭은 유닉스에서는 대소 문자를 구분하지만, 윈도우 또는 Mac OS X에서는 그렇지 않게 된다. 아래의 명령문
은 유닉스에서는 동작을 하지 않게 되는데, 그 이유는 이것이 a 및 A 형태로 별칭을 참조하기 때문이다
하지만, 위의 명령문은 윈도우에서는 동작을 한다. 이와 같은 차이점으로 인한 문제를 해결하기 위해서는, 항수 변환을 적용하는 것
이 최선의 방법인데, 데이터 베이스와 테이블을 생성하고 참조할 경우에는 항상 소문자 이름을 사용하도록 하는 것이다. 이러한 변
환은 이식성을 최대한 보장해 주고 사용을 용이하게 해 주기 때문에 권장하고 있다.
MySQL에서 테이블 맟 데이터 베이스가 디스크에 저장되고 사용되는 방법은 lower_case_table_names 시스템 변수를 가지고 제
어할 수 있는데, 여러분은 이것을 mysqld을 시작하는 시점에 설정할 수 있다. lower_case_table_names은 아래의 테이블에 있는
값을 가져온다. 유닉스의 경우, lower_case_table_names의 디폴트 값은0 이다. 윈도우의 경우에는 1 이 되며, Mac OS X는 디폴
트가 2가 된다.
Value Meaning
Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or
CREATE DATABASE statement. Name comparisons are case sensitive. Note that if you force this variable
0
to 0 with --lower-case-table-names=0 on a case-insensitive filesystem and access MyISAM tablenames
using different lettercases, index corruption may result.
Table names are stored in lowercase on disk and name comparisons are not case sensitive. MySQL converts
1 all table names to lowercase on storage and lookup. This behavior also applies to database names and table
aliases.
Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or
CREATE DATABASE statement, but MySQL converts them to lowercase on lookup. Name comparisons are
2
not case sensitive. Note: This works only on filesystems that are not case sensitive! InnoDB table names are
stored in lowercase, as for lower_case_table_names=1.
만일 여러분이 오직 하나의 플랫폼 상에서만 MySQL을 사용한다면, 보통의 경우에는 lower_case_table_names 변수를 변경 시
킬 필요는 없다. 하지만, 파일 시스템이 대소 문자를 구분하는 플랫폼 간에 테이블을 전달하고자 하는 경우에는 어려움을 직면할 수
도 있게 된다. 예를 들면, 유닉스 상에서는 이름이 my_table 과 MY_TABLE인 두 개의 테이블을 가질 수는 있으나, 윈도우에서는
이 두 개의 테이블이 동일한 것으로 간주된다. 문자 크기에 민감한 테이블과 데이터 베이스 이름 전송의 문제를 해결하기 위해서
는, 아래의 두 가지 옵션을 사용해야 한다:
다.
● 유닉스에서는 lower_case_table_names=0로 설정하고, 윈도우에서는 lower_case_table_names=2로 설정한다. 이렇게
하면 데이터 베이스 및 테이블 이름의 원래 문자 크기가 보존된다. 이렇게 할 경우의 단점으로는, 여러분이 사용하는 명령
문이 항상 윈도우에서 정확한 문자 크기를 사용해서 데이터 베이스 및 테이블 이름을 참조한다고 확인을 해야 한다는 것이
다. 만일 명령문을 문자 크기에 민감한 유닉스로 전송할 경우에는, 문자 크기가 정확하기 않는 명령문은 동작을 하지 않게
된다.
만일 여러분이 유닉스에서 lower_case_table_names 시스템 변수를 1로 설정하고자 한다면, 우선 구형 데이터 베이스 및 테이블
의 이름 mysqld을 새로운 설정으로 재 시작하기 전에 우선 데이터 베이스 및 테이블 이름을 소문자로 변환 시켜야 한다는 점을 알
아두기 바란다.
제목검색
9. 언어 구조 (Language Structure)
변수명은 var_name 이라고 쓰는 반면, 사용자 변수는 @var_name 이라고 쓴다. 사용자 변수의 이름으로 현재의 문자 집합에서 알
파벳이나 숫자, ‘.’, ‘_’, 그리고 ‘$’을 사용할 수 있다. 기본 문자 집합은 latin1이다 (cp 1252 서유럽어). 이것은 mysqld
에 --default-character-set옵션을 주어 바꿀 수 있다. 5.11.1절 “자료와 저장에 사용되는 문자 집합” 절을 참고. 문자열이
나 이름identifier을 따옴표로 둘러 싸면 사용자 변수명에 다른 문자도 넣을 수 있다 (예를 들어, @'my-var', @"my-var", or
@`my-var`).
Note: MySQL 5.0이전에는 사용자 변수명에 대소문자를 가렸지만, MySQL 5.0과 그 이후부터는 대소문자를 가리지 않는다.
SET문에서는 할당 연산자로 = 나 := 모두 사용될 수 있다. 각 변수에 할당되는 expr은 정수, 실수, 문자열이나 NULL값으로 평가
될 수 있다.
SET 문이 아닌 다른 구문으로 값을 변수에 할당할 수 있다. 이 경우에 할당 연산자는 = 가 아니라 := 여야만 한다. =는 SET 이 아
닌 구문에서는 비교 연산자로 쓰이기 때문이다.
+----------------------+------+------+------+
+----------------------+------+------+------+
| 5| 5| 1| 4|
+----------------------+------+------+------+
사용자 변수는 식을 사용할 수 있는 곳에 쓸 수 있다. 하지만 SELECT 문의 LIMIT 절이나, LOAD DATA문의 IGNORE N
LINES 절과 같이 숫자만 들어갈 수 있는 곳에도 사용할 수 있는 것은 아니다.
문자열을 사용자 변수에 할당하면, 변수는 문자열과 같은 문자열 집합과 콜레이션을 갖는다. 사용자 변수의 coercibility는
MySQL 5.0.3에서는 암시적이다(implicit). (테이블 컬럼 값들의 coercibility와 같다.)
Note: SELECT 구문에서는, 각 식이 클라이언트에 보내졌을 때에만 평가된다. 이 말은 HAVING, GROUP BY, 나 ORDER BY 절
에서, SELECT 목록에 있는 변수가 사용된 식을 참조할 수 없다는 뜻이다. 예를 들어, 다음 구문은 의도된 대로 동작하지 않는다.
HAVING 절에 쓰인 b는 SELECT 목록에 있는, @aa 가 사용된 식의 별명이다. 이것은 의도된 대로 동작하지 않는다: @aa 가 현
재 줄이 아니라, 이전에 선택된 줄에서의 id 값을 갖고 있기 때문이다.
일반적인 규칙은 사용자 변수를 한 구문 안에서 정의하면 같은 구문의 다른 부분에서 절대 사용하지 않는 것이다. 여러분은 예상한
결과를 얻을 수도 있겠지만, 반드시 보장되지는 않는다.
한 구문 안에서 변수를 정의하고 사용하는 데에 따른 또다른 사항은, 변수의 기본 결과 타입이 구문의 시작 부분에서의 변수 타입
에 기반한다는 것이다. 다음 예제가 이것을 설명한다:
SELECT 구문에서, MySQL은 두 번째 열에서 @a가 수로 설정되었더라도, 첫째 열이 문자열이고 @a에 관한 모든 접근을 문자열
로 한다고 알린다. 우리가 SELECT 문을 실행하고 나면, 다음 구문에서 @a는 수로 여겨진다.
이런 행동에서 나오는 문제를 피하기 위해, 한 구문 안에 같은 변수를 동시에 설정하고 사용하지 않거나, 변수를 사용하기 전에 0,
0.0, 혹은 ‘’로 정의해야 한다.
제목검색
9. 언어 구조 (Language Structure) 여러분은 사용자 정의 변수를 지정하고 나중에 참조할 수 있다. 이것은 한 구문으로부터 다른 구문으로 값을 넘길 수 있도록 한다.
9.3. 사용자 정의 변수들 사용자 정의 변수는 커넥션에 국한되어 있다. 다시 말해, 한 클라이언트에서 정의된 사용자 변수는 다른 클라이언트에서는 보이지
9.3 사용자 정의 변수들 않고 사용되지 못한다. 주어진 커넥션에서 정의된 모든 변수는 클라이언트가 종료되면 자동으로 해제된다.
9.3 사용자 정의 변수 변수명은 var_name 이라고 쓰는 반면, 사용자 변수는 @var_name 이라고 쓴다. 사용자 변수의 이름으로 현재의 문자 집합에서 알
파벳이나 숫자, ‘.’, ‘_’, 그리고 ‘$’을 사용할 수 있다. 기본 문자 집합은 latin1이다 (cp 1252 서유럽어). 이것은 mysqld
에 --default-character-set옵션을 주어 바꿀 수 있다. 5.11.1절 “자료와 저장에 사용되는 문자 집합” 절을 참고. 문자열이
나 이름identifier을 따옴표로 둘러 싸면 사용자 변수명에 다른 문자도 넣을 수 있다 (예를 들어, @'my-var', @"my-var", or
@`my-var`).
Note: MySQL 5.0이전에는 사용자 변수명에 대소문자를 가렸지만, MySQL 5.0과 그 이후부터는 대소문자를 가리지 않는다.
사용자 정의 변수는 SET문을 이용해서 정의할 수 있다
SET @var_name = expr [, @var_name = expr] ...
SET문에서는 할당 연산자로 = 나 := 모두 사용될 수 있다. 각 변수에 할당되는 expr은 정수, 실수, 문자열이나 NULL값으로 평가
될 수 있다.
SET 문이 아닌 다른 구문으로 값을 변수에 할당할 수 있다. 이 경우에 할당 연산자는 = 가 아니라 := 여야만 한다. =는 SET 이 아
닌 구문에서는 비교 연산자로 쓰이기 때문이다.
mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5| 5| 1| 4|
+----------------------+------+------+------+
사용자 변수는 식을 사용할 수 있는 곳에 쓸 수 있다. 하지만 SELECT 문의 LIMIT 절이나, LOAD DATA문의 IGNORE N
LINES 절과 같이 숫자만 들어갈 수 있는 곳에도 사용할 수 있는 것은 아니다.
문자열을 사용자 변수에 할당하면, 변수는 문자열과 같은 문자열 집합과 콜레이션을 갖는다. 사용자 변수의 coercibility는
제목검색
SQL 서버는 이것을 무시한다. 예를 들면, MySQL 서버는 아래의 명령문에 있는 STRAIGHT_JOIN 키워드를 인식할 수 있지만,
다른 SQL 서버는 인식하지 못한다:
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
만일 여러분이 If you add a version number after the ‘!’ 문자 다음에 버전 정보를 추가한다면, 이 신텍스는 이렇게 지정된
MySQL 버전과 같거나 보다 늦게 출시된 서버에서만 실행이 된다. 아래의 코멘트에 있는 TEMPORARY 키워드는 MySQL
3.23.02 또는 그 이상 버전의 서버에서만 구동을 한다:
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
위에서 설명한 코멘트는 mysqld 서버가 SQL명령문을 파스(parse)하는 방식에 영향을 준다. mysql 클라이언트 프로그램은 또한
서버에 명령문을 보내기 전에 몇몇 파싱 동작을 하기도 한다. (이러한 동작은 다중 명령문 입력 라인 안에 있는 명령문의 범위를 판
단하기 위해 실행된다.)
제목검색
9. 언어 구조 (Language Structure) SELECT와 같이 사용이 지정된 단어, TIMESTAMP 또는 GROUP와 같은 빌트-인(built-in) MySQL 데이터 타입 또는 함수의
9.5. MySQL 에서 사용 지정된 단어 다루기 이름을 테이블 또는 컬럼 이름과 같은 식별자로 사용하고자 시도를 할 때 문제가 일반적으로 발생한다.
9.5 MySQL 에서 사용 지정된 단어 다루기 만일 식별자가 사용 지정 단어라면, 여러분은 반드시 이것을 인용 부호화 해야 한다. Section 9.2, “데이터 베이스, 테이블, 인덱
스, 컬럼, 그리고 별칭 이름”을 참조할 것. 예외 사항: 수식 이름에서 점을 가지고 있는 단어는 반드시 식별자이기 때문에, 이 단어
가 사용 지정 단어일 지라도, 인용 부호를 사용할 필요는 없다.
함수의 이름을 식별자로 사용하는 것은 가능하다. 예를 들면, ABS를 컬럼 이름으로 사용하는 것은 가능하다. 하지만, 디폴트로는,
함수를 호출 할 때에는 함수 이름과 ‘(’ 문자 사이에 어떠한 화이트스페이스(whitespace)도 사용할 수가 없다. 이러한 요구 사
항은 컬럼 이름에 대한 참조화 함수 호출을 구분하기 위해 필요한 것이다.
이러한 특성으로 인해 몇몇 문장 안에서 스페이스를 생략하면 이것을 함수 이름으로 해석하는 경우가 발생한다. 예를 들면, 아래의
명령문은 허용이 된다:
하지만 abs 다음에 스페이스를 생략하게 되면, 이 신텍스는 에러를 발생시키는데, 그 이유는 이 명령문이 ABS() 함수를 호출하는
것으로 생각되기 때문이다:
만일 IGNORE_SPACE SQL 모드가 활성화 되어 있다면, 서버는 함수 호출에서 함수 이름과 ‘(’ 문자 사이에 화이트스페이스를
가지는 것을 허용한다. 이렇게 하면 함수 이름은 사용 지정 단어처럼 취급된다. 결론적으로, 함수 이름과 같은 식별자는 반드시
Section 9.2, “데이터 베이스, 테이블, 인덱스, 컬럼, 그리고 별칭 이름”에서 설명한 방식으로 인용 부호화 되어야 한다. 서버
SQL 모드는 Section 5.2.5, “서버 SQL 모드”에서 설명한 방식으로 제어가 된다.
아래의 테이블에 있는 단어들은 MySQL 5.0에서 명확하게 사용이 지정된 단어들이다. 여러분이 보다 상위의 버전으로 업데이트
를 하고자 할 때에는 향후에 사용이 지정될 단어를 미리 알아보는 것은 좋은 생각이다. 아래의 테이블에 있는 대부분의 단어들은 표
준 SQL에서 컬럼 또는 테이블 이름으로 사용할 수 없는 것들이다 (GROUP와 같이).
ANALYZE AND AS
BLOB BOTH BY
HOUR_SECOND IF IGNORE
IN INDEX INFILE
INTO IS ITERATE
ON OPTIMIZE OPTION
OPTIONALLY OR ORDER
TO TRAILING TRIGGER
ZEROFILL
아래의 단어들은 MySQL 5.0에서 새롭게 사용이 지정된 단어들이다: ASENSITIVE, CALL, CONDITION, CONNECTION,
CONTINUE, CURSOR, DECLARE, DETERMINISTIC, EACH, ELSEIF, EXIT, FETCH, GOTO, INOUT, INSENSITIVE,
ITERATE, LABEL, LEAVE, LOOP, MODIFIES, OUT, READS, RELEASE, REPEAT, RETURN, SCHEMA, SCHEMAS,
SENSITIVE, SPECIFIC, SQL, SQLEXCEPTION, SQLSTATE, SQLWARNING, TRIGGER, UNDO, UPGRADE, WHILE.
MySQL은 이전에 많은 사람들이 이미 사용을 해 오고 있는 키워드들에 대해서는 인용 부호를 사용하지 않아도 되게끔 하고 있다.
아래의 리스트는 이러한 단어들에 대한 예이다:
● ACTION
● BIT
● DATE
● ENUM
● NO
● TEXT
● TIME
● TIMESTAMP
제목검색
MySQL은 다양한 문자 셋을 사용해서 데이터를 저장하고 여러 가지 콜레션에 따라서 비교 연산을 할 수 있도록 지원하는 문
자 셋을 가지고 있다. 여러분은 서버, 데이터 베이스, 테이블, 그리고 컬럼 레벨에서 문자 셋을 지정할 수가 있다. MySQL은
MyISAM, MEMORY, NDBCluster, 그리고 InnoDB 스토리지 엔진을 위한 문자 셋 사용을 지원한다.
이 장에서는 아래의 주제를 다루고 있다:
● 문자 셋과 콜레션이 무엇인가?
● 문자 셋 할당을 위한 다중-레벨 디폴트 시스템
● 문자 셋과 콜레션을 지정하기 위한 신텍스
● 이것들로 인해 영향을 받는 함수와 연산
● 유니코드 지원
● 사용 가능한 문자 셋과 콜레션
문자 셋 이슈는 데이터 스토리지 뿐만 아니라 클라이언트 프로그램과 MySQL 서버간의 통신에도 영향을 주게 된다. 만일 여러
분이 디폴트와는 다른 문자 셋을 사용해서 서버와 클라이언트 프로그램이 통신하도록 하고자 한다면, 적용하고자 하는 문자 셋
을 지정해야 한다. 예를 들면, utf8 유니 코드 문자 셋을 사용하고자 한다면, 서버에 접속을 한 다음에 아래의 명령문을 입력한
다:
제목검색
10. 문자 셋 지원 문자 셋이란 심볼과 엔코딩(encoding) 셋을 의미한다. 콜레션은 하나의 문자 셋에 있는 문자들을 비교하기 위한 규칙 셋을 의미한
10.1. 일반적인 용도의 문자 셋과 콜레션 다. 가상의 문자 셋을 사용해서 설명을 보다 명확히 하도록 하자.
두 개의 스트링 값을 비교하는 경우를 가정하자: ‘A’ 와 ‘B’. 가장 간단하게 비교하는 방법은 각 문자의 엔코딩을 살펴 보는
것이다: ‘A’의 0 과 ‘B’의 1. 0 이 1보다 작기 때문에, 우리는 ‘A’가 ‘B’보다 작다고 말할 수 있다. 방금 행한 방법이 우
리가 사용한 문자 셋에 대해서 콜레션을 적용한 것이다. 콜레션은 규칙 셋이다 (이와 같은 경우에는 한 가지 규칙만 있음): “엔코
딩을 비교한다.” 위와 같이 콜레션 방법 중에 가장 간단한 방법을 우리는 바이너리 콜레션이라고 부른다.
하지만 만일 우리가 소문자와 대문자를 동일하게 하고자 한다면? 이럴 경우에는 최소한 두 개의 규칙을 가져야 한다: (1) 소문자
‘a’ 와 ‘b’를 대문자 ‘A’ 및 ‘B’와 동일하게 취급한다; (2) 그 다음에 엔코딩을 비교한다. 이러한 방식을 대소 문자 구분
이 없는 콜레션(case-insensitive collation)이라고 부른다. 이 방식은 바이너리 콜레션보다는 다소 복잡하다.
실 생활에서는, 대부분의 문자 셋이 많은 문자를 가지고 있다: ‘A’ 와 ‘B’ 뿐만 아니라 전체 알파벳, 때로는 다양한 형태의 알
파벳 또는 수 천개의 문자를 사용하는 동양의 필기 시스템. 또한 실제의 생활에서는, 대부분의 콜레션은 소문자를 구분하는 것 뿐
만 아니라 액센트를 구분하는 규칙까지도 가지고 있다.
MySQL은 이와 같은 문제를 아래와 같이 처리한다:
한다
● 어떤 레벨에서건 문자 셋과 콜레션을 지정할 수 있도록 허용한다
MySQL은 다른 데이터 베이스 시스템보다도 우수하게 문자 셋 및 콜레션을 처리하고 있지만, 이러한 특성을 효과적으로 사용하기
위해서는, 여러분은 사용 가능한 문자 셋과 콜레션이 어떤 것이 있으며, 디폴트 값을 어떻게 변경 시킬 수 있는지, 그리고 이것들이
스트링 연산자와 함수에 어떻게 영향을 주는지를 잘 알고 있어야 한다.
제목검색
10. 문자 셋 지원 MySQL 서버는 다양한 문자 셋을 지원한다. 사용 가능한 문자 셋을 보기 위해서는, SHOW CHARACTER SET 명령문을 입력한
10.2. MySQL에서의 문자 셋과 콜레션 다. 아래에 있는 리스트는 사용 가능한 문자 셋의 일부분이며, 보다 자세한 정보는 Section 10.9, “MySQL이 지원하는 문자 셋과
주어진 모든 문자 셋은 적어도 하나의 콜레션을 가지고 있다. 어떤 것들은 여러 개의 콜레션을 가지고 있기도 한다. 한 문자 셋에 대
한 콜레션을 보기 위해서는, SHOW COLLATION 명령문을 사용한다. 예를 들면, latin1 (cp1252 West European) 문자 셋의 콜
레션을 보고자 한다면, 아래와 같이 입력을 한다:
Collation Meaning
latin1_swedish_ci Swedish/Finnish
latin1_danish_ci Danish/Norwegian
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=10&mcate=3&scate=0&idx=17292006-08-08 오후 6:08:32
:::MySQL Korea:::
제목검색
10. 문자 셋 지원
10.3. 문자 셋과 콜레션 지정하기 MySQL 서버는 서버 문자 셋과 서버 콜레션을 가지고 있다. 이러한 것들은 서버 스타트 업 시점에 설정할 수 있으며 런 타임시에
기본적으로는, 서버 문자 셋과 콜레션은 여러분이 mysqld을 시작할 때 사용하는 옵션에 의존을 한다. 여러분은 문자 셋에 대해서
--character-set-server를 사용할 수 있다. 이것과 함께, 콜레션에 대해서는 --collation-server를 사용할 수가 있다. 만일
문자 셋을 지정하지 않는다면, --character-set-server=latin1라고 말하는 것과 같아진다. 만일 여러분이 콜레션은 지정하지
않고 문자 셋만을 지정한다면 (예를 들면, latin1), 이것은 --character-set-server=latin1 --collation-
server=latin1_swedish_ci를 지정하는 것과 같게 되는데, 그 이유는 latin1_swedish_ci가 latin1의 디폴트 콜레션이기 때문이다.
따라서, 아래의 세 가지 명령어는 모두 동일한 효과를 나타낸다:
shell> mysqld
--collation-server=latin1_swedish_ci
이 설정을 변경하는 방법 중에 한 가지는 재 컴파일을 하는 것이다. 만일 소스를 사용해서 MySQL을 설치할 때 디폴트 서버 문자
셋과 콜레션을 변경하고자 한다면, 다음과 같이 한다: configure에 대한 인수로 --with-charset 과 --with-collation을 사용한
다. 예를 들면:
또는:
--with-collation=latin1_german1_ci
mysqld 와 configure는 모두 문자 셋/콜레션 결합이 유효한지를 검증한다. 만일 유효하지 않다면, 각 프로그램은 에러 메시지를 출
력하고 종료를 한다.
제목검색
10. 문자 셋 지원
10.3. 문자 셋과 콜레션 지정하기 모든 데이터 베이스는 데이터 베이스 문자 셋과 데이터 베이스 콜레션을 가지고 있다. CREATE DATABASE 와 ALTER
10.3.2 데이터 베이스 문자 셋과 콜레션 DATABASE 명령문은 데이터 베이스 문자 셋과 콜레션을 지정하기 위한 옵션 구문을 가지고 있다:
모든 데이터 베이스 옵션은 데이터 베이스 디렉토리에 있는 db.opt라는 이름의 텍스트 파일에 저장된다.
CHARACTER SET 과 COLLATE 구문은 동일 MySQL 서버에서 서로 다른 문자 셋과 콜레션을 가지는 데이터 베이스를 생성할
수 있게 한다.
예문:
MySQL은 아래의 방식을 사용해서 데이터 베이스 문자 셋과 데이터 베이스 콜레션을 선택한다:
만일 테이블 문자 셋과 콜레션을 CREATE TABLE 명령문에서 지정하지 않았다면, 데이터 베이스 문자 셋과 콜레션을 디폴트로
사용하게 된다.
제목검색
10. 문자 셋 지원
10.3. 문자 셋과 콜레션 지정하기 모든 테이블은 테이블 문자 셋과 테이블 콜레션을 가지고 있다. CREATE TABLE 과 ALTER TABLE 명령문에는 테이블 문자 셋
예문:
만일 개별적인 컬럼 정의에서 컬럼 문자 셋과 콜레션을 지정하지 않으면, 테이블 문자 셋과 콜레션을 디폴트 값으로 사용하게 된
다. 테이블 문자 셋과 콜레션은 MySQL에만 있는 것이다; 표준 SQL 서버에는 이러한 것이 없다.
제목검색
10. 문자 셋 지원
10.3. 문자 셋과 콜레션 지정하기 모든 “문자” 컬럼 (즉, CHAR, VARCHAR, 또는 TEXT 타입의 컬럼)은 컬럼 문자 셋과 컬럼 콜레션을 가지고 있다. 컬럼 정의
예문:
);
제목검색
10. 문자 셋 지원
예문:
SELECT 'string';
SELECT _latin1'string';
간단한 명령문 SELECT 'string'의 경우, 스트링은 character_set_connection 과 collation_connection 시스템 변수가 정의하는
문자 셋과 콜레션을 갖는다.
_charset_name 수식은 정식으로는 인트로듀서(introducer)라고 불린다. 이것은 파서(parser)에게, “뒤에 따라오는 스트링은 문
자 셋 X를 사용한다”라고 말을 한다. 과거에는 이로 인해 사용자들이 혼란이 있었기 때문에, 우리는 인트로듀서는 어떠한 변환
(conversion)도 일으키지 않는다는 점을 강조한다; 엄밀히 말한다면, 이것은 스트링 값을 변경하지 않는 신호(signal)이다. 또한,
인트로듀서는 표준 헥스 리터럴(hex literal)과 헥스 리터럴 표기법 (x'literal' 및 0xnnnn), 그리고 ? 보다 앞선 규칙이다.
예문:
SELECT _latin1 ?;
예문:
• SELECT _latin1'Müller';
• SELECT 'Müller';
제목검색
상위메뉴리스트 ◆ 10.3.6. 국가 문자 셋
10. 문자 셋 지원
10.3. 문자 셋과 콜레션 지정하기 표준 SQL은 몇몇 미리 지정된 문자 셋을 CHAR이 사용하도록 지정하기 위한 방법으로 NCHAR 또는 NATIONAL CHAR를 정의
10.3.6 국가 문자 셋 한다. MySQL 5.0은 미리 지정된 문자 셋으로 utf8을 사용하고 있다. 예를 들면, 아래의 데이터 타입 선언은 모두 동일한 것이다:
NATIONAL CHARACTER(10)
NCHAR(10)
따라서:
NATIONAL VARCHAR(10)
NCHAR VARCHAR(10)
여러분은 국가 문자 셋에 스트링을 생성하기 위해서 N'literal'을 사용할 수 있다. 아래의 두 명령문은 동일한 것들이다:
MySQL 4.1 이전 버전에서 5.0으로 문자 셋 업그레이드에 대한 보다 자세한 정보는 MySQL 3.23, 4.0, 4.1사용자 매뉴얼을 참조
하기 바란다.
제목검색
10. 문자 셋 지원
10.3. 문자 셋과 콜레션 지정하기 아래의 예문에서는 MySQL이 디폴트 문자 셋과 콜레션 값을 어떻게 결정하는지에 대한 사항을 보여 준다.
CREATE TABLE t1
여기에서 latin1 문자 셋과 latin1_german1_ci 콜레션을 사용하는 컬럼이 하나 있다. 정의가 명확하기 때문에, 이것은 그대로 실행
이 된다. latin2 테이블에 latin1 컬럼을 저장하는 것은 아무런 문제가 없다는 점을 잘 알아두자.
예문 2: 테이블과 컬럼 정의
CREATE TABLE t1
이번에는 latin1 문자 셋과 디폴트 콜레션을 사용하는 컬럼이 있다. 이 형태가 비록 자연스럽게 보인다고 하더라도, 디폴트 콜레션
을 테이블 레벨에서 가져오지는 못한다. 대신에, latin1에 대한 디폴트 콜레션이 항상 latin1_swedish_ci이기 때문에, 컬럼 c1 은
latin1_swedish_ci (latin1_danish_ci이 아님)의 콜레션을 갖게 된다.
Example 3: 테이블과 컬럼 정의
CREATE TABLE t1
c1 CHAR(10)
이번에는 디폴트 문자 셋과 디폴트 콜레션을 갖는 컬럼이 있다. 이런 환경에서는, MySQL은 컬럼 문자 셋과 콜레션을 결정하기 위
해서 테이블 레벨을 검사한다. 결과적으로, 컬럼 c1에 대한 문자 셋은 latin1이 되고 이것의 콜레션은 latin1_danish_ci가 된다.
CREATE DATABASE d1
USE d1;
CREATE TABLE t1
c1 CHAR(10)
);
이번에는 문자 셋과 콜레션을 지정하지 않고 컬럼을 생성했다. 또한 테이블 레벨에서 문자 셋과 콜레션도 지정하지 않았다. 이런 환
경에서는, MySQL은 테이블 설정(setting)을 결정하기 위해서 데이터 베이스 레벨의 검사를 하게 되는데, 이렇게 한 다음에 컬럼
설정을 하게 된다. 결론적으로, 컬럼c1에 대한 문제 셋은 latin2이 되고 이것의 콜레션은 latin2_czech_ci가 된다.
제목검색
10. 문자 셋 지원
10.3. 문자 셋과 콜레션 지정하기 MaxDb와의 호환성을 위해서는 아래의 명령문을 사용한다. 두 명령문은 동일한 것이
http://www.mysqlkorea.com/develop/sub_07.html?lcate=10&mcate=3&scate=8&idx=17372006-08-08 오후 6:08:47
:::MySQL Korea:::
제목검색
10. 문자 셋 지원 몇몇 문자 셋과 콜레션 시스템 변수는 서버와 클라이언트의 상호 작용과 관련을 갖는다. 이러한 것들 중의 몇 가지는 이전 세션에
10.4. 문자 셋과 콜레션 접속 서 언급하였다:
10.4 문자 셋과 콜레션 접속
● 서버 문자 셋과 콜레션은 character_set_server 와 collation_server 시스템 변수의 값을 가지고 결정할 수 있다.
● 디폴트 데이터 베이스의 문자 셋과 콜레션은 character_set_database 와 collation_database 시스템 변수의 값을 가지고
결정할 수 있다.
추가적인 문자 셋 및 콜레션 시스템 변수는 클라이언트와 서버간의 통신을 처리할 때 포함된다. 모든 클라이언트는 접속과 관련한
문자 셋과 콜레션 시스템 변수를 가지고 있다.
“접속”이란 무엇인지를 생각해 보자: 접속이란 여러분이 서버에 접속을 할 때 만드는 무엇이다. 클라이언트는 쿼리와 같은 SQL
명령문을 서버와의 연결 통로를 통해 전달한다. 서버는 결과 셋과 같은 것을 동일한 연결 통로를 통해 클라이언트에 전달한다. 이것
은 클라이언트 연결을 처리하는 문자 셋과 콜레션에 대해서 몇 가지 궁금한 사항을 일으키게 되는데, 각각의 것들은 시스템 변수에
의해 답을 할 수가 있게 된다.:
그 이유는 컬럼이 자체 콜레션을 가지고 있기 때문이며, 이것이 보다 우선적인 순위를 갖는 콜레션이 된다.
SET NAMES는 클라이언트가 서버에 SQL명령문을 보낼 때 사용하는 문자 셋을 가리킨다. 따라서, SET NAMES 'cp1251'은 서
버에게 “이 클라이언트로부터 오게 될 메시지는 cp1251 문자 셋을 사용한다”라는 의미를 전달 한다. 또한, 이것은 서버가 클라
이언트에 결과를 돌려 줄 때 사용하는 문자 셋을 나타내기도 한다. (예를 들면, 이것은 여러분이 SELECT 명령문을 사용할 경우 컬
럼 값을 위해 사용할 문자 셋을 가리키는 것이다.)
SET NAMES 'x' 명령문은 아래의 세 명령문과 동일한 것이다:
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;
[mysql]
default-character-set=koi8r
예문: column1이 CHAR(5) CHARACTER SET latin2 형태로 정의 되었다고 가정하자. 만일 여러분이 SET NAMES 또는
SET CHARACTER SET에 대해 지정을 하지 않는다면, SELECT column1 FROM t에 대해서는, 서버는 클라이언트가 서버에 연
결할 때 지정한 문자 셋을 사용해서 column1에 대한 모든 값을 돌려 준다. 이에 반해서, 만일 여러분이 SELECT 명령문을 입력하
기 전에 SET NAMES 'latin1' 또는 SET CHARACTER SET latin1을 입력하면, 서버는 결과를 돌려 보내기 바로 전에 latin2 값
을 latin1로 변환 시킨다. 만약에 양쪽의 문자 셋에 있지 않는 문자를 변환할 경우에는 다소 시간이 길게 걸리기도 한다.
만일 서버가 결과 셋을 변환 시키지 못하도록 하고자 한다면, character_set_results을 NULL로 설정한다:
Note: 현재까지는, UCS-2를 클라이언트의 문자 셋으로 사용할 수는 없는데, 이것은 SET NAMES 'ucs2'는 동작을 하지 않는다
는 것을 의미한다.
여러분이 접속을 할 때 사용한 문자 셋과 콜레션 시스템 변수의 값을 보고자 한다면, 아래의 명령문을 입력하면 된다:
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=10&mcate=5&scate=0&idx=17392006-08-08 오후 6:09:03
:::MySQL Korea:::
제목검색
10. 문자 셋 지원
10.5. 콜레션 이슈 COLLATE 구문을 사용하면, 여러분은 비교를 위한 디폴트 콜레션을 무시할 수 있게 된다. COLLATE 는 SQL 명령문의 다양한
• SELECT k
• FROM t1
● AS를 사용한 것:
• FROM t1
• ORDER BY k1;
• SELECT k
• FROM t1
● 집합 함수를 사용한 것:
• FROM t1;
● DISTINCT를 사용한 것:
• FROM t1;
● WHERE를 사용한 것:
• SELECT *
• FROM t1
• SELECT *
• FROM t1
● HAVING을 사용한 것:
• SELECT k
• FROM t1
• GROUP BY k
제목검색
10. 문자 셋 지원
10.5. 콜레션 이슈 COLLATE 구문은 높은 우선 순위를 가지며 (||보다 높음), 따라서 아래의 두 수식은 동일한 것이
10.5.2 COLLATE 구문 우선 순위 다:
x || y COLLATE z
x || (y COLLATE z)
http://www.mysqlkorea.com/develop/sub_07.html?lcate=10&mcate=5&scate=2&idx=17412006-08-08 오후 6:09:16
:::MySQL Korea:::
제목검색
10. 문자 셋 지원
10.5. 콜레션 이슈 BINARY 연산자는 뒤에 따라오는 스트링을 바이너리 스트링으로 캐스트(cast)한다. 이것은 문자를 비교할 때 문자 대 문자로 하
10.5.3 BINARY 연산자 지 않고 바이트 대 바이트로 비교 연산을 하게끔 하기 위한 것이다. BINARY는 또한 뒤따라 오는 스페이스가 의미를 가지도록 만든
다.
-> 1
-> 0
-> 1
-> 0
문자 컬럼 정의에 있는 BINARY 속성은 다른 효과를 갖는다. BINARY 속성을 사용해서 정의된 문자 컬럼은 컬럼의 문자 셋에 대
한 바이너리 콜레션에 할당된다. 모든 문자 셋은 바이너리 콜레션을 갖는다. 예를 들면, latin1 문자 셋에 대한 바이너리 콜레션은
latin1_bin이기 때문에, 만일 테이블의 디폴트 문자 셋이 latin1이라면, 아래의 두 컬럼 정의는 동일한 것이 된다:
CHAR(10) BINARY
컬럼 속성 형태로의 BINARY의 효과는 MySQL 4.1 이전 버전과는 서로 달라졌다. 예전에는, BINARY 의 결과로 컬럼은 바이너
리 스트링으로 취급이 되었다. 바이너리 스트링은 문자 셋 또는 콜레션이 아닌 바이트 스트링이며, 이것은 바이너리 콜레션을 갖고
있는 비-바이너리(non-binary)문자 셋과는 다른 것이다. 두 가지 타입의 스트링 모두에 대해서는, 스트링 유닛의 숫자 값 기반으
로 비교가 이루어 지지만, 비-바이너리 스트링의 경우에는 유닛이 문자이며 어떤 문자 셋은 다중 바이트 문자를 허용하기도 한다.
Section 11.4.2, “BINARY 와 VARBINARY 타입”을 참조할 것.
CHAR, VARCHAR, 또는 TEXT 컬럼 정의에서 CHARACTER SET binary를 사용하면 컬럼이 바이너리 데이터 타입으로 취급
된다. 예를 들면, 아래의 정의문은 두 개가 동일한 것이다:
BINARY(10)
VARBINARY(10)
BLOB
제목검색
10. 문자 셋 지원
10.5. 콜레션 이슈 대부분의 명령문에서는, MySQL이 비교 연산을 하기 위해서 어떤 콜레션을 사용하는지는 명확하게 나타난다. 예를 들면, 아래와
10.5.4 콜레션 결정이 애매 모호한 특별 사례들 같은 경우, 사용되는 콜레션이 컬럼x에 대한 콜레션이라는 것이 분명히 나타난다:
이 쿼리는 컬럼x의 콜레션을 사용해야 하는가? 아니면, 스트링 리터럴 'Y'의 것을 사용해야 하는가?
강제성 값에 우선 순위를 매기는 것은 MySQL 5.0.3에 추가 되었다. 5.0.3이전 버전에서는, 시스템 상수 또는 무시할 만한 강제성
이 존재하지 않는다. Functions such as USER()와 같은 함수는 3이 아닌 2의 강제성을 가지며, 리터럴은 4가 아닌 3의 강제성을
갖는다.
예문:
-> 0
-> 3
-> 4
제목검색
10. 문자 셋 지원
10.5. 콜레션 이슈 각각의 문자 셋은 하나 또는 그 이상의 콜레션을 가지고 있지만, 각각의 콜레션은 오직 하나의 문자 셋에만 연관이 된다. 따라서, 아
10.5.5 콜레션은 반드시 올바른 문자 셋용 이어야 래의 명령문은 에러를 발생 시키는데, 그 이유는 latin2_bin 콜레션이 latin1 문자 셋과는 유효하지 않기 때문이다:
한다
mysql> SELECT _latin1 'x' COLLATE latin2_bin;
http://www.mysqlkorea.com/develop/sub_07.html?lcate=10&mcate=5&scate=5&idx=17442006-08-08 오후 6:09:21
:::MySQL Korea:::
제목검색
10. 문자 셋 지원
Müller
MX Systems
MySQL
아래의 테이블은 우리가 서로 다른 콜레션을 사용해서 ORDER BY를 실행할 경우에 얻을 수 있는 결과 값의 순서를 나타내는 것이
다:
제목검색
10.6.1 결과 스트링
이번 섹션에서는 문자 셋 정보를 사용자 계정으로 가져가는 연산에 대해서 설명을 하기로 하겠
10.6.2 CONVERT() 및 CAST()
다.
10.6.3 SHOW 명령문 및 INFORMATION_SCHEMA
http://www.mysqlkorea.com/develop/sub_07.html?lcate=10&mcate=6&scate=0&idx=17492006-08-08 오후 6:09:28
:::MySQL Korea:::
제목검색
10. 문자 셋 지원
10.6. 문자 셋 지원으로 영향을 받는 연산 MySQL에는 스트링을 리턴하는 연산자와 함수가 많이 있다. 이번 섹션에서는 다음과 같은 질문에 대해서 설명을 하기로 한다: 그
스트링을 입력 받아서 스트링을 결과로 리턴하는 단순 함수의 경우, 결과의 문자 셋과 콜레션은 원래의 입력 값의 문자 셋과 콜레션
을 갖게 된다. 예를 들면, UPPER(X)는 X의 문자 스트링 및 콜레션과 동일한 형태의 스트링을 리턴한다. INSTR(), LCASE(),
LOWER(), LTRIM(), MID(), REPEAT(), REPLACE(), REVERSE(), RIGHT(), RPAD(), RTRIM(), SOUNDEX(),
SUBSTRING(), TRIM(), UCASE(), UPPER()에 대해서도 동일하다.
Note: REPLACE() 함수는, 다른 모든 함수와는 달리, 항상 스트링 입력 값의 콜레션을 무시하고 대소 문자를 구분하는 비교 연산
을 실행한다.
만일 스트링 입력 값 또는 함수 결과가 바이너리 스트링일 경우, 이 스트링은 아무런 문자 셋 또는 콜레션을 가지지 않는다. 이것은
CHARSET() 와 COLLATION() 함수로 검사할 수 있는데, 두 함수 모두 자신들의 인수가 바이너리 스트링임을 가리키기 위해
binary를 리턴한다:
+---------------------+-----------------------+
+---------------------+-----------------------+
| binary | binary |
+---------------------+-----------------------+
여러 개의 스트링 입력 값을 결합해서 하나의 스트링 결과를 리턴하는 연산의 경우에는, 표준 SQL의 “집합 규칙(aggregation
rules)”이 결과 값의 콜레션을 결정하기 위해서 적용된다:
예를 들면, CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END를 사용하면, 결과 콜레션은 X가 된다. 이것은
UNION, ||, CONCAT(), ELT(), GREATEST(), IF(), 그리고 LEAST()에도 적용이 된다.
문자 데이터를 변환하는 연산의 경우, 이 연산의 결과로 나오는 스트링의 문자 셋 및 콜레션은 character_set_connection 과
collation_connection 시스템 변수에 의해 정의가 된다. 이것은 CAST(), CHAR(), CONV(), FORMAT(), HEX(), 그리고
SPACE()에도 적용된다.
제목검색
10. 문자 셋 지원
10.6. 문자 셋 지원으로 영향을 받는 연산 CONVERT()는 서로 다른 문자 셋간의 데이터 변환을 한다. 신텍스는 다음과 같다:
예문:
스트링을 다른 문자 셋으로 변환하기 위한 방법으로 CAST()를 사용할 수도 있는데, 신텍스는 다음과 같다:
예문:
CAST() 내부에서는 COLLATE 구문을 사용하지 못 하겠지만, 외부에서는 사용이 가능하다. 즉, CAST(... COLLATE ...)는 유효
하지 않지만, CAST(...) COLLATE ... 는 사용 가능하다.
예문:
제목검색
10. 문자 셋 지원
10.6. 문자 셋 지원으로 영향을 받는 연산 몇몇 SHOW 명령문들은 추가적인 문자 셋 정보를 제공하기도 한다.이러한 명령문에는 SHOW CHARACTER SET, SHOW
COLLATION, SHOW CREATE DATABASE, SHOW CREATE TABLE 그리고 SHOW COLUMNS등이 있다. 이 섹션에서는
10.6.3 SHOW 명령문 및
INFORMATION_SCHEMA 이러한 명령문들에 대해서 간략히 설명을 할 것이며, 보다 자세한 정보를 원할 경우에는 Section 13.5.4, “SHOW 신텍스”를 참
조하기 바란다.
INFORMATION_SCHEMA에는 몇 가지 테이블이 있는데, 이것들은 SHOW 명령문이 보여주는 정보와 비슷한 것들을 가지고 있
다. 예를 들면, CHARACTER_SETS 및 COLLATIONS 테이블은 SHOW CHARACTER SET 및 SHOW COLLATION이 보여
주는 정보를 가진다. Chapter 20, “INFORMATION_SCHEMA 데이터 베이스”를 참조할 것.
SHOW CHARACTER SET 명령어는 모든 사용한 문자 셋을 보여준다. 이 명령어는 옵션으로 LIKE 구문을 가져오며, 이 구문은
매치하기 위한 문자 셋의 이름을 가리킨다. 예를 들면:
+---------+-----------------------------+-------------------+--------+
+---------+-----------------------------+-------------------+--------+
+---------+-----------------------------+-------------------+--------+
SHOW COLLATION는 사용 가능한 모든 콜레션을 리턴한다. 이 명령어는 옵션으로 LIKE 구문을 가져오며, 이 구문은 매치하기
위한 콜레션 이름을 가리킨다. 예를 들면:
+-------------------+---------+----+---------+----------+---------+
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1 | 5 | | | 0|
| latin1_danish_ci | latin1 | 15 | | | 0|
| latin1_general_ci | latin1 | 48 | | | 0|
| latin1_general_cs | latin1 | 49 | | | 0|
| latin1_spanish_ci | latin1 | 94 | | | 0|
+-------------------+---------+----+---------+----------+---------+
SHOW CREATE DATABASE는 주어진 데이터 베이스를 생성하는 CREATE DATABASE 명령문을 출력한다:
+----------
+-----------------------------------------------------------------+
+----------
+-----------------------------------------------------------------+
+----------
+-----------------------------------------------------------------+
SHOW CREATE TABLE도 유사한 결과를 보여 주지만, 주어진 테이블을 생성하기 위한 CREATE TABLE 명령문을 출력한다.
컬럼 정의문은 모든 문자 셋 상세 사양을 가리키며, 테이블 옵션은 문자 셋의 정보를 가지게 된다.
SHOW COLUMNS 명령문은 SHOW FULL COLUMNS형태로 호출을 했을 때 테이블 컬럼의 콜레션을 출력한다. CHAR,
VARCHAR, 또는 TEXT 데이터 타입을 가진 컬럼은 콜레션을 가진다. 숫자(Numeric) 및 다른 비-문자(non-character)타입은
콜레션을 갖지 않는다. 예를 들면:
Field: id
Collation: NULL
Null: NO
Key: PRI
Default: NULL
Extra: auto_increment
Privileges: select,insert,update,references
Comment:
Field: name
Type: char(60)
Collation: latin1_swedish_ci
Null: NO
Key:
Default:
Extra:
Privileges: select,insert,update,references
Comment:
제목검색
상위메뉴리스트 ◆ 10.7. 유니 코드 지원
UCS-2 (binary Unicode representation)의 경우, 모든 문자는 가장 의미가 있는 바이트를 앞에 사용하여 2-바이트 유니 코드
로 표현된다. 예를 들면: LATIN CAPITAL LETTER A는 코드 0x0041를 가지며, 이것은 2-바이트 시퀀스 형태로 저장된다:
0x00 0x41. CYRILLIC SMALL LETTER YERU (유니 코드 0x044B)는 2-바이트 시퀀스 형태로 저장된다: 0x04 0x4B. 유
니 코드 문자 및 이것의 코드에 대해서는 Unicode Home Page를 참조하기 바란다.
현재까지는, UCS-2를 클라이언트 문자 셋 형태로 사용할 수 없으며, 따라서 SET NAMES 'ucs2' 는 구동을 하지 않는다.
UTF-8 문자 셋은 유니 코드 데이터를 저장하기 위한 또 다른 방식이다. 이것은 RFC 3629에 따라서 구현이 된다. The idea of
the UTF-8 문자 셋에 대한 아이디어는 바로 다양한 유니 코드 문자들은 서로 다른 길이의 바이트 시퀀스를 사용해서 엔코딩 된다
는 것이다:
RFC 3629는 1~4바이트를 갖는 엔코딩 시퀀스를 설명한다. 현재까지는, UTF-8을 지원하는 MySQL에는 4바이트 시퀀스가 포
함되지 않고 있다.
Tip: UTF-8를 사용하는 스페이스를 저장하기 위해서는, VARCHAR를 CHAR 대신에 사용한다. 그렇지 않으면, MySQL CHAR
CHARACTER SET utf8 컬럼 안에 있는 각각의 문자에 대해서 MySQL은 3 바이트를 지정(reserve)하는데, 그 이유는 이것이
최대 가능 길이 이기 때문이다. 예를 들면, MySQL 은 CHAR(10) CHARACTER SET utf8 컬럼에 대해서는 30 바이트를 반드
시 지정(reserve)해야 한다.
제목검색
10. 문자 셋 지원 메타 데이터란 “데이터에 대한 데이터”를 의미한다. 데이터 베이스를 설명하는 모든 것-데이터 베이스의 컨텐츠에 해당하는 것
10.8. 메타 데이터를 위한 UTF-8 과는 반대로-이 메타 데이터이다. 따라서 컬럼 이름, 데이터 베이스 이름, 사용자 이름, 그리고 SHOW의 결과로 나오는 대부분의
10.8 메타 데이터를 위한 UTF-8 스트링은 메타 데이터이다. INFORMATION_SCHEMA의 테이블 컨텐츠에 대해서도 적용이 되는데, 그 이유는 이렇게 정의된 테
이블은 데이터 베이스 오브젝트에 대한 정보를 가지기 때문이다.
| character_set_system | utf8 |
+----------------------+-------+
만일 character_set_results가 NULL로 설정되어 있다면, 아무런 변환도 실행되지 않으며 서버는 자신의 원래의 문자 셋을 사용해
서 메타 데이터를 리턴한다 (character_set_system가 지정하는 문자 셋).
서버에서 클라이언트로 전달되는 에러 메시지는 메타 데이터와 함께 자동으로 클라이언트의 문자 셋으로 변환된다.
만일 여러분이 비교 연산 또는 단일 명령문 안에 있는 할당을 위해서 USER() 함수를 사용한다면, 걱정을 하지 않아도 된다.
MySQL은 이러한 것들을 자동으로 진행한다.
이것은 제대로 동작을 하는데, 그 이유는 latin1_column의 컨텐츠가 비교 연산이 실행되기 전에 자동으로 UTF-8로 변환되기 때
문이다.
이것은 제대로 동작을 하는데, 그 이유는 USER()의 컨텐츠가 할당이 이루어지지 전에 자동으로 latin1 로 변환되기 때문이다. 자
동 변환은 아직까지는 완벽하게 구현되지는 않았지만, 다음 버전에서는 정확히 구현될 예정이다.
제목검색
10. 문자 셋 지원 10.9.1. 유니 코드 문자 셋
10.9. MySQL이 지원하는 문자 셋과 콜레션 10.9.2. West European Character Sets - Skip
10.9 MySQL이 지원하는 문자 셋과 콜레션 10.9.3. Central European Character Sets - Skip
10.9.1 유니 코드 문자 셋 10.9.4. South European and Middle East Character Sets - Skip
MySQL은 30+ 문자 셋에 대해서 70+ 콜레션을 지원한다. 이번 섹션에서는 MySQL이 지원하는 문자 셋에 대해서 설명을 하기로
한다. 관련된 문자 셋의 각 그룹에는 하나씩 서브 섹션이 존재 한다. 각 문자 셋의 경우, 사용 가능한 콜레션이 리스트로 제공된다.
제목검색
상위메뉴리스트 ◆ 10.9.1. 유니 코드 문자 셋
10. 문자 셋 지원
10.9. MySQL이 지원하는 문자 셋과 콜레션 MySQL은 두 개의 유니 코드 문자 셋을 가지고 있다. 여러분은 이 문자 셋을 사용해서 약 650개의 언어로 된 텍스트를 저장할 수
10.9.1 유니 코드 문자 셋 가 있다.
❍ ucs2_turkish_ci
❍ ucs2_unicode_ci
● utf8 (UTF-8 유니코드) 콜레션:
❍ utf8_bin
❍ utf8_czech_ci
❍ utf8_danish_ci
❍ utf8_esperanto_ci
❍ utf8_estonian_ci
❍ utf8_general_ci (디폴트)
❍ utf8_hungarian_ci
❍ utf8_icelandic_ci
❍ utf8_latvian_ci
❍ utf8_lithuanian_ci
❍ utf8_persian_ci
❍ utf8_polish_ci
❍ utf8_roman_ci
❍ utf8_romanian_ci
❍ utf8_slovak_ci
❍ utf8_slovenian_ci
❍ utf8_spanish2_ci
❍ utf8_spanish_ci
❍ utf8_swedish_ci
❍ utf8_turkish_ci
❍ utf8_unicode_ci
utf8_unicode_ci 콜레션을 구현한다. 이 콜레션은 버전-4.0.0 UCA 웨이트 키(weight keys)를 사용하고 있다: http://www.
unicode.org/Public/UCA/4.0.0/allkeys-4.0.0.txt. 아래의 섹션은 utf8_unicode_ci의 사용에 대해서 설명을 하고 있지만,
ucs2_unicode_ci에 대해서도 적용이 된다.
현재의 버전까지는, utf8_unicode_ci 콜레션은 아직까지는 UCA를 부분적으로만 지원하며, 몇몇 문자들은 아직까지 지원되지 않
고 있다. 또한, 결합 마크(combining marks)는 전체적으로 지원되지 않는다.
utf8_unicode_ci의 가장 중요한 특징은 이것이 확장자(expantion)을 지원한다는 것이다; 즉, 하나의 문자가 여러 문자의 조합과
동일하게 비교가 될 때. 예를 들면, 독일어와 몇몇 다른 언어에서는 ‘ß’는 ‘ss’과 동일한 것이다.
utf8_general_ci는 확장자를 지원하지 않는 레가시 콜레션(legacy collation)이다. 이것은 문자간에 일대일 비교만을 실행한다. 이
것이 It can make only one-to-one comparisons between characters. This means that comparisons for the
utf8_general_ci 콜레션에 대한 비교가 보다 빠르다는 것을 의미하지만, 정확도는 utf8_unicode_ci 보다 다소 떨어진다.
Ä=A
Ö=O
Ü=U
ß=s
ß = ss
MySQL은 utf8_unicode_ci를 사용하는 순서화(ordering)이 어떤 언어에 대해서 올바르게 동작하지 않는 경우에만 utf8 문자 셋
에 대한 언어-관련 콜레션을 구현한다. 예를 들면, utf8_unicode_ci는 독일어 및 프랑스어에 대해서는 잘 동작을 하기 때문에, 이
두 언어에 대해서는 특별한 utf8 콜레션을 생성할 필요가 없게 된다.
제목검색
10.9.7 아시아 문자 셋
아시아 문자 셋에는 중국어, 일본어, 한국어, 그리고 태국어 지원이 포함되어 있
다.
제목검색
11 데이터 타입 11.1.1. 숫자 타입 개요
MySQL은 스파샬(spatial) 데이터를 처리하기 위한 확장도 지원을 한다. Chapter 16, Spatial Extensions을 참조하여 스
파샬 데이터에 대해서 보다 자세한 정보를 얻기 바란다.
제목검색
11.1 데이터 타입 개요 요
11.1.3 스트링 타입 개요 값
http://www.mysqlkorea.com/develop/sub_07.html?lcate=11&mcate=1&scate=0&idx=17842006-08-08 오후 6:10:34
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆ 11.1.1. 숫자 타입 개요
11. 데이터 타입
11.1. 데이터 타입 개요 이 섹션에서는 숫자 데이터 타입에 대해서 간략히 설명을 할 예정이며, 보다 자세한 정보를 얻고자 한다면 Section 11.2, “숫자 타
11.1.1 숫자 타입 개요 입”을 참조하기 바란다. 스토리지 요구 사항에 대해서는 Section 11.5, “데이터 타입 스토리지 요구 사항”을 참조하기 바란다.
만일 여러분이 숫자 컬럼에 대해서 ZEROFILL을 지정하면, MySQL은 자동으로 UNSIGNED 속성을 컬럼에 추가한다.
정수 컬럼의 정의에서의 SERIAL DEFAULT VALU는 NOT NULL AUTO_INCREMENT UNIQUE의 별칭이다.
● BIT[(M)]
매우 작은 정수. 부호 범위는 -128에서 127까지 이다. 부호가 없다면 범위는 0에서 255까지 이다.
● BOOL, BOOLEAN
중간 크기의 정수. 부호가 있으면 -8388608 에서 8388607까지 이고, 부호가 없다면 0 에서 16777215까지 임.
여 약간 작게 된다.
M은 전체 자릿 수이고 D는 소수점 뒷자리를 가리킨다. 만일 M 과 D가 생략되면, H/W가 허용하는 범위로 값을 저장한다.
이중 정밀도 부동 소수점 숫자는 대략 15개의 십진 자리수를 갖는다.
UNSIGNED를 지정 하면, 음수 값을 허용하지 않는다.
이 타입은 DOUBLE과 동의어다. 예외 사항: 만일 REAL_AS_FLOAT SQL 모드를 활성화 하면, REAL은 DOUBLE이 아
니라, FLOAT에 대한 동의어가 된다.
부동 소수점 숫자. p 는 비트 정밀도를 가리키지만, MySQL은 결과 데이터 타입으로 FLOAT 또는 DOUBLE을 사용할 지
를 결정할 때에만 이 값을 사용한다. 만일 p 가 0 에서 24 사이라면, 데이터 타입은 아무런 M 또는 D 값을 사용하지 않는
FLOAT가 된다. 만일 p 가 25 에서 53 사이의 값이라면, 데이터 타입은 아무런 M 또는 D 값을 사용하지 않는 DOUBLE
이 된다. 결과 컬럼의 범위는 단일 정밀도 FLOAT 또는 이중 정밀도 DOUBLE 데이터 타입에 대한 것과 동일하다.
FLOAT(p) 신텍스는 ODBC와의 호환성을 위해 제공된 것이다.
테이블에 있는 DECIMAL 컬럼에 대한 서버의 동작은 테이블을 생성한 MySQL 버전에 의존한다. 만일 서버가 MySQL
5.0.3 또는 그 이상 버전이기는 하지만, 테이블에 있는 DECIMAL 컬럼이 5.0.3 이전에 생성된 것이라면, 이전 버전의 특
징이 이 컬럼에 적용된다. 테이블을 새로운 버전의 DECIMAL 포멧으로 변환 시키고자 한다면, mysqldump을 사용해서
덤프를 하고 이것을 다시 읽어 온다.
위의 타입들은 DECIMAL과 동의어다. FIXED 동의어는 다른 데이터 베이스 시스템과의 호환을 위해서 사용하는 것이다.
제목검색
상위메뉴리스트 ◆ 11.1.2. 날짜 및 시간 타입 개요
11. 데이터 타입
11.1. 데이터 타입 개요 임시 데이터 타입에 대한 개요는 아래와 같다. 보다 자세한 정보는, Section 11.3, “날짜 및 시간 타입”을 참조하기 바란다. 스토
11.1.2 날짜 및 시간 타입 개요 리지에 대한 요구 사항은 Section 11.5, “데이터 타입 스토리지 요구 사항”를 참조하기 바란다.
DATETIME 및 DATE 범위 설명에 있어서, “지원됨(supported)”은 비록 이전의 값들이 제대로 동작을 할 지라도, 현재로는 아
무런 보증도 하지 않음을 의미한다.
SUM() 및 AVG() 집합 함수는 임시 값들과는 동작을 하지 않는다. (이 함수들은 값을 숫자로 변환시키는데, 첫 번째로 나오는 숫
자가 아닌 문자 다음의 부분을 잃게 된다.) 이러한 문제를 해결하기 위해서는,숫자 유닛을 변환 시킨 다음, 집합 연산을 실행하고,
이것을 다시 임시 값으로 변환 시키면 된다. 예를 들면:
● DATE
● DATETIME
● TIMESTAMP[(M)]
Note: 4.1 버전 이전에 사용된 TIMESTAMP 포맷은 MySQL 5.0 에서는 지원되지 않는다; 구형 버저에 관한 정보는
MySQL 3.23, 4.0, 4.1 Reference Manual 을 참조하기 바람.
● TIME
● YEAR[(2|4)]
제목검색
11. 데이터 타입
11.1. 데이터 타입 개요 스트링 데이터 타입에 대한 개요는 아래와 같다. 보다 자세한 정보는 Section 11.4, “스트링 타입”을 참조하기 바란다. 스토리지
11.1.3 스트링 타입 개요 에 대한 요구 사항은 Section 11.5, “데이터 타입 스토리지 요구 사항”를 참조하기 바란다.
몇몇 경우에는, MySQL은 스트링을 CREATE TABLE 또는 ALTER TABLE 명령문에서 주어지는 타입과 다른 형태로 스트링 컬
럼을 변경 시키기도 한다. Section 13.1.5.1, “Silent Column Specification Changes”을 참조 바람.
MySQL 4.1 및 이후 버전의 경우, 스트링 데이터 타입은 아래와 같이 이전 버전에서는 접해보지 못한 특성을 가지고 있다.:
● 많은 수의 스트링 데이터 타입에 대한 컬럼 정의가 문자 셋을 지정하기 위한 CHARACTER SET 속성을 가지고 있다.
(CHARSET 는 CHARACTER SET과 동의어 임.) COLLATE 속성은 문자 셋에 대한 콜레션을 지정한다. 이러한 속성들
은 CHAR, VARCHAR, TEXT, ENUM, 그리고 SET에 적용된다. 예를 들면:
• CREATE TABLE t
• (
• );
● MySQL 5.0 은 문자 유닛의 문자 컬럼 정의문에 있는 길이 지정문을 해석한다. (이전 버전은, MySQL 길이를 바이트 단위
로 해석한다.)
● CHAR, VARCHAR, 그리고 TEXT 타입의 경우, BINARY 속성은 컬럼이 컬럼 문자 셋의 바이너리 콜레션에 할당되도록
한다. (이전 버전의 경우, BINARY는 컬럼이 바이너리 스트링을 저장하도록 한다.)
● 문자 컬럼에 대한 정렬 및 비교는 컬럼에 할당된 문자 셋을 기반으로 한다. (이전 버전의 경우, 정렬 및 비교는 서버의 문자
셋 콜레션을 기반으로 하였다.) CHAR 및 VARCHAR 컬럼의 경우, 여러분은 컬럼을 바이너리 콜레션 또는 BINARY 속성
으로 선언해서 정렬 및 비교가 어휘 순서가 아닌 문자 코드 값으로 실행되도록 만들 수가 있다.
ERROR 1074 (42000): Column length too big for column 'col' (max = 255);
CHAR는 CHARACTER의 축약 형이다. NATIONAL CHAR (또는 축약 형, NCHAR)는 CHAR 컬럼이 미리 정의된 문
자 셋을 사용하도록 정의하기 위해 사용하는 표준 SQL 방식이다.
BINARY 속성은 컬럼 문자 셋에 대한 바이너리 콜레션을 지정하기 위한 축약 형이다. 이와 같은 경우, 정렬 및 비교는 숫
자 문자 값(numeric character value)에 기반을 한다.
CHAR BYTE 데이터 타입은 BINARY 타입에 대한 축약 형이다. 이것은 향후의 호환성을 위한것이다.
MySQL은 여러분이 CHAR(0) 타입의 컬럼을 생성하는 것을 허용한다. 이것은 실제로는 존재하기는 하지만 그 값을 실제
로 사용하지 않는 컬럼을 근간으로 하는 이전(old) 어플리케이션과 호환성을 유지해야 하는 경우에 특히 유용하다. CHAR
(0)는 두 가지의 값만을 가지는 컬럼이 필요할 경우에도 유용하다: NOT NULL 형태로 정의되지 않은 하나의 컬럼
CHAR(0) 컬럼은 오직 1 비트만을 NULL 및 '' (the empty string)만을 가질 수 있다.
● CHAR
CHAR(1)과 동의어 임.
변수-길이 스트링. M 은 최대 컬럼 길이를 나타낸다. MySQL 5.0에서는, M 의 범위가 5.0.3 버전 까지는 0 에서 255까
지 이고, 5.0.3 및 그 이후 버전에서는 0 에서 65,535 까지다. (MySQL 5.0의 실제 VARCHAR 최대 길이는 여러분이 사
용하는 최대 열 길이 및 문자 셋을 사용해서 알아볼 수가 있다. MySQL 5.0.3에서의 최대 유효 길이는 65,532 바이트이
다.)
MySQL 5.0.3 이전 버전의 경우, 255 보다 길게 정의된 VARCHAR 컬럼은 주어진 길이를 가질 수 있는 가장 작은
TEXT 타입으로 변환 되었다. 예를 들면, VARCHAR(500)은 TEXT으로 변환 되었고, 그리고 VARCHAR(200000)는
MEDIUMTEXT로 변환 되었다. 이것은 향후의 호환성을 위한 것이지만, 이러한 변환으로 인해 뒤에 따라오는 스페이스
가 제거되었다.
VARCHAR 값은 필요한 만큼 많은 문자를 사용해서 저장되며, 길이를 기록하기 위해 1 바이트가 추가된다 (255보다 길
게 선언된 컬럼의 경우에는 1 바이트가 추가 됨).
● BINARY(M)
BINARY 타입은 CHAR 타입과 유사하지만, 비-바이너리 문자 스트링이 아닌 바이너리 바이트 스트링으로 저장을 한다.
● VARBINARY(M)
VARBINARY 타입은 VARCHAR 타입과 유사하지만, 비-바이너리 문자 스트링이 아닌 바이너리 바이트 스트링으로 저
장된다.
● TINYBLOB
● TINYTEXT
● BLOB[(M)]
● TEXT[(M)]
● MEDIUMBLOB
● MEDIUMTEXT
● LONGBLOB
4,294,967,295 또는 4GB (232 – 1) 바이트의 최대 길이를 사용하는 BLOB 컬럼. LONGBLOB 컬럼의 최대 유효 길이
는 클라이언트/서버 프로토콜에서 구성되어 있는 최대 패킷 크기와 사용 가능한 메모리의 크기에 달려 있다.
● LONGTEXT
4,294,967,295 또는 4GB (232 – 1) 문자 최대 길이를 사용하는 TEXT 컬럼. column with a maximum length of.
The maximum effective (permitted) length of LONGTEXT 컬럼의 최대 유효 길이는 클라이언트/서버 프로토콜에서
구성되어 있는 최대 패킷 크기와 사용 가능한 메모리의 크기에 달려 있다.
● ENUM('value1','value2',...)
● SET('value1','value2',...)
셋(set). 0(zero) 또는 그 이상의 값을 가질 수 있는 스트링 오브젝트로써, 각각의 값은 'value1', 'value2', ... 리스트에서
선택되어야 한다. SET 컬럼은 최대 64개의 요소(members)로 구성될 수 있다. SET 값은 내부적으로는 정수 값이다.
제목검색
11. 데이터 타입
11.1. 데이터 타입 개요 데이터 타입 지정문에 있는 DEFAULT value 구문은 컬럼의 디폴트 값을 나타낸다. 한 가지 예외적인 것은, 디폴트 값이 반드시 상
11.1.4 데이터 타입 디폴트 값 수이어야 한다는 점이다; 함수 또는 수식이 되지는 못한다. 이것은, 데이터 컬럼에 대한 디폴트로 NOW() 또는 CURRENT_DATE
와 같은 함수를 설정할 수 없다는 것을 의미한다. 예외적으로는,
MySQL 5.0.2 이전에서는, 만일 컬럼 정의문에 아무런 DEFAULT 값도 명확하게 포함되지 않았다면, MySQL은 아래과 같이 디
폴트 값을 결정한다:
만일 컬럼이 그 값으로 NULL을 가진다면, 그 컬럼은 명확한 DEFAULT NULL 구문을 가지고서 정의 된다.
만일 컬럼이 그 값으로 NULL 을 가질 수 없다면, MySQL은 defines the column with an explicit DEFAULT 구문을 사용해서
그 컬럼을 정의하는데, 이때에는 해당 컬럼의 데이터 타입에 대한 디폴트 값을 암묵적으로 사용하게 된다. 암묵적인 디폴트
(Implicit defaults)는 아래와 같이 정의된다:
MySQL 5.0.2까지는, 만일 컬럼 정의문이 아무런 DEFAULT 값도 가지고 있지 않으면, MySQL 은 아래와 같은 방식으로 디폴트
값을 결정한다:
만일 컬럼이 그 값으로 NULL을 가질 수 있다면, 컬럼은 명확한 DEFAULT NULL 구문을 사용해서 정의된다. 이것은 5.0.2 이전
버전과 동일하다.
만일 컬럼이 그 값으로 NULL을 가질 수 없다면, MySQL은 어떠한 DEFAULT 구문도 사용하지 않고 컬럼을 정의한다. 데이터 엔
트리의 경우, 만일 INSERT 또는 REPLACE 명령문이 컬럼에 대해서 어떠한 값도 가지지 않는다면, MySQL은 그 시점에서 효과
를 미치는 SQL 모드에 따라서 그 컬럼을 처리한다:
● 만일 스트릭트(strict) SQL 모드가 활성화 되지 않았다면, MySQL은 컬럼 데이터 타입에 대해서는 암묵적인 디폴트 값을
설정한다.
● 만일 이 모드가 활성화 되었다면, 트랙젝셔널 테이블에 대해서는 에러가 발생하고 명령문은 롤백(roll backed) 된다. 비 트
랙젝셔널 테이블의 경우는, 에러가 발생하기는 하지만, 만일 다중-열 명령문의 서브 시퀀트에 대해서 또는 두 번째에 에러
가 발생하는 경우에는, 앞에 있는 열이 삽입된다.
이와 같은 경우, i 는 어떠한 디폴트도 가지지 않으며, 따라서 스트릭트 모드에서는 아래의 명령문들은 각각 에러가 발생하고 어떠
한 열도 삽입이 되지 않는다. 스트릭트 모드를 사용하지 않을 경우에는, 세 번째 명령문만이 에러를 발생한다; 암묵적인 디폴트는
처음 두 개의 명령문에서만 삽입되지만, 세 번째 명령문에서는 실패하게 되는데, 그 이유는 DEFAULT(i) 가 값을 만들지 못하기
때문이다:
주어진 테이블의 경우, 어떤 컬럼이 SHOW CREATE TABLE 명령문을 사용하면, 어떤 컬럼이 명확한 DEFAULT 구문을 가지고
있는지를 볼 수가 있다.
제목검색
상위메뉴리스트 ◆ 11.2. 숫자 타입
11. 데이터 타입 MySQL은 표준 SQL의 모든 숫자 데이터 타입을 지원한다. 이러한 타입에는 정확한 숫자 데이터 타입 (INTEGER, SMALLINT,
11.2. 숫자 타입 DECIMAL, 그리고 NUMERIC) 뿐만 아니라, 대략적인 숫자 데이터 타입 (FLOAT, REAL, 그리고 DOUBLE PRECISION)도 포
11.2 숫자 타입 함된다. 키워드 INT는 INTEGER의 동의어 이며, 키워드 DEC는 DECIMAL과 동의어 이다. 숫자 타입 스토리지 요구 사항에 대해
서는, Section 11.5, “데이터 타입 스토리지 요구 사항”를 참조할 것.
MySQL 5.0.3 이후에는, BIT 데이터 타입을 사용해서 비트-필드 값을 저장할 수가 있게 되었다. (5.0.3 이전에서는, MySQL은
BIT을 TINYINT(1) 형태로 해석했다.) MySQL 5.0.3의 경우, BIT는 MyISAM에 대해서만 지원을 한다. MySQL 5.0.5에서는
BIT가 MEMORY, InnoDB, 그리고 BDB를 지원하도록 확장되었다.
표준 SQL 의 확장 형태로서, MySQL 은 정수 타입도 함께 지원을 한다: TINYINT, MEDIUMINT, 그리고 BIGINT. 아래의 테이
블은 각각의 정수 타입을 위한 요구 사항 및 범위를 나타내고 있다.
(Signed/Unsigned) (Signed/Unsigned)
0 255
0 65535
0 16777215
0 4294967295
0 18446744073709551615
타입에 대한 베이스 키워드에 따라 나오는 괄호에 있는 정수의 출력 폭을 지정하기 위한 옵션을 MySQL은 추가로 지원한다 (예를
들면, INT(4)).
모든 정수 타입은 옵션(비 표준) 속성인 UNSIGNED을 가진다. 여러분이 컬럼 안에는 음수가 아닌 값만을 허용하고자 하고 그러
한 컬럼에 대해서는 보다 큰 상위 숫자 범위를 사용하고자 할 경우에 부호화 되지 않은 값(unsigned value)를 사용할 수 있다. 예
를 들면, 만일 INT 컬럼이 UNSIGNED라면, 이 컬럼의 범위는 동일한 크기를 갖지만 -2147483648 과 2147483647 에서 0 과
4294967295로 변경된다.
부동 소수점 및 고정 소수점 타입 역시 UNSIGNED가 될 수 있다. 정수 타입과 함께 사용되기 때문에, 이 속성은 음수 값을 컬럼에
저장할 수 없도록 한다. 하지만, 정수 타입과는 달리, 컬럼의 상위 범위(upper range)는 동일한 범위를 갖는다.
만일 여러분이 숫자 컬럼에 대해서 ZEROFILL을 지정하면, MySQL은 자동으로 UNSIGNED 속성을 컬럼에 추가한다.
부동 소수점 데이터 타입의 경우, MySQL은 단일-정밀도(single-precision) 값에 대해서는 4 바이트를 사용하고 이중-정밀도
(double-precision) 값에 대해서는 8 바이트를 사용하게 된다.
FLOAT 및 DOUBLE 데이터 타입은 대략의 숫자 데이터 값을 표시하기 위해 사용된다. FLOAT 의 경우, 표준 SQL은 괄호 안에
있는 키워드 FLOAT 다음에 비트 단위로 정밀도를 표시할 수 있는 옵션을 허용한다. MySQL 역시 이러한 옵션 정밀도 표현을 허
용하지만, 정밀도 값은 스토리지의 크기를 알아보기 위해서만 사용된다. 0 에서 23까지의 정밀도는 4 바이트 단일 정밀도 FLOAT
컬럼을 나타내며, 24에서 53까지는 8 바이트 이중 정밀도 DOUBLE 컬럼을 나타낸다.
MySQL은 DOUBLE을 DOUBLE PRECISION (비 표준적인 확장임)의 동의어로 취급한다. MySQL은 REAL_AS_FLOAT SQL
모드가 활성화 되어 있지 않는 한, REAL도 DOUBLE PRECISION (비 표준적인 확장임)의 동의어로 함께 취급한다.
이식성을 최대로 하기 위해서, 대략의 숫자 데이터 값에 대한 스토리지를 요구하는 코드는 어떠한 정밀도 또는 자릿수를 사용하지
않고 FLOAT 또는 DOUBLE PRECISION을 사용해야 한다.
DECIMAL 및 NUMERIC 데이터 타입은 정확한 숫자 값을 저장하기 위해 사용된다. MySQL의 경우, NUMERIC은 DECIMAL 형
태로 구현된다. 이러한 타입들은 정확한 정밀도를 유지해야 하는 경우, 예를 들면 통화 데이터와 같은 것을 저장하는데 사용된다.
MySQL 5.0.3 이후에는, DECIMAL 과 NUMERIC 값은 바이너리 포맷으로 저장된다. 이전 버전에서는, 이러한 값들은 스트링으
로 저장되었으며, 각각의 자리 값은 하나의 단어, 소수점(크기가 0 보다 큰 경우), 그리고 ‘-’ 부호를 사용하였다 (음수인 경
우). Chapter 21, Precision Math를 참조.
DECIMAL 또는 NUMERIC 컬럼을 선언할 때에는, 정밀도 및 스케일 (scale)를 지정할 수 있다; 예를 들면:
salary DECIMAL(5,2)
위의 예문의 경우, 5 는 정밀도이며 2 는 스케일을 나타낸다. 정밀도(precision)는 의미를 갖는 자릿수를 나타내며, 스케일(scale)
은 소수점 다음에 나오는 자릿수를 나타낸다. 만일 스케일이 0 이면, DECIMAL 과 NUMERIC 값은 소수점 또는 분수 부분을 갖
지 않는다.
표준 SQL은 salary 컬럼이 모든 값을 저장할 때 5 자리와 소수 자리를 2개 사용하도록 한다. 따라서, 이와 같은 경우, 값의 범위는
salary 컬럼에 저장되는 값의 범위는 -999.99 에서 999.99까지가 된다. MySQL은 MySQL 5.0.3 에서 이 형태를 구현했다.
5.0.3 이전에는, 양수 범위의 끝에서, 컬럼은 실제로 9999.99까지의 숫자를 저장하였다.
표준 SQL의 경우, 신텍스 DECIMAL(M)은 DECIMAL(M,0)과 동일하다. 비슷하게, 신텍스 DECIMAL은 DECIMAL(M,0)과 동
일하다. MySQL은 DECIMAL 과 NUMERIC 신텍스에 대한 위의 두 가지 형태 모두를 지원한다. M 의 디폴트는 10이다.
DECIMAL 또는 NUMERIC의 최대 가능 자릿수는 65 (MySQL 5.0.3 에서 5.0.5까지는 64). MySQL 5.0.3 이전의 경우,
DECIMAL 및 NUMERIC 값의 최대 범위는 DOUBLE과 동일하지만, 주어진 DECIMAL 또는 NUMERIC 컬럼에 대한 실제 범위
는 주어진 컬럼의 정밀도 또는 스케일에 의해 제한을 받는다. 이러한 컬럼이 소수점 다음에 지정된 스케일 보다 큰 값을 할당 받는
경우에는, 그 값은 해당 스케일로 변환된다.
MySQL 5.0.3 이후에는, BIT 데이터 타입은 비트-필드(bit-field) 값을 저장하는데 사용된다. BIT(M) 타입은 allows for
storage of M-비트 값에 대한 스토리지를 허용한다. M 은 1 에서 64까지 범위를 가질 수 있다.
비트 값을 지정하기 위해서는, b'value' 수식을 사용할 수 있다. value 는 0과 1을 사용해서 작성된 바이너리 값이다. 예를 들면,
b'111' 과 b'100000000'은 7 과 128을 각각 나타낸다. Section 9.1.5, “Bit-Field Values”를 참조할 것.
만일 여러분이 M 비트 크기보다 작은 값을 BIT(M) 컬럼에 할당 한다면, 그 값의 왼쪽에는 0이 채워진다. 예를 들면, b'101'을 BIT
(6) 컬럼에 할당하는 것은, b'000101'과 동일한 효과를 나타낸다.
데이터 타입의 허용 범위를 벗어나는 숫자 컬럼에 값을 저장하도록 할 경우에는, MySQL은 그 시점에 효력을 발생하는 SQL 모드
에 따라서 행동을 한다. 예를 들면, 만일 어떠한 SQL 모드도 활성화 되지 않았다면,
MySQL은 그 값을 범위내의 적당한 끝자리에 갖다 놓는다. 하지만, 만일 모드가 TRADITIONAL로 설정되어 있다면, MySQL은
범위 밖의 값은 거부하고 에러를 발생시키며, SQL 표준에 따라서 실패를 삽입한다.
제목검색
상위메뉴리스트 ◆ 11.3. 날짜 및 시간 타입
MySQL 5.0.2부터는, MySQL은 유효하지 않은 날짜를 입력할 경우에 경고 또는 에러가 발생한다. SQL 모드에 적당한 값
을 설정하면, 여러분은 MySQL이 지원하도록 하고자 하는 날짜 타입을 정확히 지정할 수 있다. (Section 5.2.5, “서버
SQL 모드”를 참조.) ALLOW_INVALID_DATES SQL 모드를 사용하면, MySQL이 특정 날짜, 예를 들면 '1999-11-
31'와 같은 날짜를 수용할 수 있도록 할 수가 있다. (5.0.2 이전 버전의 경우, 이러한 모드는 MySQL의 디폴트였음.) 이것
은 사용자가 향후에 있을 프로세싱에 대해서 데이터 베이스 내에 지정한 (예를 들면, 웹 형태에서) “틀릴 가능성이 있는”
값으 저장하고자 할 때 유용하다. 이러한 모드 아래에서는, MySQL은 달(month)이 0에서 12 사이의 범위에 있는지 그리
고 날짜가 0에서 31 사이에 존재하는지 만을 검증한다. 이러한 범위에는 0이 포함 되어 있는데, 그 이유는 MySQL은
DATE 또는 DATETIME 컬럼에 일자 또는 달에 해당하는 값으로 0을 저장할 수 있도록 하기 때문이다. 이것은 여러분이
정확한 날짜를 모르는 날짜를 저장할 필요가 있는 어플리케이션에 대해서 매우 유용하다. 이와 같은 경우, 여러분은 날짜를
'1999-00-00' 또는 '1999-01-00' 형태로 저장하기만 하면 된다. 만일 여러분이 이와 같은 값을 저장한다면, 완벽한 날
짜를 요구하는 DATE_SUB() 또는 DATE_ADD 와 같은 함수에 대해서는 정확한 값을 얻어낼 수가 없을 것이다. (만일 날
짜 값으로 0 을 허용하고 싶지 않을 경우에는, NO_ZERO_IN_DATE SQL 모드를 사용하면 된다).
MySQL은 또한 “더미 날짜(dummy date)로써 '0000-00-00' 을 저장할 수 있게도 한다 (만일 NO_ZERO_DATE SQL
모드를 사용하지 않는 다면). 이것은 어떤 경우에는 (날짜와 인덱스에서 스페이스를 덜 사용한다) NULL 값을 사용하는 것
보다 더욱 편리할 때도 있다.
DATE '0000-00-00'
TIME '00:00:00'
YEAR 0000
제목검색
11.3. 날짜 및 시간 타입
11.3.1 DATETIME, DATE, 그리고 TIMESTAMP 타입 DATETIME, DATE, 그리고 TIMESTAMP 타입들은 서로 관련이 있다. 이 섹션에서는 이러한 타입들의 특성과, 서로가
얼마나 유사한지, 그리고 다른 점은 어떤 것이 있는지에 대해서 설명하기로 한다.
11.3.1.1 MySQL 4.1 버전까지의 TIMESTAMP 특성
DATE 타입은 날짜 값만을 필요로 할 때 사용되는데, 여기에는 시간 부분이 없다. MySQL은 DATE 값을 'YYYY-MM-
DD' 포맷으로 추출해서 출력한다. 지원되는 범위는 '1000-01-01' 에서 '9999-12-31'까지 이다.
TIMESTAMP 데이터 타입은 다양한 특성을 가지고 있는데, MySQL 버전과 서버가 구동 중에 있는 SQL 모드에 따라 다르
다. 이러한 특성들은 이 섹션 후반부에 설명하기로 한다.
여러분은 포맷의 공통 셋(common set)을 사용해서 DATETIME, DATE, 그리고 TIMESTAMP 값을 지정할 수가 있다:
구분 문자가 없는 스트링 형태로 지정된 값은 주어진 길이를 사용해서 해석된다. 만일 그 스트링이 8 또는 14 문자 길이를
갖는다면, 연도는 처음의 4 자리 문자라고 가정을 한다. 그렇지 않을 경우, 연도는 처음 두 자리의 문자로 주어졌다고 간주된
다. 스트링은 왼쪽에서 오른쪽으로 연도, 월, 일, 시간, 분, 초 값으로 해석을 한다. 이것이 의미하는 것은 여러분이 6 보다 작
은 문자 길이의 스트링을 사용할 수 없다는 것이다. 예를 들면, 만일 여러분이 '9903'을 지정해서 March, 1999을 나타낸다
고 한다면, MySQL은 “0 (zero)”의 날짜 값을 테이블에 삽입한다. 이것은 연도와 월 값이 각각 99와 03이기는 하지만,
날짜 부분이 완벽하게 빠져 있기 때문에, 날짜에 해당하는 값은 유효하지가 않게 된다. 하지만, 여러분은 월 또는 날짜 부분
을 생략하기 위해서 0 값을 명확하게 지정할 수가 있다. 예를 들면, '990300'을 사용해서 0 값을 '1999-03-00'에 삽입 시
킬 수가 있다.
제목검색
11. 데이터 타입
11.3. 날짜 및 시간 타입 Note: 이전 버전의 MySQL (4.1 이전 버전)의 경우, TIMESTAMP 데이터 타입의 특성들은 이 섹션에서 설명한 것들과 여러 가
11.3.1 DATETIME, DATE, 그리고 지 부분에서 많은 차이점을 가지고 있다. 따라서, 만일 이전 버전의 TIMESTAMP 데이터를 MySQL 5.0에서 동작되도록 변환 시
TIMESTAMP 타입 키고자 한다면, MySQL 3.23, 4.0, 4.1 Reference Manual 을 참조하기 바란다.
TIMESTAMP 컬럼은 DATETIME 컬럼과 동일한 포맷으로 출력된다. 다른 말로 표현하면, 출력 폭은 19 문자 길이로 고정되며,
그리고 포맷은 YYYY-MM-DD HH:MM:SS와 같다.
MySQL서버는 또한 MAXDB SQL 모드를 활성화 시킨 상태에서도 동작을 한다. 이 모드가 활성화 된 채로 서버를 구동하게 되면,
TIMESTAMP는 DATETIME과 동일하게 된다. 즉, 만일 어떤 테이블을 생성하는 시점에 이 모드가 활성화 되어 있다면,
TIMESTAMP 컬럼은 DATETIME 컬럼 형태로 생성이 된다. 그 결과, 그러한 컬럼은 DATETIME 출력 포맷을 사용하며, 동일
한 범위를 가지고, 그리고 현재(current) 날짜 및 시간을 자동으로 초기화 또는 업데이트하지 않게 된다.
MAXDB 모드를 활성화 시키기 위해서는, 서버 스타트 업 시점에 --sql-mode=MAXDB 서버 옵션을 사용해서 서버 SQL 모드
모드를 MAXDB로 설정하거나 또는 서버가 구동 중에 있을 때에 글로벌 sql_mode 변수를 아래와 같이 설정해 주면 된다:
클라이언트는 자신의 연결을 위해서 아래와 같이 서버가 MAXDB 모드로 동작을 하게끔 만들 수가 있다:
아래에서 설명하는 내용은 MAXDB 모드가 활성화된 상태로 생성되지 않은 테이블의 TIMESTAMP 컬럼에만 해당하는 것임을 알
아야 하는데, 그 이유는 그러한 컬럼들은 DATETIME 컬럼 형태로 생성되기 때문이다.
MySQL 5.0.2 버전 현재, MySQL은 날짜 또는 월 컬럼에 0을 가지고 있는 타임 스탬프 값 또는 유효한 날짜를 가지고 있지 않는
값을 허용하지 않는다. 이 규칙에서 유일한 예외 사항은 특별 값 '0000-00-00 00:00:00' 뿐이다.
여러분은 자동 TIMESTAMP 초기화 (initialization)와 갱신이 발생할 때 그리고 아래와 같은 동작을 하는 컬럼에 대해서는 신중
하게 처리해야 한다:
● 테이블에 있는 하나의 TIMESTAMP 컬럼에 대해서는, 디폴트 값으로 현재(current) 타임 스탬프를 할당할 수 있고 자
동-업데이트 값을 할당할 수가 있다. 현재의 타입 스탬프를 컬럼 초기화를 위한, 자동-업데이트를 값을 위한, 그리고 양
쪽 모두를 위한 디폴트 값으로 만들 수가 있다. 현재의 타입 스템프를 하나의 컬럼에 대해서는 디폴트 값으로 하고 다른 컬
럼에 대해서는 자동-업데이트 값으로 만들 수는 없다.
● 현재의 날짜 및 시간에 대해서 자동으로 초기화를 하거나 업데이트를 하기 위해 특정 TIMESTAMP 컬럼을 지정하는 것
은 가능하다. 이것은 맨 처음의 TIMESTAMP 컬럼을 사용할 필요는 없다.
● 만일 DEFAULT 값이 테이블에 있는 맨 처음의 TIMESTAMP 컬럼에 대해서 지정이 되었다면, 이것은 무시할 수가 없다.
디폴트는 CURRENT_TIMESTAMP 또는 상수 날짜 및 시간 값이 될 수 있다.
● DEFAULT NULL은 맨 처음의 TIMESTAMP 컬럼에 대해서는 DEFAULT CURRENT_TIMESTAMP과 동일하다. 다
른 모든 TIMESTAMP 컬럼에 대해서는, DEFAULT NULL은 DEFAULT 0 형태로 취급된다.
● 테이블 내의 모든 단일 TIMESTAMP 컬럼은 현재의 타입 스탬프를 초기화 하거나 또는 업데이트를 자동으로 하기 위한
것으로 사용될 수 있다.
● CREATE TABLE 명령문에서는, 맨 처음의 TIMESTAMP 컬럼은 아래의 방식 중의 하나의 형태로 선언될 수 있다:
❍ DEFAULT CURRENT_TIMESTAMP 및 ON UPDATE CURRENT_TIMESTAMP 구문 모두를 사용할 경우,
그 컬럼은 현재의 타입 스탬프를 디폴트 값으로 가질 수 있고, 업데이트가 자동으로 이루어 진다.
• ON UPDATE CURRENT_TIMESTAMP);
• DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE t (
ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (
DEFAULT CURRENT_TIMESTAMP);
여러분은 접속 별로 현재의 타임 존을 설정할 수가 있는데, Section 5.11.8, “MySQL 서버 타임 존 지원”을 참조하기 바란다.
여러분은 컬럼에 NULL 값을 넣을 수 있게 하기 위해서 TIMESTAMP 컬럼의 정의문에 NULL 속성을 포함 시킬 수가 있다. 예를
들면:
CREATE TABLE t
);
만일 NULL 속성을 지정하지 않으면, 컬럼을 NULL로 설정하는 것이 현재(current) 타임 스탬프로 설정하는 것이 된다. NULL 값
을 허용하는 TIMESTAMP 컬럼이 아래의 조건 중의 하나에 해당하지 않으면 현재의 타임 스탬프를 가져오지 않음을 알기 바란
다.:
달리 설명하면, NULL로 정의된 TIMESTAMP 컬럼은 아래와 같은 정의문을 사용해서 생성되어질 경우에만 자동-초기화가 된다
는 것이다:
그렇지 않을 경우 — 즉, 아래와 같이 TIMESTAMP 컬럼이 NULL 값을 허용하기는 하지만 DEFAULT TIMESTAMP를 사용하
지 않을 경우에는 …,
제목검색
11. 데이터 타입
11.3. 날짜 및 시간 타입 MySQL은 TIME 값을 'HH:MM:SS' 포맷 형태로 추출해서 출력한다 (또는 큰 시간 값의 경우에는 'HHH:MM:SS' 포맷). TIME
11.3.2 TIME 타입 값은 '-838:59:59'에서 '838:59:59' 까지의 범위를 가질 수 있다. 시간(hours) 부분은 때로는 매우 클 수가 있는데, 그 이유는
TIME 타입을 일별 시간을 표현하는데 뿐만 아니라(보통 24 시간 이내), 두 가지의 사건 사이의 시간 간격을 표시하기 위해 사용되
기도 하기 때문이다 (이와 같은 경우에는 보통 24 시간 보다 큰 값이 나오거나, 음수 값이 나오기도 한다).
시간 부분 구분 문자를 포함하는 스트링 형태로 지정된 TIME 값의 경우, 10 보다 작은 시간, 분, 또는 초를 나타내는 값에 대해서
는 두 자리를 지정할 필요가 없다. '8:3:2'은 '08:03:02'과 동일하다.
축약된 값을 TIME 컬럼에 할당할 때에는 세심한 주의를 하기 바란다. 콜론을 사용하지 않는다면, MySQL은 맨 오른쪽의 두 자리
값이 초를 나타내는 것으로 생각을 하면서 값을 해석하게 된다. (MySQL 은 TIME 값을 일별 시간이 아닌 경과 시간으로 해석한
다.) 예를 들면, 여러분은 '1112' 및 1112을 '11:12:00'로 해석할지는 몰라도(11 시 12분), MySQL은 이것을 '00:11:12' (11
분, 12 초)로 해석한다. 비슷하게, '12' 및 12 는 '00:00:12'로 해석된다. 콜론을 사용하는 TIME 값은, 그 반대로, 항상 일별 시간
으로 해석된다. 즉, '11:12' 은 '11:12:00'을 의미하며, '00:11:12'을 의미하지는 않는다.
제목검색
11. 데이터 타입
11.3.3 YEAR 타입
MySQL은 YEAR 값을YYYY 포맷으로 추출해서 표시한다. 범위는 1901 에서 2155까지 이다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=11&mcate=3&scate=3&idx=18262006-08-08 오후 6:11:31
:::MySQL Korea:::
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=11&mcate=4&scate=0&idx=18272006-08-08 오후 6:11:36
:::MySQL Korea:::
제목검색
11. 데이터 타입
11.4. 스트링 타입 CHAR 및 VARCHAR 타입은 서로 비슷하지만, 저장 및 추출하는 방식에서 서로 차이가 있다. MySQL 5.0.3 버전까지는, 두 타입
11.4.1 CHAR 및 VARCHAR 타입 간에는 최대 길이 및 트레일링 스페이스(trailing space)가 유지 되는지에 관해서도 차이점을 가진다.
CHAR 및 VARCHAR 타입은 여러분이 저장하고자 하는 문자의 최대 숫자를 지정하는 길이와 함께 선언된다. 예를 들면, CHAR
(30)은 30개의 문자를 저장할 수가 있다.
CHAR 컬럼의 길이는 여러분이 테이블을 생성할 때 선언한 길이에 고정이 된다. 그 길이는 0 에서 255 사이의 값을 가진다.
CHAR 값을 저장할 때에는, 지정된 길이를 맞추기 위해서 오른쪽에 스페이스를 집어 넣게 된다. CHAR 값을 추출할 때에는, 이렇
게 추가된 스페이스가 제거된다.
VARCHAR 컬럼에 저장되어 있는 값들은 변수-길이 스트링이다. 그 길이는 MySQL 5.0.3 이전에는 0에서 255 사이의 값을 가
질 수 있었으며, 5.0.3 이후의 버전에서는 0에서 65,535 사이의 값을 가지게 된다.
CHAR와는 반대로, VARCHAR 값은 필요한 문자 수 만큼만을 사용해서 저장되며, 여기에 길이를 기록하는 1 바이트가 추가 된다
(255 보다 긴 길이로 선언된 컬럼에 대해서는 2 바이트가 추가 됨).
VARCHAR 값을 저장할 때에는 스페이스가 따라 붙지 않는다. 트레일링 스페이스를 처리하는 것은 버전에 따라 다르게 된다.
MySQL 5.0.3 버전 이후에는, 표준 SQL 에서 처럼, 값을 저장 및 추출할 때 트레일링 스페이스를 유지한다. MySQL 5.0.3 버전
이전에는, VARCHAR 컬럼에 값을 저장할 때 트레일링 스페이스가 값에서 제거가 된다; 이것은 값을 추출할 때에도 스페이스가 없
게 된다는 것을 의미한다.
만일 여러분이 컬럼의 최대 길이를 초과하는 CHAR 또는 VARCHAR 컬럼에 값을 할당한다면, 그 값은 허용된 길이에 맞도록 잘리
게 된다 (truncated). 만일 이렇게 잘린 문자가 스페이스가 아니라면, 경고문이 발생한다. 스페이스가 아닌 문자를 제거
(truncation)할 경우에 경고가 아닌 에러를 발생시키도록 할 수가 있고 스트릭트 SQL모드를 사용해서 값을 삽입하는 것을 막을 수
도 있다. Section 5.2.5, “서버 SQL 모드”를 참조.
MySQL 5.0.3 이전에서는, 만일 트레일링 스페이스가 제거되지 않는 데이터 타입을 필요로 할 경우에는, BLOB 또는 TEXT 타입
을 사용하면 된다. 또한, 만일 임의의 바이트 값을 가지고 있는 암호 또는 압축 함수에서 얻는 결과와 같은 바이너리 값을 저장하고
자 한다면, CHAR 또는 VARCHAR 컬럼 보다는 BLOB 컬럼을 사용한다 이렇게 하면 트레일링 스페이스를 삭제함으로서 발생될
수 있는 데이터 값의 변화를 피할 수가 있게 된다.
테이블의 마지막 줄에서 보이는 값들은 스트릭트 모드를 사용하지 않았을 경우에만 적용되는 것임을 알아두자; 만일 MySQL이 스
트릭트 모드를 구동하고 있다면, 컬럼 길이를 초과하는 값은 저장되지 않으며, 에러가 발생하게 된다.
만일 주어진 값이 CHAR(4) 및 VARCHAR(4) 컬럼에 저장된다고 하더라도, 그 컬럼에서 추출되는 값들이 항상 동일한 것은 아닌
데, 그 이유는 데이터를 추출하기 전에 CHAR 컬럼에서 트레일링 스페이스를 삭제하기 때문이다. 아래의 예문은 이러한 차이점을
보여 주는 것이다:
+---------------------+---------------------+
+---------------------+---------------------+
| (ab ) | (ab) |
+---------------------+---------------------+
CHAR 및 VARCHAR 컬럼에 있는 값들은 컬럼에 할당된 문자 셋과 콜레션에 따라서 저장 및 비교가 된다.
모든 MySQL 콜레션은 PADSPACE 타입이라는 점을 알아두자. 이것은 MySQL의 모든 CHAR 및 VARCHAR 값들은 어떠한 트
레일링 스페이스와는 상관 없이 비교된다는 것을 의미하는 것이다. 예를 들면:
mysql> SELECT myname = 'Monty ', yourname = 'Monty ' FROM names;
+--------------------+----------------------+
+--------------------+----------------------+
| 1| 1|
+--------------------+----------------------+
제목검색
11. 데이터 타입
11.4. 스트링 타입 BINARY 및 VARBINARY 타입은 CHAR 및 VARCHAR과 유사하지만, 비-바이너리 스트링이 아닌 바이너리 스트링을 가진다
11.4.2 BINARY 및 VARBINARY 타입 는 점은 차이가 있다. 즉, 이것들은 문자 스트링이 아닌 바이트 스트링을 가진다. 이것은 이것들이 문자 셋을 가지지 않으며, 정렬
및 비교를 숫자 값을 기반을 실행한다는 것을 의미한다.
BINARY 및 VARBINARY 데이터 타입은 CHAR BINARY 및 VARCHAR BINARY 데이터 타입과는 확실히 구분이 된다. 후자
의 경우, BINARY의 속성은 컬럼을 바이너리 스트링 컬럼으로 취급되도록 하지는 않는다. 대신에, 이 속성은 컬럼의 문자 셋에 대
한 콜레션을 사용하도록 만들며, 컬럼 자체는 바이너리 바이트 스트링이 아닌 비 바이너리 문자 스트링을 가지게 된다. 예를 들면,
CHAR(5) BINARY는 CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin 형태로 취급되며, 디폴트 문자 셋은 latin1라
는 가정을 하게 된다. 이것은 BINARY(5)과는 다른 것인데, 후자의 경우는 어떠한 문자 셋 또는 콜레션을 가지지 않는 5-바이트
바이너리 스트링을 저장한다.
BINARY 값이 저장될 때에는, 지정된 길이를 맞추기 위해 오른쪽에 스페이스를 집어 넣게 된다. 패드(pad) 값과 처리되는 방식은
버전에 따라 다르다:
● MySQL 5.0.15 이후에는, 패드 값은 0x00 (zero byte)가 된다. 삽입 동작에서는 오른쪽에 0x00을 가지고 값이 추가되
며, 선택을 할 때에는 어떠한 트레일링 바이트도 제거가 되지 않는다. 모든 바이트는 비교 연산에서 의미를 가지며,
ORDER BY 및 DISTINCT 동작에서도 의미를 갖는다. 0x00 바이트 및 스페이스는 비교 연산에서 서로 다르게 취급되며,
0x00 < 스페이스의 형태를 갖는다.
Example: BINARY(3) 컬럼의 경우, 'a '는 삽입이 될 때 'a ₩0'가 된다. 'a₩0'를 삽입하면 'a₩0₩0'가 된다. 이렇게 삽
입된 값들은 선택이 될 때 변경되지 않은 값을 그대로 가지게 된다.
● MySQL 5.0.15 이전에는 , 패드 값은 스페이스가 된다. 값을 삽입을 할 때에는 오른쪽에 스페이스를 넣게 되고, 그 값을 선
택할 경우에는 트레일링 스페이스가 제거가 된다. 트레일링 스페이스는 비교 연산에서 무시가 되는데, ORDER BY 및
DISTINCT 연산에서도 마찬가지가 된다. 0x00 바이트 및 스페이스는 비교 연산에서 서로 다르게 취급되며, 0x00 < 스
페이스의 형태를 갖는다.
Example: BINARY(3) 컬럼의 경우, 'a '은 삽입이 되면 'a '가 되고, 선택이 이루어 지면 'a' 가 된다. 'a₩0'을 삽입하면 'a
₩0 '가 되고, 선택을 하게 되면 'a₩0'가 된다.
VARBINARY의 경우, 삽입 동작에서 패딩(padding)은 일어나지 않으며 선택을 하는 경우에도 어떠한 바이트도 제거되지
(stripped) 않는다. 모든 바이트는 비교 연산에서 의미를 가지며, ORDER BY 및 DISTINCT 연산에서도 마찬가지가 된다. 0x00
바이트 및 스페이스는 비교 연산에서 서로 다르며, 0x00 < 스페이스 형태가 된다. (예외 사항: MySQL 5.0.3 이전 버전의 경
우, 값을 저장을 할 때 트레일링 스페이스가 제거가 된다. MySQL 5.0.15 이전 버전의 경우, 트레일링되는 0x00 바이트는
ORDER BY 연산에 대해서는 제거가 된다.)
Note: InnoDB 스토리지 엔진은 MySQL 5.0.18 버전까지 계속해서 BINARY 및 VARBINARY 컬럼 값에 트레일링 스페이스를 계
속 보관을 한다. MySQL 5.0.19 버전 이후에는, InnoDB는 다른 스토리지 엔진과 마찬가지로 트레일링 스페이스 문자를 비교 연산
을 하는데 사용한다.
트레일링 패드 바이트가 제거되거나 비교 연산에서 그것들을 무시하는 경우에 대해서는, 만일 하나의 컬럼이 유니크 값을 요구하
는 인덱스를 가지고 있다면, 트레일링 패드 바이트의 숫자와 다른 것만을 컬럼 값 안으로 삽입하는 동작을 하면 중복-키
(duplicate-key) 에러가 발생하게 된다. 예를 들면, 만일 테이블이 'a'를 가지고 있다면, 'a₩0'를 저장하고자 하는 시도는 중복-
키 에러를 야기하게 된다.
만약에 여러분이 바이너리 데이터를 저장하기 위해 BINARY 데이터 타입을 사용하고자 하고 저장된 값과 정확히 같은 값을 추출해
야 하는 경우라면, 위의 패딩 및 스트라이핑(stripping) 특성을 주의 깊게 고려해야 한다. 아래의 예문은 BINARY 값에 대한
0x00-패딩이 컬럼 값 비교 연산에 어떻게 영향을 주는지를 보여 주는 것이다:
+--------+---------+-------------+
+--------+---------+-------------+
| 610000 | 0| 1|
+--------+---------+-------------+
만일 추출된 값이 패딩이 되지 않은 지정된 값과 정확히 같아야 한다면, VARBINARY 또는 BLOB 데이터 타입 중의 하나를 대신
사용하는 것이 더 좋을 것이다.
제목검색
11. 데이터 타입
11.4. 스트링 타입 BLOB는 다양한 데이터 크기를 가질 수 있는 대형 바이너리 오브젝트이다. BLOB 타입으로는 TINYBLOB, BLOB,
11.4.3 BLOB 및 TEXT 타입 MEDIUMBLOB, 그리고 LONGBLOB가 있다. 각각의 타입들은 저장할 수 있는 최대 크기에서만 차이점을 가진다. TEXT 타입에
는 TINYTEXT, TEXT, MEDIUMTEXT, 그리고 LONGTEXT가 있다. 이것들은 BLOB 타입들과 대응되며 동일한 최대 길이 및
스토리지 요구 사항을 갖는다. Section 11.5, “데이터 타입 스토리지 요구 사항”을 참조할 것. 데이터가 저장되거나 추출되는 도
중에는 TEXT 또는 BLOB 컬럼에 대해서 어떠한 문자 크기 변환도 일어나지 않는다.
BLOB 컬럼은 바이너리 스트링(바이트 스트링) 형태로 취급된다. TEXT 컬럼은 비-바이너리 스트링(문자 스트링) 형태로 취급된
다. BLOB 컬럼은 문자 셋을 가지고 있지 않으며, 정렬 및 비교 연산은 컬럼 값에 있는 바이트의 숫자 값을 근거로 처리한다.
TEXT 컬럼은 문자 셋을 가지며, 문자 셋의 콜레션을 기반으로 값을 저장 및 비교하게 된다.
만일 TEXT 컬럼에 인덱스가 되어 있다면, 인덱스 엔트리 비교 연산은 마지막 부분에 스페이스가 패드 된다. 이것이 의미하는 것
은, 만일 인덱스가 유니크 값을 요구한다면, 트레일링 스페이스의 숫자와 다른 값에 대해서는 중복-키 에러가 발생한다는 것을 말
하는 것이다. 예를 들면, 만일 테이블이 'a'를 가지고 있다면, 'a '를 저장하고자 하는 시도는 중복-키 에러를 발생시키게 된다. 이것
은 BLOB 컬럼에 대해서는 적용되지 않는다.
서버가 스트릭트 모드를 구동하고 있지 않을 때, 만일 여러분이 데이터 타입의 최대 길이를 초과하는 BLOB 또는 TEXT 컬럼에 어
떤 값을 할당하고자 한다면, 그 값은 지정된 길이에 맞게 잘려 진다(truncated). 만일 잘리게 되는 문자가 스페이스가 아니라면, 경
고문이 나오게 된다. 여러분은 경고가 아닌 에러가 발생하게끔 해서 그 값을 거부하도록 만들 수가 있다. Section 5.2.5, “서버
대부분의 경우, 여러분은 BLOB 컬럼을 원하는 크기 만큼을 처리할 수 있는 VARBINARY 컬럼으로 생각을 할 수가 있다. 비슷하
게, TEXT 컬럼에 대해서도 VARCHAR 컬럼 형태로 생각할 수가 있다. BLOB 및 TEXT는 아래와 같은 방식에서는
VARBINARY 및 VARCHAR과 차이가 나타난다:
● 데이터를 저장 또는 추출할 때에는 BLOB 및 TEXT 컬럼에 대해서는 트레일링-스페이스 삭제를 할 수가 없다. MySQL
5.0.3 이전 버전의 경우, 이것은 VARBINARY 및 VARCHAR과 차이가 있는데, 그 이유는 트레일링 스페이스가 데이터를
저장할 때 삭제되기 때문이다.
TEXT는 비교 연산을 할 때 비교되는 오브젝트에 맞도록 스페이스가 확장되는데, 이것은 CHAR 및 VARCHAR과 동일하
다는 것을 주의한다.
● BLOB 및 TEXT 컬럼에 있는 인덱스의 경우, 반드시 인덱스 프리픽스(prefix) 길이를 지정해 주어야 한다. CHAR 및
VARCHAR의 경우, 프리픽스 길이는 옵션 사항이다. Section 7.4.3, “컬럼 인덱스”를 참조할 것.
● BLOB 및 TEXT 컬럼은 DEFAULT 값을 가질 수가 없다.
LONG 및 LONG VARCHAR은 MEDIUMTEXT 데이터 타입에 매핑된다. 이것은 호환성을 위한 기능이다. 만일 여러분이
BINARY 속성을 TEXT 데이터 타입과 함께 사용한다면, 그 컬럼은 컬럼 문자 셋에 대한 바이너리 콜레션을 할당 받게 된다.
mysqld 서버를 시작할 때 --max_sort_length=N 옵션을 사용해서 변경 시킬 수가 있다. Section 5.2.2, “서버 시스템
변수”를 참조할 것.
● BLOB 또는 TEXT 오브젝트의 최대 크기는 자신들의 타입에 의해 결정되지만, 클라이언트와 서버간에 전달할 수 있는 실
제 최대 크기는 사용 가능한 메모리의 크기와 통신 버퍼의 크기에 달려 있다. max_allowed_packet 변수의 값을 변경해서
메시지 버퍼의 크기를 변경 시킬 수는 있으나, 이러한 변수 값 조정은 클라이언트 및 서버 양쪽 모두에서 해야 한다. 예를
들면, mysql 및 mysqldump는 모두 클라이언트 쪽의 max_allowed_packet 값을 변경 시킨다. Section 7.5.2, “서버 파
라미터 튜닝”, Section 8.6, “mysql — MySQL 명령어-라인 툴”, 그리고 Section 8.11, “mysqldump — 데이터 베
이스 백업 프로그램”을 참조할 것.
각각의 BLOB 또는 TEXT 값은 별도로 할당된 오브젝트에 의해 표현 된다. 이것은 다른 모든 데이터 타입과는 반대인데, 그 이유
는 테이블이 오픈될 때 스토리지가 컬럼 별로 한번씩 할당되기 때문이다.
어떤 경우에는, 미디어 파일과 같은 바이너리 데이터를 BLOB 또는 TEXT 컬럼에 저장하는 것이 바람직할 때가 있다. 여러분은 이
러한 데이터를 처리하는데 있어서 MySQL의 스트링 처리 함수를 사용하는 것이 유용하다는 점을 알게 될 것이다. Section 12.3,
“스트링 함수”를 참조.
제목검색
11. 데이터 타입
11.4. 스트링 타입 ENUM은 테이블 생성 시점에 컬럼 지정문에서 명확하게 계산된 허용 값 리스트에서 선택이 된 값을 사용하는 스트링 오브젝트이
11.4.4 ENUM 타입 다.
만일 스트릭트 SQL 모드가 활성화 되어 있다면, 유효하지 않은 ENUM 값을 삽입하고자 하는 시도는 에러를 발생 시킨
다.
● 만일ENUM 컬럼이 NULL을 허용하도록 선언되었다면, NULL 값은 그 컬럼에 대해서 유효한 값이 되며, 그리고 디폴트 값
은 NULL이 된다. 만일 ENUM 컬럼이 NOT NULL로 선언되었다면, 이것의 디폴트 값은 허용된 값 리스트의 첫 번째 요소
(element)가 된다.
예를 들면, ENUM('one', 'two', 'three') 형태로 지정된 컬럼은 아래에 있는 값들 중에 어떠한 것들도 가질 수가 있다. 각각의 값에
대한 인덱스 역시 아래에 있다:
Value Index
NULL NULL
'' 0
'one' 1
'two' 2
'three' 3
트레일링 스페이스는 테이블이 생성될 때 테이블 정의문에 있는 ENUM 맴버 값에서 자동으로 삭제된다.
데이터를 추출할 때에는, ENUM 컬럼에 저장된 값은 컬럼 정의문에서 사용된 문자 크기를 사용해서 출력이 된다. ENUM 컬럼에
는 문자 셋과 콜레션이 할당될 수 있다는 점을 알아두자. 바이너리 또는 문자 크기를 구분하는 콜레션의 경우, 문자의 크기는 컬럼
만일 어떤 숫자를 ENUM 컬럼에 저장한다면, 그 숫자는 인덱스 형태로 취급되며, 저장된 값은 그 인덱스를 가지고서 계산
(enumeration) 맴버가 된다. (하지만, 이것은 LOAD DATA과는 동작을 하지 않는데, 이것은 모든 입력 값을 스트링 형태로 취급
하기 때문이다.) 숫자와 같은 계산 값을 가지고 ENUM 컬럼을 정의하는 것은 권고할 만한 것이 아니다. 예를 들면, 아래에 있는 컬
럼은 스트링 값 '0', '1', 그리고 '2'를 가지는 계산 멤버를 가지고 있지만, 숫자 인덱스 값이 1, 2, 그리고 3이 된다:
numbers ENUM('0','1','2')
ENUM 값은 컬럼 지정문에서 계산 멤버가 리스트 되어 있는 순서대로 저장된다. (달리 말하면, ENUM 값은 자신의 인덱스 번호
에 따라서 저장된다.) 예를 들면, ENUM('a', 'b')에 대해서는 'a' 가 'b' 보다 전에 정렬이 되지만, ENUM('b', 'a')의 경우에는 'b'가
'a' 보다 전에 정렬이 된다. 빈 스트링은 비어 있지 않은 스트링 보다 앞서서 정렬이 되고, NULL 값은 다른 모든 계산 값 보다 먼저
정렬이 된다. 예상하지 못한 결과를 피하기 위해서는, ENUM 리스트를 알파벳 순서로 지정을 한다. 또한, 컬럼이 인덱스 번호가 아
닌 사전적 순서로 정렬되도록 하기 위해서는 GROUP BY CAST(col AS CHAR) 또는 GROUP BY CONCAT(col)를 사용할 수
도 있다.
만일 ENUM 컬럼에 대해서 모든 가능한 값이 어떤 것이 있는지를 알아보고자 한다면, SHOW COLUMNS FROM tbl_name
LIKE enum_col 를 사용하고 그 결과로 나오는 Type 컬럼의 ENUM 정의문을 파스(parse) 하면 된다.
제목검색
11. 데이터 타입
11.4. 스트링 타입 SET은 0 또는 그 이상의 값을 가질 수 있는 스트링 오브젝트로서, 각각의 값들은 테이블이 생성될 때 지정된 허용 값 리스트에서
11.4.5 SET 타입 선택 되어야 한다. 여러 개의 셋 멤버로 구성된 SET 컬럼은 콤마 (‘,’)로 각 맴버를 구분한다. 따라서, SET 맴버는 자체적으로
콤마를 가질 수가 없다.
''
'one'
'two'
'one,two'
트레일링 스페이스는 테이블이 생성될 때 테이블 정의문에 있는 SET 맴버에서 자동으로 삭제가 된다.
추출이 될 때에는, SET 컬럼에 저장되어 있는 값은 컬럼 정의문에서 사용된 문자 크기를 사용해서 출력이 된다. SET 컬럼에는 문
자 셋과 콜레션이 할당될 수 있다는 점을 알아두자. 바이너리 또는 문자 크기를 구분하는 콜레션의 경우, 문자 크기는 컬럼에 값이
만일 어떤 숫자가 SET 컬럼에 저장이 된다면, 해당 숫자의 바이너리 표현식에 있는 셋은 컬럼 값에 있는 셋 멤버를 결정하게 된다.
SET('a','b','c','d') 형태로 지정된 컬럼의 경우, 해당 멤버는 아래의 10진수와 바이너리 값을 가지게 된다:
'a' 1 0001
'b' 2 0010
'c' 4 0100
'd' 8 1000
만일 여러분이 이 컬럼에 9에 해당하는 값을 할당한다면, 그것은 바이너리로 1001이 되며, 따라서 첫 번째와 네 번째의 SET 값 멤
버 'a' 및 'd'가 선택이 되고 그 결과 값은 'a,d'가 된다.
하나 이상의 SET 요소(element)를 가지는 값에 대해서는, 그 값에 요소를 삽입할 때 순서는 중요하지가 않게 된다. 또한, 그 값 안
에 주어진 요소가 몇 번이나 반복되는지도 중요하지가 않게 된다. 나중에 그 값을 추출할 때, 그 값에 있는 각각의 요소들은 한번
씩 나타나며, 이때 각 요소들은 테이블이 생성되는 시점에 지정된 순서에 따라서 나타나게 된다. 예를 들면, 어떤 컬럼이 SET
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
+---------+------+------------------------------------------+
+---------+------+------------------------------------------+
+---------+------+------------------------------------------+
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
만일 스트릭트 SQL 모드가 활성화 되어 있다면, 유효하지 못한 값을 SET 값에 삽입하고자 하는 시도는 에러를 발생 시키게 된다.
일반적으로, 여러분은 SET 값을 검색하기 위해서 FIND_IN_SET() 함수 또는 LIKE 연산자를 사용할 수가 있다:
첫 번째 명령문은 set_col 이 value 셋 멤버를 가지고 있는 열을 찾는다. 두 번째 명령문도 비슷하지만, 정확히 같지는 않다: 두 번
째 명령문은 set_col 이 value 가 다른 셋 멤버의 서브 스트링이라 하더라도 이 값이 있는 열을 모두 찾는다.
만일 SET 컬럼에 대해서 가능한 모든 값을 알아 보고자 한다면, SHOW COLUMNS FROM tbl_name LIKE set_col 을 사용하고
그 결과로 나오는 Type 컬럼에서 SET 정의문을 파스(parse)한다.
제목검색
11. 데이터 타입 MySQL이 지원하는 각각의 데이터 타입에 대한 스토리지 요구 사항은 아래와 같다.
11.5. 데이터 타입 스토리지 요구 사항 MyISAM 테이블에 있는 열의 최대 크기는 65,534 바이트이다. 각 BLOB 및 TEXT 컬럼은 단지 5에서 9 바이트만을 차지한다.
숫자 타입에 대한 스토리지 요구 사항
TINYINT 1 byte
SMALLINT 2 bytes
MEDIUMINT 3 bytes
BIGINT 8 bytes
FLOAT 4 bytes
0 0
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4
9 4
MySQL 5.0.3 버전 이전에는, DECIMAL 컬럼은 스트링 형태로 표현되며 스토리지 요구 사항은: D > 0일 경우에는,M+2 바이
트이고, D = 0일 경우에는, (D+2, if M < D) M+1 바이트가 된다.
날짜 및 시간 타입에 대한 스토리지 요구 사항
DATE 3 bytes
DATETIME 8 bytes
TIMESTAMP 4 bytes
TIME 3 bytes
YEAR 1 byte
Prior to MySQL 5.0.3: L + 1 bytes, where L <= M and 0 <= M <= 255.
VARCHAR(M) MySQL 5.0.3 and later: L + 1 bytes, where L <= M and 0 <= M <= 255 or
L + 2 bytes, where L <= M and 256 <= M <= 65535 (see note below).
Prior to MySQL 5.0.3: L + 1 bytes, where L <= M and 0 <= M <= 255.
VARBINARY(M) MySQL 5.0.3 and later: L + 1 bytes, where L <= M and 0 <= M <= 255 or
L + 2 bytes, where L <= M and 256 <= M <= 65535 (see note below).
CHAR, VARCHAR, 그리고 TEXT 타입의 경우, 앞의 테이블에 있는 값 L 및 M 은 문자의 수로 해석이 되고, 그리고 컬럼 지정문
에 있는 이러한 타입의 길이는 문자의 숫자를 가리키게 된다. 예를 들면, TINYTEXT 값을 저장하기 위해서는 L 문자와 더불어 1
바이트가 더 필요하게 된다.
VARCHAR, VARBINARY, 그리고 BLOB 및 TEXT 타입은 변수-길이 타입이다. 각각의 경우, 스토리지 요구 사항은 아래의 요소
들에 관련을 갖는다:
● 컬럼 값의 실제 길이
● 컬럼의 최대 가능 길이
● 컬럼용으로 사용된 문자 셋
예를 들면, VARCHAR(10) 컬럼은 최대 길이 10의 스트링을 갖는다. 이 컬럼이 latin1 문자 셋 (문자 당 1 바이트)을 사용한다고
가정하면, 필요한 실제 스토리지는 스트링 (L)의 길이에, 스트링의 길이를 기록하기 위한 1 바이트가 추가 된다. 'abcd의 경우, , L
은 4 이고 스토리지 요구 사항은 5 바이트가 된다. 만일 동일한 컬럼이 VARCHAR(500)로 선언되었다면, 스트링 'abcd'는 4 + 2
= 6 바이트를 필요로 한다. 프리픽스에 대해서는 1 바이트가 아닌 2 바이트가 요구되는데, 그 이유는 컬럼의 길이가 255 문자 보
다 크기 때문이다.
특정 CHAR, VARCHAR, 또는 TEXT 컬럼 값을 저장하기 위해 사용되는 바이트의 숫자를 계산하기 위해서는, 반드시 그 컬럼을
위해 사용된 문자 셋을 고려해야 한다. 특히, utf8 Unicode 문자 셋을 사용할 경우에는, 반드시 모든 utf8 문자 셋이 동일한 바이트
숫자를 가지는 것이 아니라는 점을 기억해야 한다. Section 10.7, “Unicode Support”를 참조.
Note: MySQL 5.0.3 및 이후 버전에서는, VARCHAR 또는 VARBINARY 컬럼에 대한 유효한 최대 길이는 65,532가 된다.
MySQL 5.0.3 이후에는, NDBCLUSTER 엔진은 고정-길이 컬럼만을 지원한다. 이것은 MySQL Cluster에 있는 테이블에서 나오
는 VARCHAR 컬럼은 아래와 같이 동작을 한다는 것을 의미한다:
● 만일 컬럼의 크기가 256 문자 보다 작다면, 컬럼은 열 별로 추가적인 1 바이트의 스토리지가 필요하게 된다.
● 만일 컬럼의 크기가 256 문자 이상일 경우, 컬럼은 추가적으로 열 당 2 바이트를 필요하게 된다.
문자 별로 요구되는 바이트의 숫자는 사용되는 문자 셋에 따라서 달라진다는 점을 알아 두자. 예를 들면, 만일 클러스터 테이블에
있는 VARCHAR(100) 컬럼이 utf8 문자 셋을 사용한다면, 각각의 문자는 3 바이트 스토리지를 필요로 한다. 이것은 그러한 컬럼
에 있는 각각의 레코드가 주어진 레코드에 실제로 저장되는 스트링의 길이에는 상관 없이 스토리지용으로 100 × 3 + 1 = 301 바
이트를 가진다는 것을 의미한다. utf8 문자 셋과 함께 NDBCLUSTER 스토리지 엔진을 사용하는 테이블의 VARCHAR(1000) 컬
럼의 경우에는, 각각의 레코드가 1000 × 3 + 2 = 3002 바이트의 스토리지를 사용하게 된다; 즉, 컬럼은 1,000 문자 크기가 되
며, 각각의 문자는 3 바이트 스토리지를 필요로 하고, 그리고 각각의 레코드는 2-바이트 만큼의 오버 헤드를 가지는데, 그 이유는
1,000 > 256 이기 때문이다.
BLOB 및 TEXT 타입은, 타입의 최대 가능 길이에 따라서, 컬럼 값의 길이를 저장하기 위해서 1, 2, 3, 또는 4 바이트를 사용하게
된다. Section 11.4.3, “BLOB 및 TEXT 타입”을 참조할 것.
TEXT 및 BLOB 컬럼은 NDB Cluster 스토리지 엔진에서는 다르게 구현이 되는데, 이 클러스터 엔진에서는 TEXT 컬럼에 있는
각각의 열은 두 개의 서로 다른 부분으로 구성이 된다. 이 부분 중의 하나는 길이가 고정 (256 bytes)되며, 실제로 원본 테이블에
저장이 된다. 다른 부분은 256 바이트가 초과되는 데이터로 구성이 되며, 이것은 숨겨진 테이블에 저장이 된다. 이 두 번째 테이블
에 있는 열은 크기가 항상 2,000 바이트가 된다. 이것은 만일 size <= 256 (size 는 열의 크기를 나타냄)일 경우에는 TEXT 컬
럼의 크기가 256이 된다는 것을 의미한다; 그렇지 않을 경우에는, 그 크기가 256 + size + (2000 – (size – 256) % 2000)가
된다.
ENUM 오브젝트의 크기는 서로 다른 계산(enumeration) 값의 숫자에 의해 측정된다. 1 바이트는 255개의 가능 값까지를 계산하
는데 사용된다 2 바이트는 256에서 65,535 사이의 가능 값을 계산하는데 사용된다. Section 11.4.4, “ENUM 타입”을 참조할
것.
SET 오브젝트의 크기는 서로 다른 셋 멤버의 숫자를 가지고 계산할 수가 있다. 만일 셋의 크기가 N이라면, 그 오브젝트는 (N
+7)/8 바이트를 저장할 수가 있고, 1, 2, 3, 4, 또는 8 바이트가 될 수가 있다. SET은 최대 64개의 멤버를 가질 수 있다.
Section 11.4.5, “SET 타입”을 참조할 것.
제목검색
상위메뉴리스트 ◆
11.6. 컬럼에 대한 올바른 타입 선택하기
11. 데이터 타입
최적의 스토리지에 대해서는, 모든 경우에 대해서 가장 정밀한 타입을 사용하도록 시도해야 한다. 예를 들면, 만일 어떤 정수 컬럼
11.6. 컬럼에 대한 올바른 타입 선택하기
이 1 에서 99999 사이의 값을 사용하고 있다면, MEDIUMINT UNSIGNED가 최적의 타입일 것이다. 필요로 하는 모든 값을 표시
11.6 컬럼에 대한 올바른 타입 선택하기
하기 위한 타입에 대해서, 이 타입이 최소의 스토리지를 사용한다.
MySQL 5.0.3 및 이후 버전에서 생성된 테이블은 DECIMAL 컬럼에 대해서는 새로운 스토리지 포맷을 사용한다. DECIMAL 컬럼
을 사용하는 모든 기본 연산 (+,-,*,/)은 65자리의 십진 자릿수 만큼의 정밀도를 가지고 실행된다. Section 11.1.1, “Overview
of Numeric Types”를 참조할 것.
MySQL 5.0.3 이전 버전의 경우, DECIMAL 값에서의 계산은 이중-정밀도 연산을 사용해서 실행된다. 만일 정밀도 보다는 실행
속도가 중요한 경우라면, DOUBLE 타입 정도면 충분할 것이다. 높은 정밀도에 대해서는, 항상 고정-소수점 타입을 변환 시켜서
BIGINT에 저장되도록 할 수가 있다. 이렇게 하면 모든 계산이 64 비트 정수를 사용할 수 있게끔 하며 그리고 필요할 경우에는 그
결과 값을 부동 소수점 값으로 환원 시킬 수도 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=11&mcate=6&scate=0&idx=18342006-08-08 오후 6:12:16
:::MySQL Korea:::
제목검색
11. 데이터 타입 다른 벤더가 만든 SQL용으로 작성된 코드를 잘 활용하기 위해서, MySQL은 아래의 테이블에 나타난 것과 같이 데이터 타입을 서
11.7. 다른 데이터 베이스 엔진의 데이터 타입 로 매핑 시킨다. 이러한 매핑을 통해 다른 데이터 베이스 시스템에서 정의된 테이블을 쉽게 MySQL로 가져올 수가 있게 된다:
사용하기
11.7 다른 데이터 베이스 엔진의 데이터 타입 사용 Other Vendor Type MySQL Type
하기
BOOL, TINYINT
BOOLEAN TINYINT
DEC DECIMAL
FIXED DECIMAL
FLOAT4 FLOAT
FLOAT8 DOUBLE
INT1 TINYINT
INT2 SMALLINT
INT3 MEDIUMINT
INT4 INT
INT8 BIGINT
LONG MEDIUMTEXT
MIDDLEINT MEDIUMINT
NUMERIC DECIMAL
데이터 타입 매핑은 테이블 생성 시점에 일어나며, 원래의 타입 지정문이 폐기된 후에 일어난다. 만일 다른 벤더가 사용하는 타입
을 가지고 테이블을 생성한 다음에 DESCRIBE tbl_name 명령문을 입력하게 된다면, MySQL은 이에 해당하는 동등한
(equivalent) MySQL 타입을 사용해서 테이블 구조를 출력한다. 예를 들면:
mysql> DESCRIBE t;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
|a | tinyint(1) | YES | | NULL | |
|b | double | YES | | NULL | |
|c | mediumtext | YES | | NULL | |
|d | decimal(10,0) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
제목검색
12.9.4. 기타 함수들
12.10. GROUP BY 구문과 함께 사용하기 위한 함수 및 수정자(Modifier)
12.10.1. GROUP BY (집합) 함수
12.10.2. GROUP BY 수정자(Modifiers)
12.10.3. 숨겨진 필드를 갖는 GROUP BY 및 HAVING
수식은 SQL 명령문의 여러 곳에서 사용되는데, 예를 들면 SELECT 명령문의 ORDER BY 또는 HAVING 구문에서, SELECT,
DELETE, 또는 UPDATE 명령문의 WHERE 구문에서, 또는 SET 명령문에서 사용된다. 수식은 리터럴(literal) 값, 컬럼 값,
NULL, 빌트-인(built-in) 함수, 스토어드 함수, 사용자 정의 함수, 그리고 연산자를 사용해서 작성된다. 이 장에서는 MySQL에
서 수식을 작성하는데 사용할 수 있는 함수 및 연산자에 대해서 설명을 하겠다. 스토어드 함수 및 사용자 정의 함수에 대해서는
Chapter 17, 스토어드 프로시저 및 함수, 그리고 Section 24.2, “MySQL에 새로운 함수 추가하기” 부분에서 설명하기로 하겠
다.
Note: 디폴트로는, 함수 이름과 뒤에 따라 나오는 괄호 사이에는 화이트 스페이스를 두지 말아야 한다. 이것은 This helps the
MySQL 파서(parser)가 함수 호출과 함수의 이름과 동일한 이름을 사용하는 테이블 또는 컬럼 참조를 구분하는데 도움을 준다. 하
지만, 함수 인수 주변에 있는 스페이스는 허용된다.
설명을 간단하게 하기 위해서, 이 장에서 보여주는 대부분의 예문들은 mysql 프로그램에서 나오는 결과를 간략한 형태로 보여 줄
것이다. 즉, 아래와 같은 형태가 아닌:
| 2|
+-----------+
1 rows in set (0.00 sec)
제목검색
12.1 연산자 환
http://www.mysqlkorea.com/develop/sub_07.html?lcate=12&mcate=1&scate=0&idx=18372006-08-08 오후 6:12:47
:::MySQL Korea:::
제목검색
12.1. 연산자 연산자 우선 순위는 아래와 같으며, 가장 낮은 것에서부터 가장 높은 것 순서로 되어 있다. 동일한 라인에 나와 있는 연사자들은 같
:=
&&, AND
NOT
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
&
<<, >>
-, +
*, /, DIV, %, MOD
BINARY, COLLATE
NOT에 대한 우선 순위는 MySQL 5.0.2 이후에 존재한다. 이전 버전, 또는 HIGH_NOT_PRECEDENCE SQL 모드가 활성화 되
어 있는 경우의 5.0.2 까지는, NOT의 우선 순위는 ! 연산자의 우선 순위와 같다. Section 5.2.5, “서버 SQL 모드” 를 참조.
연산자의 우선 순위는 수식에 있는 항(term)의 계산 순서를 결정한다. 위의 순서를 무시하고 그룹 항을 명확하게 지정하고자 한다
면, 괄호를 사용하면 된다. 예를 들면:
-> 7
-> 9
제목검색
12.1. 연산자 하나의 연산자가 서로 다른 타입의 피 연산자와 함께 사용된다면, 피 연산자의 호환성을 위해 타입 변환(conversion)이 발생한다.
12.1.2 수식 계산에서의 타입 변환 어떤 경우에는 변환이 암묵적(implicitly)으로 발생한다. 예를 들면, MySQL은 필요할 경우에는 숫자를 문자로 또는 문자를 숫자
로 자동 변환 시킨다.
-> 2
또한, 명확하게 변환을 실행 시킬 수도 있다. 만일 여러분이 숫자를 문자로 명확하게 변환 시키고자 한다면, CAST() 또는
CONCAT() 함수를 사용하면 된다 (CAST()이 더 많이 사용됨):
-> 0
-> 1
-> 0
-> 1
스트링 컬럼을 숫자와 비교를 할 경우에는, MySQL은 값을 빨리 찾기 위해서 컬럼의 인덱스를 사용하지는 않는다는 점을 알아두
기 바란다. 만일 str_col 이 인덱스가 된 스트링 컬럼이라면, 그 인덱스는 아래의 명령문에서 룩업(lookup)을 실행할 때 사용될 수
가 없다:
그 이유는 바로, '1', ' 1', 또는 '1a'처럼, 그 컬럼에는 1로 변환 시켜야 하는 스트링이 너무 많이 존재하기 때문이다.
부동 소수점 숫자 (또는 부동 소수점 숫자로 변환되는 값)를 사용하는 비교 연산은 대략적으로 실행되는데, 그 이유는 그런 숫자는
부정확하기 때문이다:
-> 1
-> 0
이러한 결과가 발생하는 이유는 해당 값이 부동 소수점으로 변환 되기 때문이며, 이렇게 변환이 되는 숫자는 단지 53 비트의 정밀
도만을 가지며 나머지는 절사(rounding) 처리 된다:
-> 1.8015376320243e+16
더욱이, 스트링에서 부동 소수점 그리고 정수에서 부동 소수점으로의 변환은 동일한 방식으로 처리되지는 않는다. 정수는 CPU에
의해 부동 소수점 숫자로 변환되는 반면에, 스트링은 부동 소수점 곱셈이 포함된 연산에서 자릿수 별로 변환이 된다.
-> 1
부동 소수점 비교 연산에 대해서는 Section A.5.8, “Problems with Floating-Point Comparisons”를 참조하기 바란다.
제목검색
12.1. 연산자 비교 연산의 결과는 1 (TRUE), 0 (FALSE), 또는 NULL가 된다. 이러한 연산은 숫자 및 스트링에서 실행된다. 스트링은 자동으
12.1.3 비교 함수와 연산자 로 숫자로 변환되며 필요할 경우에는 숫자를 스트링으로 변환 시킬 수도 있다.
비교 연산의 목적에 맞게 어떤 값을 특정 타입으로 변환하기 위해서는, CAST() 함수를 사용하면 된다. 스트링 값은 CONVERT()
을 사용하면 서로 다른 문자 셋으로 변환 시킬 수가 있다. Section 12.8, “캐스트(Cast) 함수 및 연산자”를 참조.
디폴트로는, 스트링 비교 연산은 문자 크기를 구분하지 않으며 현재(current)의 문자 셋을 사용한다. 디폴트는 latin1 (cp1252
West European)이며, 이것은 영어에서도 잘 동작을 한다.
● =
같음(equal):
mysql> SELECT 1 = 0;
-> 0
-> 1
-> 1
-> 0
-> 1
● <=>
-> 1, 1, 0
● <>, !=
같지 않음(Not equal):
-> 1
-> 0
-> 1
● <=
작거나 같음:
-> 1
● <
보다 작음:
-> 0
● >=
크거나 같음:
-> 1
● >
보다 큼:
-> 0
불리안 값에 대응해서 값을 테스트 하는데, 여기에서 boolean_value 은 TRUE, FALSE, or UNKNOWN이 될 수 있다.
-> 1, 1, 1
-> 1, 1, 0
-> 0, 0, 1
-> 1, 1, 0
ODBC 프로그램과 잘 동작을 하도록 하기 위해서, MySQL은 IS NULL을 사용할 때 아래와 같은 추가적인 기능들을 지원
한다:
❍ NOT NULL로 선언된 DATE 및 DATETIME 컬럼에 대해서는, 아래와 같은 명령문을 사용하면 특수 날짜인
'0000-00-00'을 찾을 수가 있다:
만일 expr 가 min 보다 크거나 같고 expr 가 max 보다 작거나 같으면, BETWEEN은 1을 리턴하고, 그렇지 않으면 0 을
리턴 한다. 이것은 모든 인수가 동일한 타입일 경우의 수식 (min <= expr AND expr <= max)과 같다. 그렇지 않
을 경우, 타입 변환이 Section 12.1.2, “수식 계산에서의 타입 변환”에서 설명한 방식에 따라서 실행되지만, 세 가지 인
수 모두에 적용된다.
-> 0
-> 1
-> 1
-> 0
● COALESCE(value,...)
-> 1
-> NULL
● GREATEST(value1,value2,...)
-> 2
-> 767.0
-> 'C'
MySQL 5.0.13 이전 버전에서는, GREATEST()은 모든 인수가 NULL 일 경우에만 NULL을 리턴한다. 5.0.13 이후에
는, 인수 중의 하나가 NULL 이면 NULL을 리턴한다.
● expr IN (value,...)
-> 0
-> 1
● ISNULL(expr)
-> 0
-> 1
can be used instead of = to test whether 어떤 값이 NULL인지 아닌지를 테스트 하기 위해서 = 대신에 ISNULL()
을 사용할 수도 있다. (= 를 사용해서 어떤 값을 NULL 과 비교하면 항상 거짓(false)이 나온다.)
ISNULL() 함수는 IS NULL 비교 연산자와 함께 특정 동작을 공유한다. IS NULL에 대한 설명을 참조할 것.
● INTERVAL(N,N1,N2,N3,...)
-> 3
-> 2
-> 0
● LEAST(value1,value2,...)
두 개 이상의 인수를 사용하면, 가장 작은 인수 값을 리턴한다. 인수들은 아래의 규칙에 따라서 비교가 된다:
MySQL 5.0.13 이전의 경우, LEAST() 은 모든 인수가 NULL 일 경우에만 NULL을 리턴한다. 5.0.13 이후에는, 어떤
인수가 NULL 이면 NULL을 리턴한다.
-> 0
-> 3.0
-> 'A'
-> -9223372036854775808
제목검색
12.1. 연산자 SQL에서는, 모든 논리 연산자는 TRUE, FALSE, 또는 NULL (UNKNOWN)으로 계산된다. MySQL의 경우에는, 이러한 것들이
12.1.4 논리 연산자 1 (TRUE), 0 (FALSE), 그리고 NULL로 계산된다. 이들 대부분은 다른 SQL 데이터 베이스 서버에서도 공통적인 것으로, 비록
어떤 서버가 TRUE에 대한 값으로 0 이 아닌 값을 리턴하는 경우에도 해당이 된다.
● NOT, !
-> 0
-> 1
-> NULL
-> 0
-> 1
● AND, &&
-> 1
-> 0
-> NULL
-> 0
-> 0
● OR, ||
논리 OR. 양쪽의 피 연산자가 NULL이 아니라면, 그 결과는, 양쪽의 피 연산자가 0 이 아니면 1 을, 그렇지 않으면 0 을 리
턴한다. NULL 피 연산자를 사용하면, 다른 피 연산자가 0 이 아니면 1 을, 그렇지 않으면 NULL 을 리턴한다. 만일 양쪽
의 피 연산자가 모두 NULL 이라면, 그 결과는 NULL 이 된다.
mysql> SELECT 1 || 1;
-> 1
mysql> SELECT 1 || 0;
-> 1
mysql> SELECT 0 || 0;
-> 0
-> NULL
-> 1
● XOR
-> 0
-> 1
-> NULL
-> 1
제목검색
12. 함수와 연산자 ● CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result]
12.2 제어 플로우 함수
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
첫 번째 수식은 value=compare_value 인 경우에 result 을 리턴한다. 두 번째 수식은 처음의 조건이 트루(true)일 경우
에 값을 리턴한다. 만일 매칭되는 결과 값이 없는 경우에는, ELSE 다음의 값이 리턴이 되거나, 또는 ELSE 부분이 없는 경
우에는 NULL 을 리턴한다.
Note: 위에서 보여진 CASE 수식의 신텍스는, 내부 스토어드 루틴의 사용에 있어서, Section 17.2.10.2, “CASE 명령
문”에서 설명한 SQL CASE 명령문과는 다소 차이가 있다. CASE 명령문은 ELSE NULL 구문을 가질 수가 없으며, 또
한 END 대신에 END CASE를 사용해서 종료가 된다.
● IF(expr1,expr2,expr3)
만일 expr1 이 TRUE (expr1 <> 0 and expr1 <> NULL)라면, IF() 는 expr2 를 리턴한다; 그렇지 않을 경
우에는 expr3를 리턴한다. IF()는 자체가 어떤 문맥에서 사용되는지에 따라서, 숫자 또는 스트링 값을 리턴한다.
만일 expr2 또는 expr3 중의 하나가 명확하게 NULL 이라면, IF() 함수의 결과 타입은 NULL 이 아닌 수식 값을 갖는
다.
첫 번째 예에서 보면, IF(0.1) 은 0 을 리턴하는데, 그 이유는 0.1 이 정수 값으로 변환되기 때문이며, 따라서 그 결과는 IF
(0)과 같다. 이 결과 값은 어쩌면 여러분이 예상한 값과는 다를 것이다. 두 번째 경우를 보면, 원래의 부동 소수점 값이 0
인지 아닌지를 보기 위해서 비교 연산을 테스트 하고 있다. 비교 결과는 정수 형태로 사용된다.
IF() 의 디폴트 리턴 타입 (임시 테이블에 저장될 때에만 고려 대상임)은 아래와 같이 계산된다:
만일 expr2 및 expr3 이 둘 다 스트링 이라면, 두 인수중의 하나가 문자 크기를 구분한다면 그 결과는 문자 크기를 구분하
게 된다.
Note: IF 명령문도 또한 존재 하는데, 이 명령문은 위에서 설명한 IF() 함수와는 다소 다른 것이다. Section 17.2.10.1,
“IF 명령문”을 참조할 것.
● IFNULL(expr1,expr2)
만일 expr1 이 NULL이 아니라면, IFNULL() 은 expr1을 리턴한다; 그렇지 않을 경우에는 expr2를 리턴한다. IFNULL
() 은 사용된 문맥에 따라서 숫자 또는 스트링 값을 리턴한다.
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| test | char(4) | | | | |
+-------+---------+------+-----+---------+-------+
● NULLIF(expr1,expr2)
만일 expr1 = expr2 가 트루(true)라면 NULL을, 그렇지 않을 경우는 expr1을 리턴한다. 이것은 CASE WHEN expr1
= expr2 THEN NULL ELSE expr1 END과 동일하다.
제목검색
12.3 스트링 함수 스트링-값 함수는 그 결과 값의 길이가 max_allowed_packet 시스템 변수의 값 보다 클 경우에는, NULL을 리턴한다.
Section 7.5.2, “서버 파라미터 튜닝하기”를 참조할 것.
● ASCII(str)
스트링 str 의 맨 왼쪽 문자의 숫자 값을 리턴한다. str 이 빈 스트링(empty string)일 경우에는 0 을 리턴한다. NULL if
str 이 NULL일 경우에는 NULL 을 리턴한다. ASCII()는 0 에서 255 사이의 숫자 값을 갖는 문자에 대해서 연산을 한
다.
mysql> SELECT ASCII('2');
-> 50
mysql> SELECT ASCII(2);
-> 50
mysql> SELECT ASCII('dx');
-> 100
ORD() 함수를 함께 참조할 것.
● BIN(N)
-> '1100'
● BIT_LENGTH(str)
CHAR()은 각각의 인수 N 을 정수 형태로 해석을 하고 이러한 정수의 코드 값에 의해 주어지는 문자로 구성된 스트링을
리턴한다. NULL 값은 무시(skipped)된다.
mysql> SELECT CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> SELECT CHAR(77,77.3,'77.3');
-> 'MMM'
MySQL 5.0.15 이후 버전에서는, 255 보다 큰 CHAR() 인수는 여러 개의 결과 바이트로 변환된다. 예를 들면, CHAR
(256)는 CHAR(1,0)와 같고, 그리고 CHAR(256*256) 는 CHAR(1,0,0)과 같다:
mysql> SELECT HEX(CHAR(1,0)), HEX(CHAR(256));
+----------------+----------------+
| HEX(CHAR(1,0)) | HEX(CHAR(256)) |
+----------------+----------------+
| 0100 | 0100 |
+----------------+----------------+
mysql> SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));
+------------------+--------------------+
| HEX(CHAR(1,0,0)) | HEX(CHAR(256*256)) |
+------------------+--------------------+
| 010000 | 010000 |
+------------------+--------------------+
디폴트로는, CHAR()는 바이너리 스트링을 리턴한다. 주어진 문자 셋에 있는 스트링을 만들기 위해서는, USING 구문을
옵션으로 사용한다:
mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
+---------------------+--------------------------------+
| CHARSET(CHAR(0x65)) | CHARSET(CHAR(0x65 USING utf8)) |
+---------------------+--------------------------------+
| binary | utf8 |
+---------------------+--------------------------------+
만일 USING을 사용하였는데도 그 결과 스트링이 주어진 문자 셋에 대해서 유효하지 않게 되면, 경고문이 나오게 된다. 또
한, 만일 스트릭트(strict) SQL 모드를 활성화 한다면, CHAR() 의 결과 값은 NULL이 된다.
MySQL 5.0.15 이전 버전에서는, CHAR()는 연결 문자 셋에 있는 스트링을 리턴하며 USING 구문은 사용할 수 없게 된
다. 또한, 각각의 인수는 모듈로(modulo) 256으로 해석이 되기 때문에, CHAR(256) 및 CHAR(256*256)는 둘 다
CHAR(0)과 동일한 것이 된다.
● CHAR_LENGTH(str)
스트링 str의 길이를 리턴한다. 다중 바이트 문자는 단일 문자로 계산(count) 된다. 즉, 5개의 2 바이트 문자를 갖는 스트
링에 대해서, LENGTH() 는 10을 리턴 하지만, CHAR_LENGTH()는 5를 리턴 한다.
● CHARACTER_LENGTH(str)
● CONCAT(str1,str2,...)
인수를 연결한 결과로 나오는 스트링을 리턴한다. 한 개 또는 그 이상의 인수를 가질 수 있다. 만일 모든 인수가 바이너리
스트링이 아니라면, 그 결과는 바이너리가 아닌 스트링이 된다. 만일 인수에 바이너리 스트링이 포함되어 있다면, 그 결과
는 바이너리 스트링이 된다. 숫자 인수는 동일한 바이너리 스트링 형태로 변환된다; 만일 이렇게 변환되는 것을 원하지 않
을 경우에는, 아래의 예문과 같이 명확하게 타입 캐스트(type cast)를 사용하면 된다:
SELECT CONCAT(CAST(int_col AS CHAR), char_col);
CONCAT()는 모든 인수가 NULL이 아니면 NULL을 리턴한다.
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
-> NULL
mysql> SELECT CONCAT(14.3);
-> '14.3'
● CONCAT_WS(separator,str1,str2,...)
● CONV(N,from_base,to_base)
-> '40'
● ELT(N,str1,str2,str3,...)
만일N = 1이면, str1을, N = 2이면, str2 을 리턴하는 방식. N 이 1 보다 작거나 또는인수의 숫자보다 많을 경우에는
NULL을 리턴한다. ELT()는 FIELD()의 보수(complement)이다.
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'
● EXPORT_SET(bits,on,off[,separator[,number_of_bits]])
bits에 있는 모든 비트 셋(bit set)에 대해서는, on 스트링을, 그리고 모든 리셋 비트에 대해서는, off 스트링을 리턴한다.
bits 에 있는 비트는 오른쪽에서 왼쪽으로 검사된다 (낮은 순서에서 높은 순서 비트로). 스트링은 왼쪽에서 오른쪽으로 결
과에 추가되는데, separator 스트링으로 구분이 된다 (디폴트 스트링은 콤마 문자 ‘,’). 검사가 되는 비트의 숫자는
number_of_bits로 주어진다 (디폴트는 64).
mysql> SELECT EXPORT_SET(5,'Y','N',',',4);
-> 'Y,N,Y,N'
mysql> SELECT EXPORT_SET(6,'1','0',',',10);
-> '0,1,1,0,0,0,0,0,0,0'
● FIELD(str,str1,str2,str3,...)
str1, str2, str3, ... 리스트에 있는 str 의 인덱스(포지션)를 리턴한다. str을 찾을 수 없는 경우에는 0 을 리턴 한다.
만일 FIELD()에 대한 모든 인수가 스트링이라면, 모든 인수는 스트링으로 비교된다. 만일 모든 인수가 숫자일 경우에는
숫자로 비교가 된다. 그렇지 않은 경우라면, 인수들은 두 번 (double) 비교가 된다.
만일 str 이 NULL이라면, 리턴 값은 0 이 되는데, 그 이유는 NULL 은 어떤 값과도 등식 비교가 되지 않기 때문이다.
FIELD()는 ELT()의 보수(complement)이다.
mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 2
● FIND_IN_SET(str,strlist)
● FORMAT(X,D)
숫자 X 의 포맷을 '#,###,###.##' 형태로 만들고, D의 소수점 뒷자리에서 절사(round)를 하고, 그 결과를 스트링으
로 리턴한다. 만일 D 가 0 이면, 그 결과는 소수점 또는 분수 부분을 갖지 않는다.
mysql> SELECT FORMAT(12332.123456, 4);
-> '12,332.1235'
mysql> SELECT FORMAT(12332.1,4);
-> '12,332.1000'
mysql> SELECT FORMAT(12332.2,0);
-> '12,332'
● HEX(N_or_S)
만일N_or_S 이 숫자라면, N에 대한 16진수 값에 해당하는 스트링 표현을 리턴하는데, 여기에서 N 은 (BIGINT) 숫자가
된다. 이것은 CONV(N,10,16)과 동일하다.
만일 N_or_S 이 스트링 이라면, N_or_S 에 대한 16진수 스트링 표현식을 리턴하는데, N_or_S 에 있는 각각의 문자는 2
개의 16진수 숫자로 변환된다.
mysql> SELECT HEX(255);
-> 'FF'
mysql> SELECT 0x616263;
-> 'abc'
mysql> SELECT HEX('abc');
-> 616263
● INSERT(str,pos,len,newstr)
str 의 포지션 pos 에서 시작하는 서브 스트링을 len 문자 길이만큼 스트링 newstr로 변경시켜서 str 을 리턴한다. 만일
pos 가 스트링의 길이 안에 있지 않다면, 원래의 스트링을 리턴한다. 만일 len 의 범위가 스트링의 나머지 길이 범위 내에
있지 않다면, 포지션 pos 이후의 나머지 스트링을 대체 시킨다. 만일 어떤 인수가 NULL 이면, NULL을 리턴한다.
mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'
mysql> SELECT INSERT('Quadratic', -1, 4, 'What');
-> 'Quadratic'
mysql> SELECT INSERT('Quadratic', 3, 100, 'What');
-> 'QuWhat'
이 함수는 다중 바이트에서도 동작을 한다.
● INSTR(str,substr)
str 에서 서브 스트링 substr 가 처음으로 나오는 포지션을 리턴한다. 이것은 LOCATE()에서 두 개의 인수를 사용하는
것과 동일한 결과를 리턴 하지만, 인수들의 순서는 반대가 된다.
mysql> SELECT INSTR('foobarbar', 'bar');
-> 4
mysql> SELECT INSTR('xbar', 'foobar');
-> 0
이 함수는 다중 바이트에서도 동작을 하며, 최소 하나의 인수가 바이너리 스트링일 경우에만 문자 크기를 구분한다.
● LCASE(str)
● LEFT(str,len)
● LENGTH(str)
str의 길이를 바이트 단위로 리턴한다. 다중 바이트 문자는 다중 바이트로 계산 (count)된다. 이것은 2 바이트 문자가 5
개 있는 스트링의 경우, LENGTH() 은 10을 리턴하는 반면에, CHAR_LENGTH()는 5를 리턴한다는 것을 의미한다.
mysql> SELECT LENGTH('text');
-> 4
● LOAD_FILE(file_name)
파일을 읽은 다음에 파일의 내용물을 스트링으로 리턴한다. 이 함수를 사용하기 위해서는, 파일은 반드시 서버 호스트에
있어야 하며, 그 파일에 대한 경로 이름을 전체적으로 지정해야 하며, 그리고 FILE 권한을 가져야 한다. 그 파일은 모든 사
용자에게 읽힐 수 있어야 하며 파일의 크기는 max_allowed_packet 바이트 보다는 작아야 한다.
만일 파일이 존재하지 않거나 또는 위의 조건 중에 하나로 인해 파일을 읽을 수가 없게 된다면, 이 함수는 NULL을 리턴한
다.
MySQL 5.0.19 이후 버전에서는, character_set_filesystem 시스템 변수가 리터럴 스트링으로 주어진 파일 이름에 대
한 해석을 제어한다.
mysql> UPDATE t
SET blob_col=LOAD_FILE('/tmp/picture')
WHERE id=1;
● LOCATE(substr,str), LOCATE(substr,str,pos)
첫 번째 신텍스는 str 에서 서브 스트링 substr 가 처음으로 나오는 포지션을 리턴한다. 두 번째 신텍스는, 포지션 pos에
서 시작을 해서, str 에서 서브 스트링 substr 가 처음으로 나오는 포지션을 리턴한다. substr 이 str에 존재하지 않을 경
우에는, 0을 리턴한다.
mysql> SELECT LOCATE('bar', 'foobarbar');
-> 4
mysql> SELECT LOCATE('xbar', 'foobar');
-> 0
mysql> SELECT LOCATE('bar', 'foobarbar', 5);
-> 7
이 함수는 다중 바이트에서도 동작을 하며, 인수 중에서 최소 하나라도 바이너리 스트링일 경우에만 문자 크기를 구분한
다.
● LOWER(str)
현재 (current) 문자 셋 매핑에 따라서 스트링 str 의 모든 문자를 소문자로 변경 시켜서 리턴한다. 디폴트는 latin1
(cp1252 West European).
mysql> SELECT LOWER('QUADRATICALLY');
-> 'quadratically'
이 함수는 다중 바이트에서도 동작을 한다.
● LPAD(str,len,padstr)
왼쪽에 스트링 padstr 를 집어 넣어서 문자의 길이를 len 만큼 되도록 한 스트링 str 을 리턴한다. 만일 str 이 len 보다 길
다면, 리턴 값은 len 길이 만큼 줄어 든다.
mysql> SELECT LPAD('hi',4,'??');
-> '??hi'
mysql> SELECT LPAD('hi',1,'??');
-> 'h'
● LTRIM(str)
-> 'barbar'
이 함수는 다중 바이트에서도 동작을 한다.
● MAKE_SET(bits,str1,str2,...)
bits 셋에 대응되는 비트를 가지고 있는 스트링으로 구성된 셋 값 (콤마 문자로 구분된 서브 스트링을 가지고 있는 스트
링)을 리턴한다. str1은 비트 0에 대응되고, str2 은 1에 대응되며, 계속 이런 식으로 대응이 된다. str1, str2, ... 에 있는
NULL 값은 결과에 따라 나오지 않는다.
mysql> SELECT MAKE_SET(1,'a','b','c');
-> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
-> 'hello,world'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');
-> 'hello'
mysql> SELECT MAKE_SET(0,'a','b','c');
-> ''
● MID(str,pos,len)
● OCT(N)
N의 8진 값에 해당하는 스트링 표현식을 리턴하는데, 여기에서 N 은 (BIGINT) 번호가 된다. 이것은 CONV(N,10,8)과
같다. 만일 N 이 NULL이면, NULL을 리턴한다.
mysql> SELECT OCT(12);
-> '14'
● OCTET_LENGTH(str)
● ORD(str)
만일 If the leftmost character of the string스트링 str 의 가장 왼쪽의 문자가 다중 바이트 문자라면, 그 문자에 대한 코
드를 리턴하는데, 그 값은 아래의 공식을 사용해서 얻어낸다:
(1st byte code)
+ (2nd byte code × 256)
+ (3rd byte code × 2562) ...
만일 가장 왼쪽의 문자가 다중 바이트 문자가 아니라면, ORD()는 ASCII() 함수와 같은 값을 리턴한다.
mysql> SELECT ORD('2');
-> 50
● POSITION(substr IN str)
● QUOTE(str)
SQL 명령문에서 이스케이프된 데이터 값으로 사용할 수 있는 결과를 만들기 위해 스트링에 인용 부호를 준다. 만일 인수
가 NULL이면, 리턴 값은 인용 부호가 없는 단어 “NULL” 이 나오게 된다.
mysql> SELECT QUOTE('Don₩'t!');
-> 'Don₩'t!'
mysql> SELECT QUOTE(NULL);
-> NULL
● REPEAT(str,count)
count 횟수 만큼 반복된 스트링 str 으로 구성된 스트링을 리턴한다. 만일 count 가 1 보다 작을 경우에는, 빈 스트링을 리
턴한다. str 또는 count 가 NULL이라면, NULL을 리턴한다
mysql> SELECT REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'
● REPLACE(str,from_str,to_str)
스트링 from_str 가 나온 부분을 모두 스트링 to_str로 대체해서 스트링 str 을 리턴한다. REPLACE()은
from_str에 대한 검색을 할 때 문자 크기를 구분해서 매칭을 실행한다.
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'
이 함수는 다중 바이트에서도 동작을 한다.
● REVERSE(str)
● RIGHT(str,len)
● RPAD(str,len,padstr)
스트링 padstr 를 오른쪽에 집어 넣어서 len 문자 길이 만큼 str을 만들어서 리턴한다. 만일 str 가 len 보다 길다면, 리턴
값은 len 문자 만큼 짧아진다.
mysql> SELECT RPAD('hi',5,'?');
-> 'hi???'
mysql> SELECT RPAD('hi',1,'?');
-> 'h'
이 함수는 다중 바이트에서도 동작을 한다.
● RTRIM(str)
● SOUNDEX(str)
● SPACE(N)
len 인수가 없는 형태는 포지션 pos에서 시작을 하는 서브 스트링을 스트링 str 에서 리턴 한다. len 인수를 가지고 있는
형태는 포지션 pos에서 시작을 해서 서브 스트링 len 문자를 리턴한다. FROM을 사용하는 형태는 표준 SQL 신텍스이다.
pos의 값으로 음수를 사용하는 것도 가능하다. 음수를 사용할 경우에는, 서브 스트링의 시작점이 스트링의 처음이 아닌 끝
에서부터 pos 문자 위치가 된다. 음수 값은 이 함수의 어떤 형태에서도 사용이 가능하다.
mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica'
mysql> SELECT SUBSTRING('Sakila', -3);
-> 'ila'
mysql> SELECT SUBSTRING('Sakila', -5, 3);
-> 'aki'
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
-> 'ki'
이 함수는 다중 바이트에서도 동작을 한다.
만일 len 이 1 보다 작으면, 그 결과는 빈 스트링이 된다.
SUBSTR()은 SUBSTRING()과 동일하다.
● SUBSTRING_INDEX(str,delim,count)
구분자 (delimiter) delim가 count 만큼 나오기 전에 스트링 str 에서 서브 스트링을 리턴한다. 만일 count 가 양수
(positive)라면, 마지막 구분자의 왼쪽에 있는 모든 것들이 리턴된다 (왼쪽부터 계산이 됨). 만일 count 가 음수일 경우에
는, 마지막 구분자의 오른쪽에 있는 모든 것들이 리턴된다 (오른쪽부터 계산됨). SUBSTRING_INDEX()는 delim에 대
한 검색을 할 때 문자의 크기를 구분한다.
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'
이 함수는 다중 바이트를 지원한다.
스트링 str 를 모든 remstr 접두사 (prefixes) 또는 접미사를 제거한 상태로 리턴한다. 만일 BOTH, LEADING, 또는
TRAILING 중의 어느 것도 주어지지 않는다면, BOTH가 주어진 것으로 간주된다. remstr 는 선택 사항이며, 만일 지정
되지 않을 경우에는, 스페이스가 제거된다.
mysql> SELECT TRIM(' bar ');
-> 'bar'
mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx'
mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar'
mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'
이 함수는 다중 바이트를 지원한다.
● UCASE(str)
● UNHEX(str)
HEX(str)와는 반대 연산을 실행한다. 즉, 이 함수는 인수에 있는 각각의 16진수를 숫자로 해석을 하고 그 숫자에 대응하
는 문자로 변환을 시킨다. 그 결과로 나오는 문자들은 바이너리 스트링으로 리턴된다.
mysql> SELECT UNHEX('4D7953514C');
-> 'MySQL'
mysql> SELECT 0x4D7953514C;
-> 'MySQL'
mysql> SELECT UNHEX(HEX('string'));
-> 'string'
mysql> SELECT HEX(UNHEX('1267'));
-> '1267'
● UPPER(str)
Returns 스트링 str 를 현재의 (current) 문자 셋 매핑에 따라서 대문자로 변환이 된 모든 문자와 함께 리턴한다. 디폴트
는 latin1 (cp1252 West European).
mysql> SELECT UPPER('Hej');
-> 'HEJ'
이 함수는 다중 바이트를 지원한다.
제목검색
상위메뉴리스트 ◆ 12.4. 숫자 함수
12.4 숫자 함수 12.4.2. 수학 함수
12.4.1 산술 연산자
12.4.2 수학 함수
http://www.mysqlkorea.com/develop/sub_07.html?lcate=12&mcate=4&scate=0&idx=18652006-08-08 오후 6:14:08
:::MySQL Korea:::
제목검색
12.4. 숫자 함수 일반적인 산술 연산자를 사용할 수가 있다. -, +, 그리고 * 의 경우, 양쪽의 인수가 모두 정수일 경우에는 BIGINT (64-bit) 정밀
12.4.1 산술 연산자 도로 계산된다는 점을 알아두자. 만일 인수 중의 하나가 부호화되지 않은 정수라면, 그리고 다른 인수 또한 정수일 경우에는, 그 결
과는 부화화 되지 않은 정수가 된다. Section 12.8, “캐스트 함수 (Cast Functions)와 연산자”.
● +
덧셈:
-> 8
● -
뺄셈:
-> -2
● -
mysql> SELECT - 2;
-> -2
● *
곱셈:
-> 15
-> 324518553658426726783156020576256.0
-> 0
● /
나눗셈:
-> 0.60
-> NULL
처리되는 문맥의 결과가 정수로 변환되는 경우에만 나눗셈을 BIGINT과 함께 사용할 수가 있다.
● DIV
-> 2
제목검색
상위메뉴리스트 ◆ 12.4.2. 수학 함수
12.4.2 수학 함수
● ABS(X)
X의 절대 값을 리턴한다.
-> 2
-> 32
● ACOS(X)
-> 0
-> NULL
-> 1.5707963267949
● ASIN(X)
-> 0.20135792079033
+-------------+
| ASIN('foo') |
+-------------+
| 0|
+-------------+
+---------+------+-----------------------------------------+
+---------+------+-----------------------------------------+
+---------+------+-----------------------------------------+
● ATAN(X)
-> 1.1071487177941
-> -1.1071487177941
● ATAN(Y,X), ATAN2(Y,X)
-> -0.78539816339745
-> 1.5707963267949
● CEILING(X), CEIL(X)
X 보다는 작지 않은 가장 작은 정수 값을 리턴한다.
-> 2
-> -1
● COS(X)
-> -1
● COT(X)
X 의 코 탄젠트 값을 리턴한다.
-> -1.5726734063977
-> NULL
● CRC32(expr)
싸이클릭 리던던시 체크 값 (cyclic redundancy check value)을 계산한 다음에 32-비트 부호화되지 않은 값을 리턴한
다. 인수가 NULL이면 NULL을 리턴한다. 인수는 스트링 값이 되어야 한다.
-> 3259397556
-> 2501908538
● DEGREES(X)
-> 180
-> 90
● EXP(X)
-> 7.3890560989307
-> 0.13533528323661
-> 1
● FLOOR(X)
X 보다 크지 않은 정수 중에 가장 큰 값을 리턴 한다.
-> 1
-> -2
● FORMAT(X,D)
숫자 X 의 형태를 '#,###,###.##'로 변경 시키고, D 자릿수 위치에서 절사를 한 다음에, 그 결과를 스트링으로 리턴한
다. 보다 자세한 사항은, Section 12.3, “스트링 함수”를 참조할 것.
● LN(X)
-> 0.69314718055995
-> NULL
● LOG(X), LOG(B,X)
-> 0.69314718055995
-> NULL
-> 16
-> 2
● LOG2(X)
-> 16
-> NULL
LOG2()는 스토리지용으로 필요한 비트의 수가 얼마나 되는지를 알아 보는데 유용하다. 이 함수는 LOG(X) / LOG(2)과
동일하다.
● LOG10(X)
-> 0.30102999566398
-> 2
-> NULL
● MOD(N,M), N % M, N MOD M
-> 4
-> 1
-> 2
-> 2
-> 1.5
● PI()
-> 3.141593
-> 3.141592653589793116
● POW(X,Y), POWER(X,Y)
Y 제곱이 된 X 값을 리턴한다.
-> 4
-> 0.25
● RADIANS(X)
-> 1.5707963267949
● RAND(), RAND(N)
0 과 1 사이의 무작위 부정 소수점 값 v 를 리턴한다 (즉, 0 <= v <= 1.0 사이의 범위). 만일 정수 인수 N이 지정 되
었다면, 이것은 시드 값(seed value)로 사용되며, 반복 시퀀스를 만들어 낸다.
-> 0.9233482386203
-> 0.15888261251047
-> 0.15888261251047
-> 0.63553050033332
-> 0.70100469486881
-> 0.15888261251047
ORDER BY 구문에서는 RAND() 값을 사용하는 컬럼을 사용할 수가 없는데, 그 이유는 ORDER BY가 그 컬럼을 여러 번
계산하기 때문이다. 하지만, 아래와 같이 무작위로 열을 추출할 수는 있다:
LIMIT과 결합이 된 ORDER BY RAND()는 열로 이루어진 셋에서 무작위 샘플을 선택하는 경우에 유용하게 사용할 수
가 있다:
mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d -> ORDER BY RAND() LIMIT 1000;
WHERE 구문에 있는 RAND()는 WHERE 구문이 실행될 때마다 반복적으로 계산된다는 점을 알아 두기 바란다.
RAND()는 완벽한 무작위 제너레이터는 아니지만, 동일 MySQL 버전을 사용하고 있는 플랫폼간에 이식성이 있는 ad
hoc 랜덤 숫자를 만들기에는 속도가 빠른 방식이다.
● ROUND(X), ROUND(X,D)
인수 X를 리턴 하는데, 이때에는 이와 가장 가까운 정수로 절사가 된다. 두 개의 인수를 사용하면, D 자릿수에서 절사가
된 X 가 리턴 된다. D 는 음수로 표시될 수도 있는데, 이렇게 하면 소수점에서 왼쪽으로 D 자리에 있는 X 의 값이 0 이 된
다.
-> -1
-> -2
-> 2
-> 1.3
-> 1
-> 20
리턴 타입은 첫 번째 인수와 같은 타입이 된다. 이것은 정수 인수의 경우에는, 그 결과가 정수 (소수점이 없는)가 된다는
것을 의미하는 것이다.
MySQL 5.0.3 이전에는, 인수가 두 개의 정수 사이의 절반에 해당될 때 ROUND()는 C 라이브러리의 실행에 따라서 값
을 리턴 했다. 이 방식은 항상 반올림, 잘라냄, 0으로 만들기와 같은 방식을 취했다. 만일 한 가지 방식의 절사 (rounding)
방식만을 사용하고자 할 경우에는 TRUNCATE() 또는 FLOOR()와 같은 함수를 대신 사용하는 것이 좋다.
MySQL 5.0.3 이후에는, ROUND()는 첫 번째 인수가 10진수 값일 경우에는 정확한 인수 값을 얻기 위해서 정밀도 수학
라이브러리(precision math library)를 사용한다:
❍ 정확한 숫자를 얻기 위해서, ROUND()는 “반올림 (round half up)” 또는 “가장 가까운 값으로 절사 (round
toward nearest)” 규칙을 사용한다: 어떤 수의 소수점 이하 부분이 .5 보다 크거나 같을 경우에는, 그 수가 양수
라면 바로 다음의 정수로, 그 수가 음수일 경우에는, 바로 이전 정수로 절사 (round)를 한다 (즉, 소수 부분을 0 으
로 만든다). 소수점 이하의 숫자가 .5보다 작을 경우에는, 그 수가 양수라면 바로 이전 정수로, 음수일 경우에는 바
로 다음 정수로 된다.
❍ 추정 값 숫자에 대해서는, C 라이브러리에 따라서 그 결과가 나온다. 대부분의 시스템에서는, ROUND()가 "가장
근접한 짝수로 절사 (round to nearest even)" 규칙을 사용한다: 소수점 이하 부분이 있는 값은 가장 근접한 정수
로 된다.
+------------+--------------+
| ROUND(2.5) | ROUND(25E-1) |
+------------+--------------+
|3 | 2|
+------------+--------------+
● SIGN(X)
인수의 부호를 -1, 0, 또는 1로 리턴 하는데, 여기에서 리턴 되는 숫자는 각각 음수, 0, 양수를 나타내는 것이다.
-> -1
-> 0
-> 1
● SIN(X)
-> 1.2246063538224e-16
-> 0
● SQRT(X)
-> 2
-> 4.4721359549996
-> NULL
● TAN(X)
-> -1.2246063538224e-16
-> 1.5574077246549
● TRUNCATE(X,D)
-> 1.2
-> 1.9
-> 1
-> -1.9
-> 100
-> 1028
제목검색
12. 함수와 연산자 이 섹션에서는 임시 값 (temporal value)을 처리하는 함수에 대해서 설명을 하기로 하겠다.
12.5. 날짜 및 시간 함수(1) 아래의 명령문은 날짜 함수 사용에 대한 예문이다. 예문에 나와 있는 쿼리는 최근 30일 동안에 date_col 값을 가지고 있는 모든 열
-> NULL
● ADDTIME(expr1,expr2)
ADDTIME()는 expr2 를 expr1 에 추가한 다음에 그 결과를 리턴 한다. expr1 는 타임 또는 데이트 타임 수식이며,
expr2 는 타임 수식이다.
mysql> SELECT ADDTIME('1997-12-31 23:59:59.999999',
-> '1 1:1:1.000002');
-> '1998-01-02 01:01:01.000001'
mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');
-> '03:00:01.999997'
● CONVERT_TZ(dt,from_tz,to_tz)
환도 일어나지 않는다. TIMESTAMP 범위는 Section 11.1.2, “날짜 및 시간 타입 개요”를 참조하기 바란다.
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
-> '2004-01-01 13:00:00'
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
-> '2004-01-01 22:00:00'
Note: 'MET' 또는 'Europe/Moscow'와 같은 네임드 타임 존을 사용하기 위해서는, 그 타임 존 테이블은 반드시 올바르
게 설정이 되어 있어야 한다. Section 5.11.8, “MySQL 서버 타임 존 지원”을 참조할 것.
만일 다른 테이블들이 LOCK TABLES과 함께 잠겨 있는 동안에 CONVERT_TZ() 함수를 사용하고자 한다면, 여러분은
반드시 mysql.time_zone_name 테이블도 잠가 두어야 한다.
● CURDATE()
● CURRENT_DATE, CURRENT_DATE()
● CURTIME()
● CURRENT_TIME, CURRENT_TIME()
● CURRENT_TIMESTAMP, CURRENT_TIMESTAMP()
● DATE(expr)
● DATEDIFF(expr1,expr2)
이 함수들은 날짜 산술식 (date arithmetic)을 실행한다. date는 시작 날짜를 지정하는 DATETIME 또는 DATE 값이
다. expr는 시작 날짜에서 더해지거나 빼지는 간격 값 (interval value)를 나타내는 수식이다. expr 는 스트링이다; 이것
은 음수 기호 ‘-’를 사용할 수도 있다. unit 는 수식이 해석되어야 하는 유닛을 가리키는 키워드이다.
INTERVAL 키워드 및 unit 는 문자 크기를 구분하지 않는다.
아래의 테이블은 각각의 unit 값에 대한 expr 인수의 예상 형태를 보여주는 것이다.
MICROSECOND MICROSECONDS
SECOND SECONDS
MINUTE MINUTES
HOUR HOURS
DAY DAYS
WEEK WEEKS
MONTH MONTHS
QUARTER QUARTERS
YEAR YEARS
SECOND_MICROSECOND 'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND 'MINUTES.MICROSECONDS'
MINUTE_SECOND 'MINUTES:SECONDS'
HOUR_MICROSECOND 'HOURS.MICROSECONDS'
HOUR_SECOND 'HOURS:MINUTES:SECONDS'
HOUR_MINUTE 'HOURS:MINUTES'
DAY_MICROSECOND 'DAYS.MICROSECONDS'
YEAR_MONTH 'YEARS-MONTHS'
DATETIME 값이 된다.
날짜 계산식은 또한 INTERVAL을 + 또는 – 연산자와 함께 사용할 수도 있다:
date + INTERVAL expr unit
date - INTERVAL expr unit
INTERVAL expr unit 는, 다른 쪽에 있는 수식이 날짜 또는 데이트 타임 값일 경우에는 + 연산자를 중심으로 어느쪽에
도 올 수가 있다. – 연산자의 경우, INTERVAL expr unit는 오른쪽 부분에만 나올 수가 있는데, 그 이유는 인터벌에서
데이트 타임 또는 날짜를 뺀다는 것이 의미가 없기 때문이다.
mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND;
-> '1998-01-01 00:00:00'
mysql> SELECT INTERVAL 1 DAY + '1997-12-31';
-> '1998-01-01'
mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND;
-> '1997-12-31 23:59:59'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
-> INTERVAL 1 SECOND);
-> '1998-01-01 00:00:00'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
-> INTERVAL 1 DAY);
-> '1998-01-01 23:59:59'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
-> INTERVAL '1:1' MINUTE_SECOND);
-> '1998-01-01 00:01:00'
mysql> SELECT DATE_SUB('1998-01-01 00:00:00',
-> INTERVAL '1 1:1:1' DAY_SECOND);
-> '1997-12-30 22:58:59'
mysql> SELECT DATE_ADD('1998-01-01 00:00:00',
-> INTERVAL '-1 10' DAY_HOUR);
-> '1997-12-30 14:00:00'
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02'
제목검색
12.5. 날짜 및 시간 함수(1)
format 스트링에 따라서date 값을 포맷한다.
12.5 날짜 및 시간 함수(1)
아래에 나와 있는 지정자 (specifier)들은 format 스트링안에서 사용할 수 있다. ‘%’ 문자는 지정자 문자를 포맷하기
12.5 날짜 및 시간 함수(2)
전에 필요한 것이다.
Specifier Description
%D Day of the month with English suffix (0th, 1st, 2nd, 3rd, …)
%f Microseconds (000000..999999)
%H Hour (00..23)
%h Hour (01..12)
%I Hour (01..12)
%k Hour (0..23)
%l Hour (1..12)
%p AM or PM
%S Seconds (00..59)
%s Seconds (00..59)
%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
%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
● DAY(date)
● DAYNAME(date)
● DAYOFMONTH(date)
● DAYOFWEEK(date)
-> 3
● DAYOFYEAR(date)
● FROM_DAYS(N)
● FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)
● GET_FORMAT(DATE|TIME|DATETIME, 'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL')
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,'EUR') '%Y-%m-%d-%H.%i.%s'
GET_FORMAT(DATETIME,'INTERNAL') '%Y%m%d%H%i%s'
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'
● 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)
-> '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()
● LOCALTIMESTAMP, LOCALTIMESTAMP()
● 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)
● MICROSECOND(expr)
● MINUTE(time)
● MONTH(date)
● MONTHNAME(date)
● NOW()
● PERIOD_ADD(P,N)
● PERIOD_DIFF(P1,P2)
P1 와P2 사이의 월별 간격을 리턴하는데, 여기에서 P1 과 P2 는 YYMM 또는 YYYYMM 형태가 되어야 한다. 인수 P1
과 P2 는 날짜 값이 아니라는 점을 유의한다.
● QUARTER(date)
● SECOND(time)
● 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'
두 번째 인수에 대해서 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() 함수는 expr1 – expr2 수식의 결과 값을 리턴하느데, 그 포맷은 expr1을 따른다. expr1 은 시간 또는 데
● SYSDATE()
동작하도록 할 수는 있다.
● TIME(expr)
● TIMEDIFF(expr1,expr2)
TIMEDIFF()은 expr1 – expr2 수식의 결과를 시간 값으로 리턴한다. 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)
● TIMESTAMPADD(unit,interval,datetime_expr)
● TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
● 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)
● TO_DAYS(date)
● UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
만일 아무런 인수를 지정하지 않고 호출을 한다면, 부호를 사용하지 않은 유닉스 타임 스탬프를 리턴한다 ('1970-01-
01 00:00:00' UTC 이후의 초). 만일 UNIX_TIMESTAMP()가 date 인수를 사용해서 호출되었다면, 이 함수는 '1970-
01-01 00:00:00' UTC 이후의 초 형태로 인수 값을 리턴한다. Date는 DATE 스트링, 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_TIMESTAMP를 TIMESTAMP 컬럼에서 사용하는 경우, 이 함수는 내부 타임 스탬프 값을 직접 리턴하고, 의미적
인 (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
● WEEKDAY(date)
● WEEKOFYEAR(date)
● 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
제목검색
12. 함수와 연산자 MySQL은 “proleptic Gregorian calendar”라고 알려진 그레고리력을 사용하고 있다.
12.6. MySQL이 사용하는 달력
http://www.mysqlkorea.com/develop/sub_07.html?lcate=12&mcate=6&scate=0&idx=18702006-08-08 오후 6:15:06
:::MySQL Korea:::
제목검색
전문 검색은 MATCH() ... AGAINST 신텍스를 사용해서 실행된다. MATCH()은 콤마로 구분된 리스트를 가져오는데, 이 리스트
는 검색할 컬럼들의 이름이 된다. AGAINST는 검색에 사용할 스트링을 가져오며, 실행할 검색의 타입이 어떤 것인지를 가리키는
모디파이어 (modifier)를 옵션으로 가져온다. 검색 스트링은 반드시 리터럴 스트링이어야 하며, 변수 또는 컬럼 이름은 될 수 없
다. 전문 검색에는 세 가지 타입이 있다:
● 불리안 검색은 특별한 쿼리 언어 규칙을 사용해서 검색 스트링을 해석한다. 이 스트링은 검색에 사용할 단어를 가진다. 또
MATCH() 함수는 텍스트 콜렉션 (text collection)에 대응해서 특정 스트링에 대한 자연어 검색을 실행한다. 콜렉션이란
FULLTEXT 인덱스에 포함되어 있는 하나 이상의 컬럼 셋이다. 검색 스트링은 AGAINST()에 대한 인수 형태로 주어진다. 테이블
에 있는 각각의 열에 대해서는, MATCH()은 연관도 (relevance value) 리턴한다; 즉, 검색 스트링과 MATCH() 리스트에 명명되
어 있는 컬럼내의 열에 있는 텍스트간의 유사성을 측정한다.
디폴트로는, 검색은 문자의 크기를 구분하지 않고 실행된다. 하지만, 인덱스된 컬럼에 대한 바이너리 콜레션을 사용하면 문자 크기
를 구분하는 전문 검색을 실행할 수가 있다. 예를 들면, latin1 문자 셋을 사용하는 컬럼은 전문 검색을 할 때 문자 크기를 구분하기
위해서 latin1_bin의 콜레션을 할당 받을 수가 있다.
위에 나와 있는 예문과 같이, MATCH() 함수가 WHERE 구문에서 사용되게 되면, 리턴되는 열은 연관도가 높은 순서대로 자동 정
렬이 되어 나오게 된다. 연관도는 음수가 아닌 부동 소수점 숫자이다. 제로 연관도는 유사성이 없다는 것을 의미한다. 연관도는 열
에 있는 단어의 수, 열에 있는 유니크한 단어의 수, 콜렉션에 있는 전체 단어의 수, 그리고 특정 단어를 가지고 있는 열의 숫자등을
기반으로 계산된다.
자연어 전문 검색의 경우, MATCH() 함수에 명명된 컬럼은 여러분이 사용하는 테이블에 있는 FULLTEXT 인덱스에 포함되어 있
는 컬럼과 같아야 하는 제약 조건이 있다. 위의 예문에 나와 있는 쿼리의 경우, MATCH() 함수에 명명된 컬럼 (title 및 body)이
article 테이블의 FULLTEXT 인덱스 정의문에서 명명된 컬럼 이름과 같다는 점을 기억하자. 만일 여러분이 title 또는 body를 개
별적으로 검색하고자 한다면, 여러분은 각각의 컬럼에 대해서 별도의 FULLTEXT 인덱스를 생성해야 할 것이다.
쿼리 확장을 사용한 검색 또는 불리안 검색을 실행하는 것 역시 가능하다. 이러한 검색 타입은 Section 12.7.1, “불리안 전문 검
색”, 그리고 Section 12.7.2, “쿼리 확장을 사용한 전문 검색”을 참고하기 바란다.
위의 예문은 연관도가 낮은 순서대로 열이 리턴되는 곳에서 MATCH() 함수를 어떻게 사용하는지를 보여주는 기본적인 것이다. 다
음에 나오는 예문은 명확하게 연관도를 추출하는 방법에 대해서 보여주고 있다. 리턴되는 열은 순서대로 정렬되지 않는데, 그 이유
는 SELECT 명령문이 WHERE 또는 ORDER BY 구문중의 어느 것도 포함하고 있지 않기 때문이다:
아래에 나오는 예문은 좀더 복잡한 것이다. 예문에 있는 쿼리는 연관도 값을 리턴하고 연관도가 낮은 순서대로 열을 정렬한다. 이러
한 결과를 얻기 위해서는, 여러분은 MATCH()를 두 번 지정해 주어야 한다: 한번은 SELECT 리스트에서 하고 나머지 한번은
WHERE 구문에서 한다. 이렇게 하면 추가적인 오버 헤드가 발생하지 않게 되는데, 그 이유는 MySQL 옵티마이저가 두 개의
MATCH() 호출이 각각 동일한 것이고 전문 검색 코드는 한번만 호출한다는 것을 알기 때문이다.
+----+-------------------------------------+-----------------+
| 4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
| 6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)
MySQL의 FULLTEXT 실행은 모든 실제 문자 (문자, 숫자, 그리고 언더 스코어 문자) 시퀀스를 하나의 단어로 인식한다. 이러한
시퀀스에는 어퍼스크로피 (apostrophe) (‘'’)도 포함되지만, 하나의 열에 하나 이상은 포함되지 않는다. 이것은 aaa'bbb는 하나
의 단어로 인식되지만, aaa''bbb는 두 개의 단어로 인식된다는 것을 의미한다. 단어의 처음 또는 마지막에 나오는 어퍼스트로피는
FULLTEXT 파서 (parser)가 잘라낸다; 'aaa'bbb'는 aaa'bbb 형태가 된다.
디폴트 스톱워드 리스트는 Section 12.7.3, “전문 스톱워드”에 있다. 디폴트 최소 단어 길이 및 스톱워드 리스트는
Section 12.7.5, “ 올바른 MySQL 전문 검색 튜닝”에서 설명하는 방법으로 수정할 수가 있다.
콜렉션 및 쿼리 안에 있는 모든 유효한 단어들은 콜렉션 또는 쿼리에서의 중요도에 따라서 가중치를 가지게 된다. 결론적으로, 하나
의 단어가 여러 열에 등장하게 되면 낮은 가중치를 가지게 되는데, 그 이유는 그러한 단어는 특정 콜렉션에서 낮은 의미를 가지기
때문이다. 반대로, 만일 어떤 단어가 희귀하다면, 그 단어는 높은 가중치를 가지게 된다. 어떤 단어에 대한 가중치는 열의 연관도를
계산하기 위해 결합된 것이다.
이러한 기법은 대형 콜렉션에서도 올바르게 동작을 한다 (주의 깊게 튜닝이 되어야 함). 매우 작은 테이블의 경우, 단어 분포도는
자신의 의미 값을 적절하게 반영하지 못하며, 이러한 모델은 엉뚱한 결과를 만들기도 한다. 예를 들면, 비록 “MySQL”이라는 단
어가 위에 나와 있는 articles 테이블의 모든 열에 나오기는 하지만, 이 단어에 대한 검색은 아무런 결과도 리턴하지 않게 된다:
테이블에 있는 열의 50%와 매치가 되는 단어는 관련된 서류에 위치해 있을 가능성이 덜하다. 사실, 이것들은 연관성이 없는 서류에
서 더 많이 발견이 된다. 인터넷 검색 엔진을 사용해서 인터넷에서 무언가를 찾고자 할 때 이러한 일이 너무 자주 발생한다는 것을
우리는 잘 알고 있다. 이러한 이유로 인해, 이러한 단어를 포함하고 있는 열은 그 단어가 나오는 특정 데이터 셋에 대해서 낮은 가중
치를 할당 받게 되는 것이다. 주어진 단어는 어떤 데이터 셋에서는 50% 이상 나올 수도 있지만 다른 곳에서는 그렇지 않을 수도 있
다.
여러분이 전문 검색이 어떻게 동작을 하는지 보고자 할 때 50%의 쓰레드 홀드 (threshold)는 중요한 의미를 갖는다: 만일 여러분
이 테이블을 하나 생성한 다음에 하나 또는 두개의 텍스트 열만 그 테이블에 삽입한다면, 텍스트에 나오는 모든 단어들은 최소
50% 이상의 열에 존재하게 된다. 그 결과, 어떠한 검색 결과도 얻을 수가 없게 된다. 최소 3개의 열을 삽입해야 한다는 점을 알아두
기 바라며, 가능하면 많은 열을 삽입하도록 한다. Section 12.7.1, “불리안 전문 검색”을 참조할 것.
제목검색
13.2.8.11 MySQL 초기버전 용 Joins로써의 리라이팅 서브쿼리들 13.6.2. 슬레이브 서버 컨트롤을 위한 SQL 문
13.2.10 UPDATE
이 장은 MySQL이 제공하는 모든 SQL 문의 문법에 대해 설명한다. 추가 적인 SQL문에 대한 설명
13.3 MySQL 유틸리티 명령문
은 다음 장을 참조 하라.
13.3.1 DESCRIBE Syntax
13.3.2 USE Syntax
● EXPLAIN 7장 최적화 부분을 참조하라.
13.4 MySQL 트랜잭션 과 잠금문 ● 저장루틴을 위한 SQL문은 17장 스토어드 프로시져 및 기능 부분.
13.4.1 START TRANSACTION, COMMIT, 와 ROLLBACK ● 쓰기 트리거문은 18장 트리거를 참조하라.
13.4.2 Roll back될 수 없는 SQL문 ● 뷰에 관련된 문은 19장 뷰를 참조하라.
13.4.3 암묵적 Commit을 유발하는 SQL문
13.4.4 SAVEPOINT 와 ROLLBACK TO SAVEPOINT *본 13장은 조우현 회원님께서 번역하셨습니다.
13.4.5 LOCK TABLES 와 UNLOCK TABLES
13.4.6 SET TRANSACTION
13.4.7 XA 트랜잭션
13.4.7.1 XA Transaction SQL 신텍스
13.4.7.2 XA Transaction States
13.5 데이터베이스 관리문
13.5.1 계정 관리문
13.5.1.1 CREATE USER
13.5.1.2 DROP USER Syntax
13.5.1.3 GRANT
13.5.1.4 RENAME USER
13.5.1.5 REVOKE
13.5.1.6 SET PASSWORD
13.5.2 테이블 유지보수 문
13.5.2.1 ANALYZE TABLE
13.5.2.2 BACKUP TABLE
13.5.2.3 CHECK TABLE
13.5.2.4 CHECKSUM TABLE
13.5.2.5 OPTIMIZE TABLE
13.5.2.6 REPAIR TABLE
13.5.2.7 RESTORE TABLE
13.5.3 SET
13.5.4 SHOW
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE
13.5.4.5 SHOW CREATE PROCEDURE 와 SHOW CREATE FUNCTION
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW
제목검색
상위메뉴리스트 ◆
13.1. 데이터정의 문
13. SQL 문법(SQL Statement Syntax)
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=1&scate=0&idx=16092006-08-08 오후 6:16:07
:::MySQL Korea:::
제목검색
ALTER DATABASE는 여러분이 데이터베이스의 전체적인 특징들을 변경할 수 있도록 한다. 이들 특징들은 데이터베이스 디렉토
리의 db.opt 파일에 저장 되어 있다. ALTER DATABASE를 사용하기 위해서는 여러분이 데이터베이스 에서 ALTER 권한을 가
져야 한다. ALTER SCHEMA는 MySQL 5.0.2의 ALTER DATABASE와 같다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=1&scate=1&idx=16102006-08-08 오후 6:16:12
:::MySQL Korea:::
제목검색
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| table_options
ALTER TABLE은 여러분이 현재 테이블의 구조를 변경할 수 있도록 한다. 한 예로, 여러분은 컬럼 추가/삭제, 인덱스 생성/삭제,
기존 컬럼의 type변경, 테이블 혹은 컬럼 자체의 이름 변경을 할 수 있다. 여러분은 또한 테이블의 type과 테이블을 위한 주석을 변
경 할 수도 있다.
여러분이 하나의 컬럼 지정을 변경 하기 위해 ALTER TABLE을 사용하지만 DESCRIBE tbl_name 에는 여러분의 컬럼이 변경하
지 않은 것으로 표시된다면, 13.1.5.1” 암묵적인 컬럼 지정 변경”에서 설명하는 이유 중 하나로 인해 MySQL이 변경한 사항을
인식하지 못할 수 있다.
대부분의 경우, ALTER TABLE은 원본 테이블의 임시 복사본을 만들어서 작업을 한다. 변경 이 복사본에서 수행되고 원본 테이블
이 지워지고 새로이 이름 지워진다. ALTER TABLE이 수행되는 동안 원본 테이블은 다른 클라이언트들에 의해 읽혀질 수 있다.
테이블에 업데이트와 쓰기는 새로운 테이블이 준비될 때까지 거부되며, 자동으로 update의 실패 없이 새로운 테이블로 다시 향한
다.
여러분이 다른 옵션 없이 ALTER TABLE 테이블이름 RENAME TO 새 테이블 이름 을 사용한다면 MySQL은 단순히 테이블 이
름과 일치하는 파일들의 이름만 바꾸게 된다. 이때는 임시 테이블을 생성할 필요가 없다. (여러분은 테이블들을 재 명명 하기 위해
서 RENAME TABLE 문을 사용할 수 있다. 13.1.9 "RENAME TABLE"을 참조하라.)
여러분이 RENAME보다 ALTER TABLE에 옵션을 사용하면 MySQL은 컬럼의 이름을 변경하는 것과 같이 그 데이타가 복사될
필요가 없을 지라도, 항상 임시 테이블을 생성한다. MyISAM 테이블들에 대해, 여러분은 myisam_sort_buffer_size시스템 변수
를 높은 값으로 설정함으로써 인덱스 재 생성 작업(이것은 변경 처리 작업의 가장 느린 부분에 해당한다.)의 속도를 증가 시킬수 있
다
ALTER TABLE을 사용하기 위해 여러분은 테이블에 대한 ALTER, INSERT 그리고 CREATE 권한을 가져야 한다.
IGNORE는 표준 SQL에서 MySQL의 확장이다. 이것은 새로운 테이블에 unique key들이 중복될때 ALTER TABLE이 작동하는
방법이나 엄격 모드(strict mode)가 장동할때 warning이 났을때 등을 제어 한다. IGNORE가 명시 된 경우, 즉 첫번째 열이
unique key에서 중복 되어 존재 할 경우 , 다른 충돌되는 열들은 삭제 된다. 정확 하지 않은 값들은 가능한 수용 가능한 값으로 수
정된다.
여러분은 한 ALTER TABLE문에서 콤마로 구분하여 다수 ADD, ALTER, DROP 그리고 CHANGE문을 사용할 수 있다. 이것은
표준 SQL에 대한 MySQL의 확장인데 이것은 각 ALTER TABLE문에서 각 구문의 하나를 허락하는 것이다. 예를 들면, 하나의 문
에서 여러개의 컬럼을 drop하려 할경우 다음과 같이 하면 된다.
CHANGE col_name, DROP col_name, 그리고 DROP INDEX는 표준 SQL에대한 MySQL의 확장이다.
만일 여러분이 컬럼의 이름이 아닌 type을 변경하기 원한다 해도 CHANGE문은 앞의 것과 같이 사용한다. 예로서 아래와 같이 사
용 할 수 있다.
여러분은 한 인덱스가 컬럼에 존재하도록 하기 위해 컬럼을 짧게하는 경우, 결과 적으로 컬럼 길이가 인덱스 길이보다 짧을때
MySQL은 인덱스를 자동으로 짧게 한다.
여러분이 CHANGE 나 MODIFY를 사용하여 데이터 타입을 변경 하는 경우, MySQL은 기존의 컬럼 값들을 가능한한 새로운 타입
으로 변경 하려 한다.
한 테이블 열에서 특정 위치에 컬럼을 추가 하기 위해서는 FIRST 혹은 AFTER 컬럼 이름 을 사용한다. 기본적으로는 컬럼을 가
장 마지막 부분에 추가 한다. 여러분은 또한 CHANGE나 MODIFY 기능들에서 FIRST 와 AFTER를 사용할 수 있다.
ALTER ... SET DEFAULT 혹은 ALTER ... DROP DEFAULT은 각각 한 커럼에 대한 새로운 기본 값을 명시 하거나 기존 값
을 지우도록 한다. 기존 기본값이 지워지고 그 컬럼이 NULL값이 될 수 있으면 새로운 기본 값은 NULL이 된다. 만일 그 컬럼이
NULL이 될 수 없다면, MySQL은 기본 값을 할당하는데 이에 대한 내용은 11.1.4 "데이터 타입 기본값들(Data Type Default
Values)"를 참조 하라.
DROP INDEX는 한 인덱스를 삭제 한다. 이것은 표준 SQL에 대한 MySQL의 확장이다. 13.1.7 "DROP INDEX"를 참조 하라.
컬럼들이 한 테이블로부터 삭제되면, 그 컬럼들은 또한 그들이 한 부분인 인덱스로부터 삭제 된다. 한 인덱스를 구성하는 모든 컬럼
들이 삭제 되면 그 인덱스 또한 삭제 된다.
한 테이블이 단지 하나의 컬럼을 가지고 있을 경우, 그 컬럼은 삭제 될 수 없다. 여러분이 의도하는 것이 테이블을 삭제 하는 것이라
면 DROP TABLE을 대신 사용하도록 하라.
여러분이 테이블에 UNIQUE INDEX나 PRIMARY KEY를 추가 하면, 이것은 비 unique 인덱스 앞에 저장되어 MySQL이 가능한
한 빨리 중복 키를 찾을 수 있도록 한다.
ORDER BY는 여러분이 특정 순서대로 열을 가진 새 테이블을 생성하도록 한다. 삽입/삭제문 사용 후에는 이 순서대로 유지 되지
않음을 주의 하도록 한다. 이 옵션은 대부분 어떤 순서로 열들을 질의 하는 경우 가장 유용하다. 그 테이블에 대해 큰 변경후에 이
옵션을 사용 함으로써 여러분은 높은 처리 능력을 가지게 된다. 어떤 경우, 이것은 테이블이 여러분이 원하는 순서대로 정렬할 컬럼
의 순서대로 있다면 MySQL이 정렬을 쉽게 할 것이다.
이 특징은 명백하게(explicitly) 활성화 될 수 있다. ALTER TABLE...DISABLE KEYS는 MySQL에게 MyISAM 테이블에서
non-unique 인덱스들을 업데이트 하는것을 정지 시키도록 한다. MySQL은 하나씩 key들을 삽입하는 것보다 훨씬 빠른 특별한
알고리즘으로 이것을 수행하며, 대량의 삽입 작업 들을 수행 하기 이전 키들을 금지하여 현저한 속도 향상이 이루어 진다. ALTER
TABLE....DISABLE KEYS는 이전에 언급한 권한 외에 추가적으로 INDEX 권한을 요구한다.
FOREIGN KEY 와 REFERENCES 구문은 InnoDB 저장 엔진에 의해 지원되는데, 이들은 ADD [CONSTRAINT [symbol]]
FOREIGN KEY (...) REFERENCES ... (...)을 제공한다. 14.2.6.4 “FOREIGN KEY 제약"을 참고한다. 다른 저장 엔진들에 대해
서는 이 구문이 분석은 되어지나 무시된다. CHECK 구문은 모든 저장 엔진에 의해서 무시된다. 이에 대한 내용은 13.1.5
“CREATE TABLE ”을 참조하라. 이처럼 구문을 받아들이지만 무시 하는 이유는 호환성때문인데 다른 SQL 서버로 포팅을 쉽게
한다던가 테이블을 생성하는 응용 프로그램을 실행 시키기 쉽게 하도록 하기 위해서이다. 자세한 내용은 1.9.5 "표준 SQL과
여러분은 하나의 ALTER TABLE문의 부분 절에서 외래키를 추가 와 삭제를 할 수 없다. 분리된 문장들에서 사용하여야 한다.
여러분이 테이블 기본 character set과 모든 문자 열들(CHAR, VARCHAR,TEXT)을 새로운 character set으로 변경 하고자 한
다면 다음과 같은 구문을 사용한다.
주의: 앞의 연산은 컬럼 값을 변환한다. 이는 여러분이 한 character set(ex. latin1)안에 하나의 컬럼을 가지고 있고 저장된 값들
이 실제 다른 것들을 사용한다면 여러분이 원하는 바가 아니다. The preceding operation converts column values between
the character sets. This is not what you want if you have a column in one character set (like latin1) but the stored
values actually use some other, incompatible character set (like utf8). In this 이 경우 여러분은 각 컬럼에 대해 다음과 같
이 해 주어야 한다.
여러분이 CONVERT TO CHARACTER SET binary로 명시 하면, CHAR, VARCHAR그리고 TEXT 컬럼들은 그것들과 대응되
는 바이너리 string 타입들로 변환 된다(BINARY, VARBINARY, BLOB). 이는 컬럼들이 더이상 character set을 가지지 않게 되
며 CONVERT TO연산이 적용되지 않게 됨을 의미한다.
DEFAULT는 옵션 사항이다. 기본 character set은 여러분이 테이블에 추가 하려는 새 컬럼을 위해 character set을 명시 하지 않
으면 기본으로 설정된다. (예를 들면, ALTER TABLE... ADD 컬럼 과 같은 문장)
한 .ibd 파일안에서 테이블 공간을 가지고 생성된 InnoDB 테이블에 대해서는 그 파일은 제외 되고 반입 될 수 있다.
.idb파일을 제외 하기 위해서는 다음 문장을 사용한다.
이문장은 현재 .ibd파일을 삭제 하게 되므로 여러분은 백업을 가져야 한다. 테이블공간 파일이 제외되는 동안 테이블에 접근 하려
한다면 에러를 발생시킨다.
C API 함수인 mysql_info()를 사용하면 여러분은 얼마나 많은 레코드들이 복사 되었는지 알 수 있으며, (IGNORE를 사용할 경
우)unique 키 값의 중복으로 인해서 얼마나 많은 레코드가 지워 졌는지 알 수 있다. 이에 대한 자세한 사항은 22.2.3.34
"mysql_info()함수"를 참조하라.
INTEGER 형 컬럼을 TINYINT NOT NULL으로 변경 하기 위해서, b에서 c로 이름을 변경 하는 것 뿐만 아니라 CHAR(10)에서
CHAR(20)으로 변경하기 위해서는 아래 문장을 사용한다.
컬럼 c를 삭제 하려면
AUTO_INCREMENT 컬럼들은 인덱싱 되어야 하기 때문에, 컬럼 c를 PRIMARY KEY로 지정 했다. 또한 primary 키 컬럼들은
NULL이 될수 없기 때문에 c를 NOT NULL로 정의 했다.
여러분이 AUTO_INCREMENT 컬럼을 추가할때 컬럼 값들은 자동으로 순차적인 숫자로 채워 진다. MyISAM 테이블들에 대해서
여러분은 ALTER TABLE 이전에 SET INSERT_ID=값 을 실행 하거나 AUTO_INCREMENT=값 테이블 옵션을 사용하여 첫
sequence number를 설정 할 수 있다. 13.5.3 "SET" 을 참조하라.
MyISAM 테이블에서는 여러분이 AUTO_INCREMENT 컬럼을 변경 하지 않으면 sequence number는 영향을 받지 않는다. 만
약 여러분이 AUTO_INCREMENT 컬럼을 제거 하면 그 숫자들은 시작 값을 1로 재 설정 된다.
제목검색
13. SQL 문법(SQL Statement Syntax) CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] 데이터베이스 이름
13.1. 데이터정의 문 [생성 옵션 [, 생성 옵션] ...]
CREATE DATABASE 는 주어진 이름으로 데이터베이스를 생성한다. CREATE DATABASE를 사용하기 위해서는 데이터베이스에 대
해 생성 권한을 필요로 한다. CREATE SCHEMA 는 MySQL 5.0.2에서 CREATE DATABASE와 동일하다.
허가된 데이터베이스 이름에 대한 규칙은 9.2 "데이터베이스, 테이블 인덱스, 컬럼 그리고 Alias 이름들"을 참고 한다. 여러분이 데
이터 생성시 IF NOT EXIST를 명시 하지 않은 경우 데이터베이스가 존재하면 에러가 발생한다.
생성 옵션들은 데이터베이스이 특징을 명시한다. 데이터베이스 특징은 데이터베이스 디렉토리의 db.opt파일 안에 저장된다.
CHARACTER SET문은 기본 데이터베이스 character set을 명시 한다. COLLATE문은 기본 데이터베이스 정렬을 명시 한다.
10 장 "Character Set 지원" 은 character set 이름과 정렬 이름에 대해 설명 한다.
MySQL의 데이터베이스는 데이터베이스안의 테이블들에 해당하는 파일들을 포함하는 디렉토리들로 구현 된다. 처름 생성 될때는
데이터베이스 안에 테이블이 존재 하지 않기 때문에 CREATE DATABASE 문장은 단지 MySQL 데이터 디렉토리 아래에 하나의
디렉토리와 db.opt 파일만을 생성 한다.
여러분이 직접 데이터 디렉토리 하에 하나의 디렉토리를 생성하면(예를 들면 , mkdir등의 명령) 서버는 그것을 데이터 디렉토리로
인식하며 SHOW DATABASE명령에 대해 내용을 보여준다.
제목검색
인덱스 컬럼 이름:
컬럼 이름 [(길이)] [ASC | DESC]
CREATE INDEX는 인덱스를 생성하기 위해 ALATER TABLE 문으로 매핑 된다. 자세한 내용은 13.1.2, "ALTER TABLE"을 참
조 하라. 어떻게 MySQL이 인덱스들을 사용하는지에 대해 좀더 자세한 정보를 원한다면 7.4.5, "MySQL의 인덱스 사용방법" 부분
을 참조하라.
일반적으로 여러분은 CREATE TABLE문으로 테이블이 생성될때 모든 인덱스를 생성 할 수 있다. 이에 대한 내용은 13.1.5
"CREATE TABLE"부분을 참조하라. CREATE INDEX 는 여러분이 기존 테이블에 인덱스를 추가할 수 있도록 한다.
(컬럼1,컬럼2,...)형태의 컬럼 리스트는 다수 컬럼 인덱스를 생성한다. 인덱스 값들은 주어진 컬럼들의 값들을 연계 하여 형성된다.
CHAR, VARCHAR, BINARY 와 VARBINARY 컬럼들에 대해 인덱스들은 인덱스의 길이를 명시하기 위해 컬럼 이름 (길이)문의 사용
과 같이 단지 한 컬럼의 부분만을 사용하여 생성 될 수 있다. 인덱스는 CHAR 와 VARCHAR 컬럼들에 대한 각 컬럼 값의 처음 길
이 문자들과, BINARY와 VARBINARY컬럼들을 위한 각 컬럼 값의 첫 길이 바이트 들로 구성된다. BLOB와 TEXT컬럼들 또한 인
덱싱 될 수 있으나 ,prefix length(전위어 길이)가 주어져야 한다.
컬럼의 이름들이 첫 10자리가 다르다면, 이 인데그는 전체 이름 컬럼으로 부터 생성된 인덱스 보다 느려져서는 안된다. 또한 인덱
스에 대한 부분 컬럼사용은 인덱스 파일을 훨씬 작게 만들수 있는데 이는 디스크 공간을 많이 절약 하게 디며 INSERT 작업을 빠르
게 처리 하게 된다.
Prefix들은 1000바이트 까지 될 수 있다( InnoDB 테이블들은 767바이트 까지). Prefix제한은 CREATE INDEX 문에서 prefix의
길이가 비 바이너리 데이터 타입(CHAR, VARCHAR, TEXT)에서 문자열의 수로 해석 되는 것과 달리, 바이트들로 측정됨을 주
시 하라. 멀티byte character set을 사용하는 컬럼의 prefix 길이를 명시 할때 이를 기억 하도록 한다.
MySQL 5.0에서
오직 MyISAM, InnoDB, BDB 혹은 MEMORY 저장 엔진을 사용할 경우에만 NULL을 가지는 컬럼에 인덱스를 추가할수 있다.
모든 저장 엔진은 여러분이 인덱스를 생성할때 이를 명시하도록 한다. 인덱스 타입을 위한 이 구문은 USING 타입 이름 을 명시 한
다. 다른 저장 엔진에 의해 지원되는 수용가능한 타입 이름 값이 다음 테이블에서 보여진다. 다수 인덱스 타입들이 나열 된 곳에서
첫번째 것은 인덱스 타입 옵션이 주어지지 않을경우 첫번째가 기본 값이 된다.
저장 엔진 가능 인덱스 타입
MyISAM BTREE
InnoDB BTREE
MEMORY/HEAP HASH, BTREE
사용 예:
TYPE 의 타입 이름은 인덱스 타입을 명시 하기 위해 USING 타입 이름 와 동일하게 사용된다. 추가적으로 인덱스 명시 문에서 인덱
스 타입보다 선행 하는 인덱스 이름은 TYPE의 옵션이 아니다. 즉 USING과 달리, TYPE은 예약어가 아니며 이름이 주어지지 않을
경우 인덱스 이름으로 해석 된다.
여러분이 주어진 저장 엔진에 대해 적법하지 않은 인덱스를 명시하고 질의 결과에 영향을 주지 않게 엔진이 사용하는 인덱스 타입
이 있다면 엔진은 가능한 타입을 사용한다.
FULLTEXT 인덱스들은 오직 MyISAM 테이블들에 의해서만 지원 되며 CHAR, VARCHAR 그리고 TEXT 컬럼만을 포함한다.
12.7 "전체 텍스트 검색 함수들"을 참조한다.
제목검색
[(create_definition,...)]
[table_options] [select_statement]
이나
생성 정의:
컬럼 정의
| CHECK (expr)
컬럼 정의:
타입:
| DATE
| TIME
| TIMESTAMP
| DATETIME
| YEAR
| VARCHAR(length) [BINARY]
| BINARY(length)
| VARBINARY(length)
| TINYBLOB
| BLOB
| MEDIUMBLOB
| LONGBLOB
| TINYTEXT [BINARY]
| TEXT [BINARY]
| MEDIUMTEXT [BINARY]
| LONGTEXT [BINARY]
| ENUM(value1,value2,value3,...)
| SET(value1,value2,value3,...)
| spatial_type
index_col_name:
reference_definition:
reference_option:
table_option:
| CHECKSUM [=] {0 | 1}
| DELAY_KEY_WRITE [=] {0 | 1}
select_statement:
CREATE TABLE은 주어진 이름으로 테이블을 생성한다. 여러분은 테이블에 대한 생성 권한을 가지고 있어야 한다.
테이블 이름 지정에 관한 규칙은 9.2 장 "데이타베이스, 테이블, 인덱스, 컬럼, 별칭 이름" 부분을 참조한다. 기본적으로 테이블은
기본 데이타 베이스 안에서 생성된다. 기본 데이타베이스가 없거나 테이블이 존재 하는 경우 에러를 발생 시킨다.
IF NOT EXISTS 키워드는 테이블이 존재하는 경우 발생하게될 에러를 방지 해 준다. 그러나 CREATE TABLE 문에 의해 명시것
과 같이 같은 구조를 가지는 테이블이 존재하는 것에 대한 검증은 하지 않는다.
주의: CREATE TABLE... SELECT 문에서 IF NOT EXISTS 문을 사용할 경우 SELECT에 의해 선택된 레코드들은 테이블이 이
미 존재 하는 경우라도 삽입 된다.
File Purpose
tbl_name.MYD 데이터 파일
tbl_name.MYI 인덱스 파일
14장 "저장 엔진과 테이블 타입"에서는 저장 엔진이 테이블을 표현 하기 위해 사용하는 각 파일들에 대해 설명한다.
타입은 데이터 타입이 컬럼 정의라는 것을 표현 한다. 공간 타입(spatial type)은 공간 데이터 타입을 표현한다. 데이터 타입들의
속성에 관한 일반적인 정보는 11장 "데이터 타입" 부분을 참조 하라. 공간 데이터 타입(spatial data type)에 관한 보다 자세한 내
용은 16장 "공간 확장(Spatial Extension)"부분을 참조 하라.
NO_AUTO_VALUE_ON_ZERO SQL 모드가 동작 하면, 새로운 일련 번호를 생성하지 않은채 0으로 AUTO_INCREMENT 컬럼
들에 저장 할 수 있다. 이에 대한 내용은 5.2.5장 "서버 SQL 모드" 부분을 참조한다.
MySQL을 ODBC 응용 프로그램과 호환성을 갖도록 하기 위해서는 다음 질의로 가장 마지막에 삽입된 AUTO_INCREMENT 값
을 찾을수 있다.
CREATE TABLE 테이블 (컬럼 CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
MySQL 5.0은 문자 컬럼 정의에서 길의 명시를 문자열들로 해석한다. (MySQL 4.1 이전 버넌에서는 byte로 해석했다)
컬럼 정의가 DEFAULT 값을 포함하지 않는다면 MySQKL은 11.1.4장 " 테이터 형과 기본 값"부분에서 기술된 기본 값으로 설정
한다.
l 컬럼에 대한 주석은 COMMENT 옵션으로 지정될 수 있다. 주석은 SHOW CREATE TABLE 과 SHOW FULL
COLUMNS 문에서 보여진다.
l KEY 는 보통 INDEX 와 같은 의미를 갖는다. PRIMARY KEY 속성은 컬럼 정의에서 KEY로서 명시 지시 될 수 있다.
이는 다른 데이터베이스 시스템들과의 호환성을 위해 구현되었다.
하는 레코드와 매치 되는 키로 새로운 레코드를 추가 하려하면 에러를 발생 시킨다. 이 예외는 인덱스의 컬럼이 NULL 값의 포함
이 허락 될 경우 다수 NULL 값을 포함 할 수 있다. 이 예외는 BDB 테이블 에서는 적용 되지 않는데 UNIQUE 인덱스를 가진 컬럼
이 단 하나의 NULL 값만을 허용 하기 때문이다.
l PRIMARY KEY 는 모든 키 컬럼들이 NOT NULL로 정의 되어야 할때 유일한 인덱스 이다. 이들이 NOT NULL로 명
시적으로 선언되지 않으면 MySQL은 암시적으로 선언 하게 된다. 하나의 테이블은 오직 하나의 PRIMARY KEY를 가질 수 있다.
여러분이 PRIMARY KEY 를 갖지 않은 상태에서 응용 프로그램이 그 테이블의 PRIMARY KEY에 관해 질의를 할 경우, MySQL
은 PRIMARY KEY 로서 NULL 값을 갖지 않는 컬럼을 UNIQUE 인덱스로 리턴한다.
InnoDB 테이블에서 긴 PRIMARY KEY는 공간을 낭비 하게 된다 (이에 대한 내용은 14.2.13 장 " PRIMARY KEY 테이블 과 인
덱스 구조" 부분을 참조하라).
l 생성된 테이블에서 PRIMARY KEY 가 최우선에 위치하고 그담으로 UNIQUE 인덱스들이 그다음이 non- UNIQUE
인덱스들이 위치한다. 이는 MySQL 최적기(optimizer)가 어떤 인덱스를 사용하고 중복된 UNIQUE 키들을 좀더 빨리 찾기 위해
우선 순위를 매겨놓는데 도움을 준다.
l PRIMARY KEY 는 다수 컬럼 인덱스가 될 수 있다. 그러나 여러분이 컬럼 지정에서 PRIMARY KEY 속성을 사용하여
다수 컬럼 인덱스를 생성 할 수는 없다. 단일 컬럼을 PRIMARY로 명시하는 것만 가능하다. 여러분은 개별 PRIMARY KEY (인덱
스 컬럼 이름, ...)문을 사용해야 한다.
l PRIMARY KEY 나 UNIQUE 인덱스는 정수형으로 된 하나의 컬럼 으로 이루어지며 여러분은 SELECT 문에서
_rowid로서 그 컬럼을 참조 할 수 있다.
MySQL에서 PRIMARY KEY 의 이름은 PRIMARY이다. 다른 인덱스들에 대해서는 이름을 지정하지 않으면 그 인덱스는 첫 인덱
싱된 컬럼과 같은 이름으로 지정되는데 유일하게 만들기 위해서 _2 혹은 _3 과 같이 접미어를 붙이기도 한다. 여러분은 SHOW
INDEX FROM tbl_name 을 사용하여 인덱스 이름들을 볼 수 있다. 이에 대한 내용은 13.5.4.13장 "SHOW INDEX"를 참조하라.
몇몇 저장 엔진들은 인덱스를 생성할때 인덱스 타입을 명시 하도록 하기도 한다. 인덱스 타입 지정자에 대한 문법은 USING 타입
이름 이다.
예:
MySQL이 어떻게 인덱스들을 사용하는지에 대한 보다 자세한 사항은 7.4.5장 "MySQL의 인덱스 사용법" 부분을 참조하라.
l 인덱스 지정에서 컬럼 이름(길이) 문을 사용하여 여러분은 한 컬럼의 일 부분만을 사용하는 인덱스를 생성 할 수 있다.
인덱스 엔트리는 CHAR 와 VARCHAR 형의 컬럼들에 대해 각 컬럼 값에서 길이 만큼의 문자열들이나 BINARY 나 VARBINARY
형의 컬럼들에 대해서 각 컬럼의 첫 길이만큼의 byte들로 이루어진다. 이와 같이 컬럼 값들의 접두어(prefix)의 인덱싱은 인덱스
파일을 훨씬 작게 할 수 있다. 7.4.3 장 "컬럼 인덱스" 부분을 참조하라.
MyISAM, BDB 과 InnoDB 저장 엔진은 BLOB 와 TEXT 컬럼에서 인덱싱을 지원하므로 여러분은 인덱스의 길이를 명시 해야 한
다.
예를 들면:
Prefixes들은 최대 1000 바이트 길이까지 가능 하다(InnoDB 테이블인 경우 767 byte). Prefix 제한들은 byte로 측정되나
CREATE TABLE 문에서 prefix길이는 비 바이너리형(CHAR, VARCHAR, TEXT)들에 대한 문자열의 수로 해석 된다. 다수 바
이트 문자열 모음(character set)을 사용하는 컬럼에 대해서는 prefix길이을 지정할때 유의 해야 한다.
l 인덱스 컬럼 이름 지정은 ASC 나 DESC로 끝날 수 있다. 이들 키워드들은 오름순 혹은 내림순 인덱스 값 저장을 지정할때 사
용하기 위한 것들이다. 현재는 이들이 분석되지만 무시되는 상태이며 이는 곧 모든 인덱스 값들은 항상 오름순 으로 저장 됨을 의미
한다.
l 여러분이 SELECT에서 TEXT 혹은 BLOB 형 컬럼에 대해 ORDER BY나 GROUP BY를 사용할 경우, 서버는 최대 정렬 길
이 시스템 변수들에 의해 지정된 바이트들의 처음 숫자를 사용하여 값들을 정렬 한다. 이에 대한 자세한 내용은 11.4.3장 "BLOB
와 TEXT형" 부분을 참조하라.
l 사용자는 특별한 FULL TEXT 인덱스들을 생성 할수 있는데 이들은 전체 텍스트 검색에 사용된다. MyISAM저장 엔진만이
이 FULL TEXT 인덱스를 지원한다. 이 인덱스들은 CHAR, VARCHAR 과 TEXT 컬럼들로 부터 생성 될 수 있다. 인덱싱은 전체
컬럼에 대해 항상 발생 하며 부분 인덱싱은 지원 되지 않으며 prefix길이가 명시된 경우 이는 무시 된다. 이에 대한 사항은 12.7
"전체 텍스트 검색 함수" 부분을 참조 하라.
l 사용자는 공간 데이터 형으로 SPATIAL 인덱스를 생성 할 수 있다. 공간형들은 MyISAM 테이블들에서만 지원 되며 인덱스
컬럼들은 NOT NULL로 선언 되어야 한다. 이에 대한 사항은 16장 "Spatial 확장" 부분을 참조하라.
다른 저장 엔진들에 대해서는 MySQL서버가 CREATE TABLE 문에서 FOREIGN KEY와 REFERENCE문은 분석하나 무시 한
다. CHECK문은 모든 저장 엔진에 의해 무시 되며 1.9.5.5장 "외래키" 부분을 참조 하라.
l MyISAM 테이블의 경우, 각 NULL 컬럼은 최근접 바이트로 반올림하는 하나의 엑스트라 비트(bit)를 가진다. 최대 열
의 바이트 길이는 다음과 같이 계산할 수 있다.
레코드 길이 = 1
+ (컬럼 길이의 합)
+ (NULL 컬럼의 수 + delete_flag + 7) /8
+ (가변길이 컬럼의 수)
delete_flag 는 고정 레코드 포멧을 가진 테이블에 대해 1값을 갖는다. 고정 테이블은 레코드가 삭제 되었는지 나타내는 플래그로
레코드에서 한 bit를 사용한다. 동적 테이블에 대해서는 이 플래그가 동적 레코드 헤더에 저장 되므로 0 값을 가진다.
위의 식은 저장 크기가 NOT NULL 컬럼 보다는 NULL 컬럼들에 대해서 차이가 없으므로 InnoDB 테이블에 적용되지는 않는다.
ENGINE 테이블 옵션은 테이블을 위한 저장 엔진을 지정한다. TYPE이 동의어 이나 ENGINE 이 주로 사용되는 옵션 이름이다.
Storage Engine 설명
CSV 콤마로 구분되는 값 포맷으로 레코드를 저장하는 테이블들. 14.9장 "CSV 저장 엔진"을 참조하라..
MySQL 5.0에서는 불가능. 이전 버전에서 MySQL 5.0으로 DB를 업그레이드 할 경우 ISAM 테이블을
ISAM (OBSOLETE)
MyISAM으로 변환하여야 한다.
InnoDB 레코드 잠금과 외래키를 가진 트랜잭션 안전 테이블. 14.2장 "InnoDB 저장 엔진" 부분을 참조 하라.
MyISAM 테이블들이 하나의 테이블로 사용된다. MRG_MyISAM으로 알려져 있다. 14.3장 "MERGE 저
MERGE
장 엔진"부분을 참조하라.
NDBCLUSTER 클러스터되고 무정지의 메모리 기반 테이블들. NDB로 알려짐. 15장 "MySQL Cluster"를 참조하라.
저장 엔진이 불가능 하다고 명시 되어 있다면 MySQL은 기본 엔진을 대신 사용한다. 예로서 한 테이블 정의가 ENGINE=BDB 옵
션을 포함하고 MySQL 서버가 BDB 테이블을 지원하지 않는다면 이 테이블은 MyISAM 테이블로 생성된다. 이는 마스터에 트랜잭
션 테이블을 가지고 있지만 slave로 생성된 테이블들은 비 트랜잭션적인(속도를 높이기 위해) 곳에서 치환 설정을 가능 하게 한
다. MySQL 5.0에서는 저장 엔진 지정이 불가능 한경우 경고를 발생 시킨다.
다른 테이블 옵션들은 테이블의 행위를 최적화 하기 위해 사용된다. 대부분의 경우 여러분은 그들의 일부를 지정해야 한다. 이들 옵
션들은 모든 저장 엔진에 적용 된다.
l AUTO_INCREMENT
테이블에서 AUTO_INCREMENT 값의 이니셜이다. MySQL 5.0에서 이것은 MyISAM과 MEMORY 테이블들로 작동한다. 이것
은 또한 MySQL 5.0.3에서 처럼 InnoDB를 위해 지원된다. AUTO_INCREMENT 테이블 옵션을 지원하지 않는 엔진들에 대해 자
동 증가 값을 설정 하기 위해서는 테이블 생성후 원하는 값보다 1적은 값으로 "dummy"레코드에 삽입 한 다음 그 "dummy"레코드
를 삭제 한다.
l AVG_ROW_LENGTH
테이블의 평균 레코드 길이의 근사값이다. 여러분은 가변 크기의 레코드들을 가진 큰 테이블들에 대해서만 설정 할 필요가 있다.
MyISAM 테이블을 생성 할때 MySQL은 결과 테이블이 얼마나 큰지를 결정하기 위해서 MAX_ROWS와 AVG_ROW_LENGTH옵
션의 결과를 사용한다. 여러분이 만약 어떤 옵션도 지정하지 않으면 테이블의 최대 크기는 65,536TB 이다 (MySQL 5.0.6 이전
버전에서는 4GB였다.). (만약 여러분의 운영 체제가 이정도 크기의 파일을 지원하지 않는다면 테이블 크기는 파일 크기 제약에 의
해 제한 받는다.) 여러분이 인덱스를 작게 하거나 빠르게 하고 싶고 실제 큰 파일이 필요하지 않다면 myisam_data_pointer_size
시스템 변수를 설정하여 기본 크기를 줄일 수 있다. 이것은 MySQL 4.1.2 버전에서 추가 되었다. (5.2.2.2장 "서버 시스템 변수"부
분을 참조하라). 여러분이 모든 테이블을 기본 제한 값보다 크게 만들고 약간 느려지게 하고자 한다면 이 값의 설저을 변경 하여 증
가 시킬 수 있다.
l COLLATE
l CHECKSUM
MySQL 모든 레코드들에 대해서 checksum을 유지 하고 싶다면 이것을 1로 설정하라(MySQL이 테이블이 변경되면 자동으로 업
데이트 한다.). 이것은 테이블의 업데이트를 다소 느리게 만들지만 깨진 테이블을 쉽게 찾도록 하기도 한다. CHECKSUM
TABLE 문은 checksum을 보고 한다.(MyISAM 만 해당)
l COMMENT
l CONNECTION
FEDERATED 테이블을 위한 연결 문자열이다. 이 옵션은 MySQL 5.0.13부터 가능 하다. 그전에는 COMMENT 옵션을 사용한다.
l MAX_ROWS
테이블에 저장하려는 레코드의 최대 수이다. 이것은 고정된 제한 값이 아니라 테이블이 최소 이 정도의 레코드들 저장 할 수 있어
야 한다는 것을 지정하는 것이다.
l MIN_ROWS
l PACK_KEYS
PACK_KEYS은 MyISAM 테이블에서 효과를 지닌다. 작은 인덱스들을 원한다면 이 옵션을 1로 설정 하라. 이것은 보통 업데이트
를 느리게 하고 읽기를 빠르게 만든다. 옵션을 0으로 하면 키들의 모든 패킹(packing)을 불가능 하게 한다. 이 값을 DEFAULT로
하면 저장엔진이 CHAR나 VARCHAR 컬럼들만 동반 할 수 있다.
여러분이 PACK_KEYS를 사용하지 않으면 기본적으로 숫자가 아닌 문자열을 패킹한다. PACK_KEYS=1로 하면 숫자들로 pack
될 수 있다.
이것은 여러분이 두개의 연속 적인 레코드에 많은 동일한 키들을 가지 있다면 모든 다음의 "same"키들은 단지 2바이트 만을 갖는
다(레코드에 대한 포인터 포함). 일반 적인 경우 키들은 각 키의 저장 크기 + 포인터 크기(포인터 크기는 4byte 이다) 를 갖는다.
여러분은 동일 한 값을 갖는 키가 많을 경우 prefix 압축으로 부터 많은 잇접을 얻게 된다. 만약 모든 키들이 다르다고 이때 그 key
가 NULL값을 갖지 않는다면, 여러분은 각 key당 1 byte를 더 사용한다.(이 경우 pack된 key 길이는 key가 NULL이면 표기 하는
데 사용되는 같은 byte에 저장 된다.)
l PASSWORD
l DELAY_KEY_WRITE
테이블이 닫힐 때까지 테이블의 키 업데이트를 지연 시키려 할때 이를 1로 설정한다. 5.2.2장 "서버 시스템 변수"에서 지연 키 쓰
기 시스템 변수의 설명을 참조 하라.(MyISAM만 해당)
l ROW_FORMAT
l RAID_TYPE
l UNION
여러분은 테이블들을 하나의 MERGE 테이블로 매핑 하려면 SELECT, UPDATE, DELETE 권한을 가져야 한다. ( 주의 : 형식적
으로 모든 테이블은 MERGE 테이블과 같은 데이터베이스 안에 있어야 한다. 이 제약은 더이상 적용 되지 않는다)
l INSERT_METHOD
MERGE 테이블에 데이타를 삽입 하려면 레코드가 삽입될 테이블에 INSERT_METHOD를 명시 해야 한다. INSERT_METHOD
는 MERGE테이블에 대해서만 유용한 옵션이다. 테이블의 처음 이나 끝부분에 삽입을 하려면 FIRST나 LAST를 사용한다 NO의
값은 삽입을 못하게 한다. 자세한 사항은 14.3장 "MERGE 저장 엔진"부분을 참조 하라.
이들 옵션들은 여러분이 --skip-symbolic-links 옵션을 사용하지 않는한 적용된다. 여러분의 운영 시스템이 쓰레드 안전
realpath() 호출을 해야 한다. 자세한 사항은 7.6.1.2장 "Unix에서 테이블을 위한 Symbolic Links사용" 부분을 참조 하라.
이것은 새개의 컬럼 a,b와 c를 가지는 MyISAM 테이블을 생성하는 명령이다. 여기서 SELECT문에 있는 컬럼들은 테이블의 오른
쪽에 추가 되며 그것에 겹쳐지지 않는다. 다음과 같은 예를 보면;
테이블 foo의 각 레코드에 대해, foo 테이블로 부터의 값들과 새로운 컬럼들에 대한 기본값들로 이루어지는 하나의 레코드가 bar
테이블에 삽입 된다.
CREATE TABLE ... SELECT 결과로 테이블안에는 , CREATE TABLE부분에 명명된 커럼들이 우선한다. SELECT 컬럼s 의
데이타형은 CREATE TABLE 부분에서 그 컬럼을 지정 하여 바뀌어 질 수 있다.
CREATE TABLE ... SELECT 은 자동으로 어떤 인덱스도 생성 하지 않는다. 이것은 의도적으로 그 문장을 유연하게 만들기 위
해 이루어지는 것이다. 여러분이 생성된 테이블에 인덱스를 지정하길 원한다면 SELECT문 이전에 이것들을 명시 하도록 한다.
데이타형의 변환도 발생 할 수 있다. 예를 들면 AUTO_INCREMENT 속성이 보존되지 않으면 VARCHAR 컬럼은 CHAR 컬럼이
될 수 있다.
CREATE...SELECT 문으로 테이블 생성시, 질의 에서 함수 호출에 대한 별칭 지정을 확실히 하도록 하라. 그렇지 않으면
CREATE 문은 올바르지 않은 컬럼 이름에 대해서 실패 할 수도 있다.
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
원본 테이블에서 정의된 컬럼 속성과 인덱스들을 포함 하는 다른 테이블의 정의를 기반으로 빈 테이블을 생성 하려면 LIKE를 사용
하도록 하라.
CREATE TABLE ... LIKE은 원본 테이블에서 지정되었던 어떤 DATA DIRECTORY 나 INDEX DIRECTORY 테이블 옵션이
나 외래키 정의들을 유지 하지 않는다.
유일키 값이 중복되는 레코드를 어떻게 처리 할지 지시 하기 위해 IGNORE 와 REPLACE를 선행 시킬수 있다. IGNORE를 사용하
면 중복된 레코드는 삭제 된다. REPLACE를 사용하는 경우 새로운 레코드들은 같은 유일 키 값을 갖는 레코드로 대채 된다.
IGNORE 와 REPACE 모두 명시 하지 않으면 중복된 유일 키에 대해서 에러를 발생 하게 된다.
바이너리 로그가 원본 테이블들을 재생성 하는데 사용되도록 하기 위해, MySQL은 CREATE TABLE...SELECT에 동시 삽입을
허용하지 않는다.
제목검색
13. SQL 문법(SQL Statement Syntax) 어떤 경우는, MySQL이 CREATE TABLE이나 ALTER TABLE문에서 컬럼 지정들을 암묵적으로 변경 하기도 하는데 데이타
13.1. 데이터정의 문 형, 속성, 데이타 형과 관련된 속성 혹은 인덱스 등이다.
l MySQL 5.0.3이전에 255보다 큰 길이를 갖는 CHAR 나 VARCHAR형 컬럼은 주어진 길이의 갑들을 가지는 가장 작
은 TEXT 형으로 변환된다. 예를 들면 VARCHAR(500)은 TEXT로 변환 되며 VARCHAR(200000)은 MEDIUMTEXT로 변환
된다. 이 변환은 저장 공간 을 고려하여 이루어 진다.
BINARY 와 VARBINARY형에 대해서도 이들이 BLOB형으로 변환 되는 경우를 제외 하고, 유사한 변환이 발생한다.
MySQL 5.0.3서 부터 255길이 보다 긴 CHAR 나 BINARY형 컬럼은 암묵적으로 변환 되지 않고 에러를 발생 시킨다. MySQL
5.0.6 부터는 SQL의 엄격 모드 하에서는 65,535보다 긴 길이의 VARCHAR 과 VARBINARY 형 컬럼의 암묵적인 변환은 발생
하지 않는다. 즉 에러를 발생 시킨다.
l PRIMARY KEY의 부분인 컬럼들은 그것들이 NOT NULL 처럼 선언 되었다 해도 NOT NULL로 만들어 지지 않는다.
l MySQL은 다른 SQL 데이타베이스 에서 사용되는 데이타 형을 MySQL의 데이타 형으로 매핑 시키기도 한다. 이에 관
한 내용은 11.7장 "다른 데이타베이스 의 데이타형 사용"부분을 참조 하라.
여러분이 주어진 저장 공간에 대해 알맞지 않은 인덱스 형을 지정하는 USING문을 포함 할 경우, 질의 결과에 영향을 주지 않는 다
른 인덱스 형이 있다면 ,데이타베이스는 그 유효 타입을 사용한다.
MySQL이 여러분이 지정한 것과 다른 데이타 형을 사용했는지 보기 위해서는 테이블 생성이나 테이블 변경 후, DESCRIBE 나
SHOW CREATE TABLE 문을 사용하라.
여러분이 myisampack을 사용하여 테이블을 압축 하면 다른 데이터형 변환이 일어 날수 있다. 이에 관한 내용은 14.1.3.3장 "압축
테이블 특성"부분을 참고하라.
제목검색
13. SQL 문법(SQL Statement Syntax) DROP {DATABASE | SCHEMA} [IF EXISTS] 데이타베이스 이름
13.1. 데이터정의 문
13.1.6 DROP DATABASE DROP DATABASE 은 데이타베이스 안의 모든 테이블을 지우고 데이타베이스도 삭제 한다. 따라서 이를 이용할때는 매우 주의
를 하도록 해야 한다. DROP DATABASE를 사용하기 위해서는 이에 대한 권한을 가져야 한다. DROP SCHEMA는 DROP
DATABASE와 동의어이다.
DROP DATABASE는 삭제된 테이블의 수를 리턴한다. 이것은 삭제된 .frm 파일의 수와 일치 한다.
두개의 16진수 00-ff로 이루어진 이름을 가진 모든 서브디렉토리들. 이들은 RAID 테이블들을 위해 사용되는 하부 디렉토리들이
다.(이들 디렉토리들은 RAID 테이블에 대한 지원이 삭제될때 MySQL 5.0에서 부터는 삭제 되지 않는다. 여러분은 MySQL 5.0으
로 업그레이드 하기전에 이들 디렉토리를 삭제 하고 RAID 테이블들을 변환 해야 한다. 2.10.2장 "MySQL 4.1에서 5.0으로의 업
그레이드" 를 참조 하라)
db.opt 파일 .
MySQL이 열거된 파일들을 삭제한 후 데이타베이스 디렉토리 안에 다른 파일과 디렉토리들이 존재 한다면 데이타베이스 디렉토리
는 삭제 될 수 없다. 이경우 여러분은 직접 해당 디렉토리와 파일들을 삭제 하고 DROP DATABASE 문을 다시 사용 하도록 해야
한다.
DROP INDEX는 테이블 이름에서 인덱스 이름으로 명시된 인덱스를 삭제 한다. 이 SQL문은 인덱스를 삭
제 하기 위해서 ALTER TABLE로 매핑된다. 이에 대한 내용은 13.1.2장 "ALTER TABLE"을 참고 하
라.
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=1&scate=7&idx=16172006-08-08 오후 6:16:49
:::MySQL Korea:::
제목검색
13. SQL 문법(SQL Statement Syntax) DROP [TEMPORARY] TABLE [IF EXISTS]
13.1. 데이터정의 문
tbl_name [, tbl_name] ...
13.1.8 DROP TABLE
[RESTRICT | CASCADE]
DROP TABLE문은 하나 혹은 그 이상의 테이블을 삭제 한다. 여러분은 각 테이블에 대한 DROP 권한을 가져야 한다. 모든 테이블 데
이타와 테이블 정의가 삭제 되므로 주의 해서 사용해야 한다.
주의: DROP TABLE은 여러분이 TEMPORARY키워드를 사용하지 않는 이상 현재 활성화된 트랜잭션을 자동으로 위임(commit)한
다.
접근 권한이 체크 되지 않는다. (TEMPORARY테이블은 그것을 생성한 client에만 보이며, 어떤 check 도 필요하지 않다)
제목검색
이 SQL문이 하나이상의 테이블을 재명명 하면 새이름변경 연산은 왼쪽에서 오른쪽으로 진행 된다. 여러분이 두개의 테이블을 교
환 하려면 다음과 같이 할 수 있다(임시 테이블이 존재 하지 않는다고 가정한다.).
new_table TO old_table,
tmp_table TO new_table;
MySQL 다수 테이블 재명명에서 에러를 발생 시키면 이름이 바뀐 테이블들을 다시 원래 이름의 테이블들로 바꾸어 놓는다.
제목검색
상위메뉴리스트 ◆
13.2. 데이터 조작 SQL문
13. SQL 문법(SQL Statement Syntax) 13.2.1. DELETE
13.2.9 TRUNCATE
13.2.10 UPDATE
제목검색
13.2.1. DELETE 문
상위메뉴리스트 ◆
13.2.1 DELETE 문
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
다수 테이블:
FROM table_references
[WHERE where_condition]
또는:
USING table_references
[WHERE where_condition]
다수 테이블문은 DELETE가 조건을 만족하는 각 테이블의 레코드들을 삭제 한다. 이경우 ORDER BY와 LIMIT는 사용할 수 없
다.
where 조건은 각각의 레코드가 삭제 되어 할 지 평가 하는 문이다. 상세한 내용은 13.2.7 장 "SELECT"부분을 참조 하라.
조 하라.
여러분이 LOW_PRIORITY로 지정 하는경우 서버는 클라이언트가 테이블에서 더이상 읽지 않을때까지 DELET의 실행을 지연시
킨다.
MyISAM테이들의 경우 QUICK 키워드를 사용하면 저장 엔진은 삭제 기간동안 인덱스 가지들을 병합하지 않는데 이것은 몇몇 삭
제 작업시 속도를 향상 시킨다.
IGNORE키워드는 MySQL로 하여금 레코드의 삭제 기간중에 모든 에러를 무시 하도록 한다. (분석 기간중에 발생 하는 에러들은
일반 적인 방법에 따라 처리 된다) OPTION의 사용으로 인해 무시 되는 에러들은 경고로 리턴된다.
MyISAM 테이블들에서는 삭제된 레코드들은 linked list로 유지 되며 연속적인 INSERT 연산들은 옛 레코드 위치를 재 사용한
다. 사용되지 않는 공간의 반환과 파일 크기를 줄이기 위해서는 OPTIMIZE TABLE문을 사용하거나 테이블들을 재 구성하는
myisamchk 유틸리티를 사용하라. OPTIMIZE TABLE이 쉽지만 myisamchk는 빠르다. 13.5.2.5장 "OPTIMIZE TABLE"과 8.2
장 "myisamchk-MyISAM 테이블 유지 보수 유틸리티"부분을 참조 하라.
QUICK modifier는 index leaf들이 삭제 작업을 위해 병합 되는데 영향을 미친디ㅏ. DELETE QUICK은 삭제된 레코드의 인덱스
값들이 후에 삽입되는 레코드의 유사한 인덱스 값들로 대체 되도록 하는데 가장 유요한 방법이다.
DELETE QUICK는 삭제된 값들이 새로운 삽입이 발생 할때 인덱스 값들의 범위를 조사하는 undef_filled 인덱스 블럭에 이르는
경우에는 유용하지 않다. 이 경우 QUICK의 사용은 반환되지 않고 있는 인덱스 안의 낭비되는 공간을 야기 시킬수 있다. 아래는 그
러한 시나리오의 예이다.
이 시나리오에서는 삭제된 인덱스 값들과 연관된 인덱스 블럭이 undef-filled 상태가 되나 QUICK의 사용으로 다른 인덱스 블럭
과 병합 되지 않는다. 그들은 새로운 레코드는 삭제된 범위 안에 속한 인덱스 값을 가지고 있지 않으므로 새로운 삽입이 발생할때까
지 undef-filled상태를 유지한다. 더 나가 그것들은 여러분이 추후 QUICK없이 DELET를 사용할때에도 삭제된 인덱스값들중 일
부가 undef-filled 블럭과 인접한 경우가 발생하기 전에는 undef-filled 상태를 유지한다. 이러한 환경에서 사용되지 않는 인덱스
공간을 해제 하기 위해서는 OPTIMIZE TABLE을 사용하라.
DELTE문에서 MySQL 고유 절인 LIMIT 레코드 수 는 클라이언트에게 되돌아 가기전에 삭제될 최대 레코드 수를 서버에게 말해
준다. 이것은 주어진 DELETE문이 많은 시간을 소비하지 않도록 하기 위해 사용될 수 있다. 여러분은 단지 영향을 받는 레코드의
수가 LIMINT 의 값보다 작을 때까지 DELETE문을 반복할 수 있다.
DELTE문이 ORDER BY절을 포함하면 그 절에서 지정된 순서대로 레코드가 삭제된다. LIMIT와 함께 쓰이면 유용하다. 예를 들
면, 다음 문장은 WHERE절에 의해 일치 하는 레코드를 찾고 timestamp_column의 순서대로 정렬을 하여 첫번째 레코드를 삭제
한다.
처음 다수 테이블 문에서, FROM 절 이전에 나열된 테이블들로부터 일치하는 레코드들이 삭제 된다. 두번째 다수 테이블 문에서
FROM 절 안(USING 절 이전)에 나열된 테이블들에서 일치하는 레코드를 삭제 한다. 이 효과는 여러분이 동시에 여러 테이블에서
레코드를 삭제 할수 있으며 검색을 위해서만 사용되는 추가적인 테이블을 가진다는 것이다.
또는:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
이 SQL문들은 삭제할 레코드를 찾기 위해서 세개의 테이블을 사용하지만 테이블 1과 2에 대해서면 일치하는 레코드를 삭제 한다.
위의 예는 콤마 연산자를 사용하는 inner join을 보여준다. 그러나 다수 테이블 DELETE문은 LEFT JOIN과 같이 SELECT문에
서 허용되는 join형만 사용할 수 있다.
여러분이 외래키 제약 사항에 대해 InnoDB테이블을 연관짓는 다수 테이블 DELETE문을 사용할 경우, MySQL 최적화기는 그들
간의 부모/자식관계 의 그것과는 차이가 있는 순서로 테이블을 처리 한다. 이 경우, SQL문은 실패 하고 roll back된다. 대신 다른
테이블들이 자연스럽게 변경 되도록 하려면 여러분은 하나의 테이블에서 지우고 InnoDB가 제공하는 ON DELETE문의 능력에 의
존 해야 한다.
교차 데이타베이스 삭제는 다수 테이블 삭제를 위해 제공 되며 이 경우, 여러분은 alias없이 테이블을 참조 해야 한다. 예를 들면;
제목검색
상위메뉴리스트 ◆ 13.2.2. DO
13.2.2 DO
DO는 뒤의 expression을 실행 하지만 결과를 리턴하지 않는다. 모든 면에서 DO는 SELECT expr, ..., 문의 편법이지만 여러분이
결과를 신경 쓰지 않아도 된다는 점에서 다소 빠른 잇점을 지니고 있다. DO문은 어떤 에러도 보고 하지 않고 경고로써 에러를 보
고 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=2&scate=2&idx=16222006-08-08 오후 6:17:04
:::MySQL Korea:::
제목검색
13.2.3 HANDLER
DO는 뒤의 expression을 실행 하지만 결과를 리턴하지 않는다. 모든 면에서 DO는 SELECT expr, ..., 문의 편법이지만 여러분이
결과를 신경 쓰지 않아도 된다는 점에서 다소 빠른 잇점을 지니고 있다. DO문은 어떤 에러도 보고 하지 않고 경고로써 에러를 보
고 한다.
13.2.3. HANDLER
HANDLER ... OPEN문이 테이블을 open하고 뒤의 HANDLER...READ문을 이용하여 접근 할수 있게 한다. 이 테이블 객체는 다
른 쓰레드들에 의해 공유되며 그 쓰레드가 HANDLER ... CLOSE를 호출 하거나 쓰레드가 종료되기 전에 close하지 않는다. alias
를 이용하여 테이블을 open한 경우 그 테이블에 대한 참조 하기 위해 HANDLER문을 쓰는 경우 alias를 대신 써야 한다.
첫번째 HANDLER ... READ문은 인덱스가 주어진 조건을 만족하거나 WHERE조건 과 일치 하는 경우 레코드를 가져온다. 여러분
이 다수 컬럼 인덱스를 가진 경우 콤마로 인덱스 컬럼들의 값을 명시 하도록 해야 한다. 인덱스의 모든 컬럼에 대한 값을명시 하거
나 인덱스 컬럼들의 가장 좌측의 prefix에 대한 값을 명시 하라. 예를 들면 my_idx라는 인덱스가 col_a, col_b, col_c의 컬럼 들을
포함 한 경우 HANDLER 문은 인덱스에 세개의 컬럼들의 값을 명시 하거나 가장 좌측의 prefix에 있는 컬럼 명시 할 수있다.
두번째 HANDLER ... READ문은 WHERE 조건과 일치 하는 한 레코드에 대해 인덱스 순서대로 가져 온다.
세번째 HANDLER ... READ문은 WHERE조건을 만족하는 한 레코드를 원래 순서대로 가져 오게 된다. 전체 테이블 스캔을 할때
HANDLER 테이블 이름 READ 인덱스 이름 을 사용하는 것 보다 빠르다. 자연적인 레코드 순서서 레코드들이 MyISAM 테이블 데
이타 파일에 저장된 순서이다. 이 문은 InnoDB테이블에 대해서도 쓸수 있으나 분리된 데이타 바일이 없으므로 그러한 개념은 존
재 하지 않는다.
LIMIT절 없이 모든 형식의 HANDLER ... READ문은 하나의 레코드만 가져 온다. 레코드의 수를 되돌려 주기 위해서는 LIMIT절
을 포함 하라. 이것은 SELECT문과 같다. 이에 대한 사항은 13.2.7장 "SELECT"를 참조 하라.
HANDLER는 다소 low 레벨의 문자이다. 예를 들면, 그것은 일관성을 제공하지 않는다. 즉 HANDLER ... OPEN은 테이블의 단편
을 갖거나 테이블을 자그지 않는다. 이는 HANDLER ... OPEN문후 테이블 데이타가 변경 될수 있으며 이들 변경은 HANDLER ...
NEXT 혹은 HANDLER ... PREV 스캔에서 일부 볼수 있다.
l 적은 분석이 사용된다.
l handler인터페이스는 데이타의 일관된 모양을 제공할 필요가없다. (예를 들면 dirty 읽기가 허락된다) 따라서 저
장 엔진은 SELECT가 허용하지 않는 최적화를 사용할 수 있다.
제목검색
13.2.4.1 INSERT ..
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
13.2.4.2 INSERT DELAYED
13.2.4.3 INSERT ..
[INTO] tbl_name [(col_name,...)]
Or:
[INTO] tbl_name
Or:
SELECT ...
INSERT문은 존재하는 테이블에 새로운 레코드를 삽입 한다. INSERT ... VALUES 과 INSERT ... SET 문은 명시적으로 지정된
값들을 기반으로 레코드를 삽입 한다. INSERT ... SELECT문은 다릍 테이블이나 테이블들 에서 선택된 레코드를 삽입한다.
INSERT ... SELECT문은 13.2.4.1 "INSERT... SELECT"부분을 참조 하라.
기존 레코드를 덮으쓰기 위해서는 INSERT가 아닌 REPLACE문을 사용할 수 있다. REPLACE는 유일키가 같은 중복 레코드를 새
로운 레코드로 처리 하는점에서 INSERT IGNORE와 대응 된다. 새로운 레코드들은 오래된 레코드를 대체 한다.이에 대한 자세한
사항은 13.2.6 "REPLACE"부분을 참조 하라.
INSERT ... VALUES 나 INSERT ...SELECT 문에서 컬럼 이름들을 지정하지 않으면 테이블안의 모든 컬럼 값은 VALUE 리스
트나 SELECT 문에 의 해 제공 되어야 한다. 만약 여러분이 테이블의 컬럼 순서를 모르는 경우 DESCRIBE 테이블 이름을 사용하
라.
정규식 exprdms value 리스트에서 이미 설정된 컬럼을 참조 할 수 있다. 예를 들면 컬럼 col2가 col1을 참조 하는데 이는 그 전에
할당 된것이다.
각 레코드에 대한 값 리스트는 괄호로 묶여야 된다. 다음 SQL문은 리스트의 값들의 수가 컬럼 이름의 수와 맞지 않으므로 올바르
지 않다.
여러분이 다수 값 리스트와 INSERT ... VALUES를 사용하거나 INSERT ...SELECT문을 사용하면, 이 SQL문은 아래 포맷 대로
정보 문자열을 리턴한다.
Records 는 SQL문에 의해 처리된 레코드의 수를 의미한다. (이는 Duplicates가 0이 아닐 수 있기 때문에 실제로 삽입된 레코드
수일 필요는 없다)Duplicates 는 레코드들이 다른 레코드들과 유일 키 값에 의해 중복 되므로 삽입 될수 없는 레코드의 수를 의미
한다. Warnings는 문제가 될 수 있는 식으로 컬럼 값들을 삽입 하려 한 시도 횟수를 의미한다. Warnings는 다음 아래 조건들에서
일어 날 수 있다.
NOT NULL로 선언된 컬럼에 NULL을 삽입 하는 경우. 다수 레코드 삽입 SQL문 이나 INSERT INTO ... SELECT 문에 대해, 컬
럼의 암시적인 기본 값을 설정한다. 이것은 숫자 형에는 0을, string 형에는 빈 문자열(''), 그리고 date와 time 형에는 "zero"값이
할당 된다. INSERT INTO... SELECT SQL문은 서버가 결과가 하나의 레코드만을 리턴하는지 보기 위해 SELECT에서 결과를
검사 하지 않으므로 다수 레코드 삽입에서와 같은 방식으로 처리 된다. (단일 레코드 INSERT 문에 대해, NULL이 NOT NULL 컬
럼에 삽입 되면 warning이 발생 하지 않고 에러와 함께 실패 하게 된다.)
숫자 컬럼에 '10.34 a'과 같은 할당. 숫자가 아닌 텍스는 삭제 되고 남은 숫자 부분만 삽입된다. 문자열 값이 숫자 부분이 없을 경우
에는 0으로 설정된다.
컬럼의 최대 길이를 초과하는 문자열 컬럼(CHAR, VARCHAR, TEXT , 혹은 BLOB)에 문자열 삽입. 값은 컬럼의 최대 길이에서
잘린다.
data 형에서 올바른 date나 time 컬럼에 값 삽입인 경우. 그 컬럼은 그 형에 적당한 zero 값으로 설정된다.
C API 함수를 이용할 경우, mysql_info() 함수를 사용하여 정보 문자열을 얻을 수 잇다. 이에 대한 사항은 22.2.3.34장
"mysql_info()"부분을 참조 하라.
DELAYED키워드를 사용하면 서버는 레코드들을 버퍼 안에 삽입되게 하고, INSERT DELAYED문을 사용한 클라이언트는 즉시
다음일을 계속 할 수 있다. 테이블이 사용중이면 서버는 레코드들을 보관 한다. 테이블이 사용상태가 아니면 서버는 삽입 작업을 시
작하는데 테이블에 대한 새로운 읽기 요청이 있는지를 정기적으로 체크한다. 만약 이럴 경우, 지연된 레코드 큐는 테이블이 다시
비 사용 상태가 될 때까지 중지 상태가 된다. 이에 대한 자세한 사항은 13.2.4.2장 "INSERT DELAYED"를 참조 하라.
DELAYED는 INSERT ... SELECT 나 INSERT ... ON DUPLICATE KEY UPDATE에서 무시 된다.
LOW_PRIORITY 키워드를 사용하면, INSERT문의 실행은 다른 클라이언트들이 테이블에서 읽지않을 때까지 지연된다. 클라이언
트들이 읽는 중간 그리고 INSERT LOW PRIORITY문이 기다리는 동안 읽기를 시작한 다른 클라이언트도 포함한다. 오랜 시간
동안 기다리기 위해 INSERT LOW_ PRIORITY문을 사용하는 것이 가능하다. (이것은 INSERT DELAYED와 대조적인데 , 이
SQL문은 클라이언트가 동시에 계속 하게 한다. LOW_PRIORITY가 MyISAM ㅌ;이블과 함께 사용될수 없다. 이는 동시적인 삽입
을 불가능 하게 하기때문이다. 이에 대한 내용은 7.3.3장 "동시적인 삽입(concurrent insert)"부분을 참조 하라.
HIGH_PRIORITY를 명시 하는 경우 서버가 이 옵션으로 시작 했다면 low-priority 업데이트의 효과를 뒤엎는다. 이것은 동시적
인 삽입이 사용되지 못하게 한다.
IGNORE 키워드 사용시 INSERT문을 처리 하는 동안 발생하는 에러들은 warning으로 처리 된다. 예를 들면, IGNORE 없이
UNIQUE 혹은 PRIMARY KEY 값으로 중복 되는 레코드는 중복 키 에러를 발생 시키고 그 문장은 취소 된다. IGNORE을 써도 그
레코드는 삽입 이 안되는데 이때 에러는 발생 되지 않는다. 에러를 유발 시키는 데이터 변환은 IGNORE가 명시 되지 않으면 취소
된다. IGNORE가 있으면 잘못된 값들은 근사 값들로 대치 되고삽입 된다. warning이 발생 하지만 그 SQL문이 취소 되지는 않는
다. 여러분은 얼마나 많은 레코드들이 테이블에 실제 삽입 되었는지 보기 위해 C API 함수인 mysql_info()함수로 결정 할 수 있다.
ON DUPLICATE KEY UPDATE를 명시 하면 UNIQUE 인덱스나 PRIMARY KEY에서 중복을 유발할 레코드가 삽입 되고 예전
레코드의 UPDATE가 수행 된다. 이에 대한 사항은 13.2.4.3장 "INSERT ... ON DUPLICATE KEY UPDATE" 부분을 참조 하
라.
제목검색
13.2.4 INSERT
[INTO] tbl_name [(col_name,...)]
13.2.4.1 INSERT ..
13.2.4.2 INSERT DELAYED
SELECT ...
13.2.4.3 INSERT ..
SELECT tbl_temp1.fld_order_id
INSERT 문의 목표 테이블은 질의의 SELECT 문의 FROM 절에 나타날 수 있다. (예전 MySQL에서는 발생 하지 않았다)
AUTO_INCREMENT컬럼들이 변함 없이 작동한다.
바이너리 로그가 원본 테이블의 재 생성을 위해 사용되도록하려면 MySQL은 INSERT ... SELECT 문을 위한 현재 삽입들을 가
능하지 않게 한다.
ON DUPLICATE KEY UPDATE의 값 부분에서 SELECT 부분에서 GROUD BY문을사용 하지 않는 이상 여러분은 다른 테이블
에서 컬럼들을 참조 할수 있다. 하나의 side effect는 여러분이 값 부분에서 유일 하지 않은 컬럼 이름들을 손질 해야 한다는 것이
다.
제목검색
13.2.4.1 INSERT ..
13.2.4.2 INSERT DELAYED
INSERT 문에서 DELAYED옵션은 표준 SQL에 대한 MySQL의 확장 이다. 이것은 여러분이 INSERT 를 완수 하기 위해 기다려
13.2.4.3 INSERT ..
야 하는 클라이언트가 있을때 유용 하다. 이 것은 여러분이 logging을 위해 MySQL을 사용할 때와 주기적으로 오랜 시간을 필요로
하는 SELECT와 UPDATE문을 실행 시킬때 일반 적인 상황이다.
클라이언트가 INSERT DELAYED를 사용할 때 server 로부터 OK를 받고 그 레코드는 테이블이 다른 어떤 쓰레드에 의해서 사용
되지 않을때 queuing되 었다가 삽입 된다.
테이블이 반대로 사용되지 않으면 INSERT DELAYED가 일반 INSERT보다 느려짐을 유의 해야 한다. 지연된 레코드들이 있는
각 테이블에 대해 서버가 개별 쓰레드로 하여금 처리 하게 하면 추가적인 오버 헤드가 있다. 이는 정말 필요로 할 때에만 INSERT
DELAYED를 사용해 함을 의미 한다.
queuing된 레코드들은 table에 삽입 될 때까지 메모리에 존재 한다. 이는 여러분이 mysqld를 종료 하거나 mysqld가 죽을때 디스
크에 쓰여지지 않은 queuing된 레코드들은 분실 된 다는 것을 의미 한다.
INSERT DELAYED문은 MyISAM, MEMORY 과 ARCHIVE 테이블에서 쓰인다. 이에 대한 사항은 14.1장 "MyISAM 저장 엔
진", 14.4장 "MEMORY(HEAP) 저장 엔진", 그리고 14.8장 "ARCHIVE 저장 엔진" 부분을 참조 하라.
MyISAM 테이블의 경우, 데이타 바일의 중간에 빈 블럭이 없는경우 SELECT 와 INSERT 문들이 지원된다. 이들 환경에서는
MyISAM에서 INSERT DELAYED를 쓸 필요가 거의 없다.
INSERT DELAYED는 값 리스트 들을 명시하는 INSERT 문에서만 사용되어야 한다. 서버는 INSERT ... SELECT 혹은
INSERT ... ON UPDATE KEY UPDATE 문을 위해 DELAYED를 무시 한다.
다음 설명들은 여러분이 INSERT 나 REPLACE에 대한 DELAYED 옵션을 사용할때 발생하는 사항에 대해 상세히 설명 한다. 이
설명에서 "쓰레드(thread)"는 INSERT DELAYED문을 받는 쓰레드 이고 "핸들러(handler)"는 특정 테이블에 대한 모든
INSERT DELAYED 문을 처리 하는 쓰레드 이다.
쓰레드는 핸들러가 이전에 얻은 DELAYED 잠금(lock)을 가지고 있는지 검사 하고 이 잠금(lock)이 없다면 핸들러 쓰레드에게 이
를 명령한다. DELAYED 잠금은 다른 쓰레드들이 테이블에 대해 READ 혹은 WRITE잠금을 가진 경우도 얻어질 수 있다. 그러나
핸들러는 테이블 구조가 최신상 태를 유지 하도록 하기 위해 모든 ALTER TABLE 잠금 이나 FLUSH TABLES 문이 끝나길 기다
린다.
쓰레드는 INSERT 문을 실행 하지만 레코드를 테이블에 쓰는 대신 최종 레코드의 복사본을 핸들러 쓰레드가 관리하는 큐(queue)
에 넣어 둔다. 쓰레드에 의해 문법 에러가 발생 되고 이는 클라이언트 프로그램에 보고 된다.
클라이언트는 서버에서 중복된 레코드의 수나 결과 레코드를 위한 AUTO_INCREMENT값을 얻을수 없다. 삽입 연산이 끝나기 전
에 INSERT는 리턴 되기 때문이다. ( 같은 이유로 C API 함수인 mysql_info()함수를 사용하면 어떤 값도 리턴 할수 없다.)
바이너리 log는 레코드가 테이블에 삽입 될때 핸들러 쓰레드에 의해 업데이트 된다. 다수 레코드 삽입의 경우 바이너리 log는 첫번
째 레코드가 삽입 될때 업데이트 된다.
핸들러가 큐에 더이상의 레코드를 가지고 있지 않으면 테이블의 잠금은 풀린다. 새로운 INSERT DELAYED문들이
delayed_insert_time 시간안에 있지 않으면 핸들러는 종료된다.
핸들러 쓰레드는 Command 컬럼 안에 delayed_insert로 MySQL 프로세스 리스트 안에 나타난다. 여러분이 FLUSH TABLES 문
을 실행 하거나 KILL 쓰레드 id 을 이용하면 그 쓰레드를 제거 할 수 있다. 그러나 그 전에 모든 큐잉 된 레코드들을 테이블에 저장
한다. 이 시간 동안은 다른 쓰레드들로 부터 어떤 새로운 INSERT 문도 받아 들이지 않는다. 이 뒤에 INSERT DELAYED를 실행
하면 새로운 핸들러 쓰레드가 생성된다.
제목검색
13. SQL 문법(SQL Statement Syntax) ON DUPLICATE KEY UPDATE를 명시 할경우, UNIQUE 인덱스 혹은 PRIMATU KEY에서 중복 값을 가진 레코드가 삽입되
13.2. 데이터 조작 SQL문 면 예전 레코드의 UPDATE 가 수행된다. 예를 들면 컬럼 a가 UNIQUE 로 선언되고 값으로 1을 가진 경우 다음 두 문장은 동일
13.2.4.1 INSERT ..
13.2.4.2 INSERT DELAYED INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
13.2.4.3 INSERT ..
a=1 OR b=2 가 몇개의 레코드와 일치하면 단지 하나의 레코드만 업데이트 된다. 일반적으로 여러분을 다수 유일 인덱스를 가진
테이블에서 ON DUPLICATE KEY절을 사용하여 이를 피하여야 한다.
INSERT ... UPDATE문의 INSERT 부분에서 컬럼 값을 참조하게 되는 UPDATE절에서 VALUES(컬럼 이름)함수를 사용할 수
있다. 즉, UPDATE 절 안의VALUES(컬럼 이름)은 삽입될 컬럼 이름의 값을 참조 하여 중복 키 문제가 발생 하지 않는다. 이 함수
는 다수 레코드 삽입시 유용한다. VALUES() 함수는
INSERT ... UPDATE문에서만 유효 하며 그 외경우는 NULL을 리턴한다.
예를 들면 ;
제목검색
13.2. 데이터 조작 SQL문 LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[FIELDS
[TERMINATED BY 'string']
[ESCAPED BY 'char']
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
[(col_name_or_user_var,...)]
LOAD DATA INFILE 텍스트 파일에서 테이블에 매우 빠른 속도록 레코드를 읽어 들인다. 파일 이름은 알파벳 문자열로 주어져
야 한다.
LOAD DATA INFILE 은 SELECT ... INTO OUTFILE 문의 보충이다. (13.2.7장 "SELECT"부분을 참고 하라.) 테이블에서 파
일로 데이타를 쓰기 위해서는 SELECT ... INTO OUTFILE문을 사용하라. 파일에서 테이블로 다시 읽기 위해서는 LOAD DATA
INFILE 을 사용하라. FIELDS와 LINES 절의 문법은 두 문장에서 동일하다. 두 절은 옵션이며 두개의 절이 명시된 경우 LINES 절
이 선행 한다.
LOAD DATA INFILE 의 속도 개선과 LOAD DATA INFILE 에 비해 INSERT의 효과에 대한 정보는 7.2.16장 "INSERT 문의
속도" 부분을 참조 하라.
character_set_database 시스템 변수에 의해 지정된 문자열 모음(character set)은 파일안의 정보를 해석하기 위해 사용된다.
SET NAMES와 character_set_client의 설정은 입력에 대한 해석에 영향을 주지 않는다.
mysqlimport utility를 사용하여 데이타 파일을 읽어 들일수 있다. 이 utility는 LOAD DATA INFILE 문을 서버에 보냄으로서 작
동한다. --local 옵션은 mysqlimport가 클라이언트 호스트로부터 데이타 파일을 읽도록 한다. 여러분은 클라이언트와 서버가 압
축 프로토콜을 지원하는 경우 느린 네트웍에서 좀더 성능을 향상 시키기 위해 --compress 옵션을 사용할 수 있다. 이에대한 자세
한 내용은 8.12장 "mysqlimport - 데이타 가져오기 프로그램" 부분을 참조하라.
된다.
동시 삽입(즉, 중간에 빈 블럭을 갖지 않는 경우)을 위한 조건을 만족하는 시키는 MyISAM 테이블에 대해 CONCURRENT를 명시
하면 다른 쓰레드는 LOAD DATA 가 실행 되는동안 테이블에서 데이타를 가져 올 수 있다. 이 옵션의 사용은 동시에 다른 어떤 쓰
레드들도 그 테이블을 사용하지 않아도 LOAD DATA의 성능에 약간 영향을 준다.
LOCAL 이 명시 되면 파일은 클라이언트 호스트에서 읽혀져 서버에 보내진다. 이 파일은 정확한 위치를 명시 하기 위해 절대 경로
로 주어질수 있다. 상대 경로로 주어지는 경우 그 이름은 클라이언트 프로그램이 시작한 디렉토리와 연관되어 해석 된다.
LOCAL 이 명시 되지 않으면 파일은 서버 호스트에 존재해야하며 서버에 의해 직접 읽혀 진다. 서버는 파일의 위치를 파악 하기 위
해 다음 규칙을 사용한다.
파일 이름이 하나 혹은 그 이상의 컴포넌트를 가진 상대 경로이면 서버는 서버의 데이타 디렉토리와 관련된 파일을 찾는다.
주요 요소를 갖지 않은 파일이름이 주어진 경우 서버는 기본 데이타 베이스의 데이타베이스 디렉토리에서 파일을 검색 한다.
LOCAL 이 아닌 경우, 이들 규칙들은 ./myfile.txt로 주어진 파일은 서버의 데이타 디렉토리에서 읽혀짐을 의미한다. 파일 이름이
myfile.txt인경우에는 기본 데이타베이스의 데이타베이스 디렉토리에서 읽혀 진다. 예를 들면 db1이 기본 데이타베이스 이면 , 그
SQL문이 그 파일을 db2 데이타베이스 안의 테이블에 읽어 들인다 해도, 다음 LOAD DATA 문은 db1의 데이타베이스 디렉토리로
부터 data.txt파일을 읽는다.
Windows 경로는 역 슬래쉬보다 슬래쉬를 사용하여 명시 된다. 여러분이 역 슬래쉬를 이용하면 두번 상요해야 한다.
안전상의 이유로 서버에 위치한 텍스트 파일들을 읽을때 파일들은 데이타베이스 디렉토리에 위치 하거나 모두에 의해 읽혀질 수 있
어야 한다. 또한 서버 파일에서 LOAD DATA INFILE 의 사용을 위해서는 FILE 권한을 가지고 있어야 한다. 이에 대한 사항은
LOCAL의 사용은 서버가 파일을 직접 접근하도록 하는 것보다 약간 느린데 그 파일의 내용이 클라이언트에서 서버로의 연결을 통
해 보내지기 때문이다. 반면 LOCAL파일을 읽어들이기 위해서 FILE권한은 필요없다.
LOCAL은 서버와 클라이언트 모두가 그것을 허락하는 경우에만 작동한다. 예를 들면 mysqld가 --local-infile=0, 으로 시작하
면 , LOCAL은 작동하지 않는다. 이에 대한 사항은 5.7.4장 " LOAD DATA LOCAL의 Security사항" 부분을 참조 하라.
Unix에서는 pipe에서 읽기 위해 LOAD DATA 를 필요로 하는 경우 여러분은 다음과 같은 기술을 사용할 수 있다.
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
find / -ls > /mysql/db/x/x
mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x
REPLACE 와 IGNORE 키워드들은 유일키 값에서 중복 된 레코드가 있을때, 레코드의 입력 처리를 제어 한다.
REPLACE를 명시하면 입력 레코드는 존재하는 레코드를 바꾼다. 즉, primary key나 unique 인덱스 값이 같은 레코드가 있을 경
우이다. 이에 대한사항은 13.2.6장 "REPLACE"부분을 참조 하라
여러분이 IGNORE를 명시 하면, 유일키에서 기존 레코드와 중복된 레코드 입력은 건너뛴다. 여러분이 어떤 옵션도 명시 하지 않으
면 그 행동은 LOCAL 키워드가 명시 되어 있느냐에 따라 달라진다. LOCAL이 없는 경우, 중복된 키값이 발견되면 에러가 발생한
다. 이때 텍스트 파링릐 나머지는 무시 된다. LOCAL이 있는 경우, 기본 행동은 IGNORE가 명시 되었을때와 같다. 이는 서버가 연
산 중간에 파일의 전송을 중단 시킬 방법이 없기때문이다.
기 전 ALTER TABLE ... DISABLE KEYS문으로 그것들을 제외 시키면 훨씬 빨리 인덱스를 생성 할 수 있다. 이에 대한 사항은
7.2.15장 "INSERT 문의 속도"부분을 참조 하라.
LOAD DATA INFILE과 SELECT ... INTO OUTFILE문 모두에게 , FIELDS와 LINES 절의 문법은 같다. 두 절은 옵션이지만
FIELDS가 LINES보다 선행 한다.
달리 말하자면, 기본 값들은 LOAD DATA INFILE 입력을 읽을때 다음과 같이 행동하도록 한다.
반대로, 기본적으로 쓰기의 경우, SELECT ... INTO OUTFILE 문이 다음과 같이 행동하도록 한다.
필드 사이에 탭을 쓰라.
역슬래쉬(backslash)는 문자열에서 MySQL excape 문자이다. 따라서 FIELDS ESCAPED BY '₩₩'를 쓰려면 두개의 사용하여
하나의 역슬래쉬로 해석 되도록 하라.
주의 : 윈도우 시스템에서 텍스트 파일을 생성했다면 여러분은 파일을 적절하게 읽기 위해 LINES TEMINATED BY '₩r₩n' 을
사용해야 한다. 왜냐 하면 윈도우 프로그램은 전형적으로 라인 종결자로써 두개의 문자열을 사용하기 때문이다. 워드 패드 같은 프
로그램은 파일 쓰기가 끝나면 줄 종결자로서 ₩r을 사용한다. 이런 파일을 읽기 위해서는 LINE TERMINATED BY '₩r'을 사용하
라.
여러분이 읽어들이는 모든 라인이 여러분이 무시하려는 일반 prefix를 가진 경우 그 prefix를 건너뛰기 위해 LINES STARTING
BY 'prefix_string'을 사용할 수 있다. 한 라인이 prefix를 포함 하지 않으면 전체 라인이 걸러 진다. 여러분이 다음과 같은 문장을
사용 한다고 하면
xxx"abc",1
something xxx"def",2
"ghi",3
IGNORE 숫자 LINES 옵션은 파일의 시작에서 라인들을 모시 하기 위해 사용될 수 있다. 예를 들면 IGNORE 1 LINES를 쓰면 컬
데이타베이스에서 데이타를 파일에 쓰기 위해 LOAD DATA INFILE와 연결된 SELECT ... INTO OUTFILE을 사용하고 다시 파
일을 데이타베이스로 읽어 들일 경우 두 SQL문은 필드와 라인 처리 옵션이 일치 해야 한다. 그렇지 않으면 LOAD DATA INFILE
은 파일의 내용을 처리 하지 못할 것이다. 콤마로 구분된 필드들을 파일에 쓰기 위해 SELECT ... INTO OUTFILE을 사용한다고
가정하면;
아래와 같은 SQL문을 사용하여 파일을 읽는다면, LOAD DATA INFILE이 필드들 사이에서 탭을 찾으려 하기 때문에 작동하지 않
는다.
FIELDS [OPTIONALLY] ENCLOSED BY는 필드들의 인용을 제어한다. 출력(output) (SELECT ... INTO OUTFILE)을 위
해 , OPTIONALLY를 생략 하면 모든 필드들이 ENCLOSED BY 문자에 의해 둘러싸인다. 아래 예제를 참고 하라.
"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a ₩" quote","102.20"
"4","a string containing a ₩", quote and comma","102.20"
여러분이 OPTIONALLY를 명시하면 , ENCLOSED BY 문자는 문자 데이타 형(CHAR, BINARY, TEXT, ENUM)을 갖는 컬럼들
로 부터 값들을 포함 시키기 위해 사용된다.
1,"a string",100.20
한 필드 값안의 ENCLOSED BY 문자의 출현은 ESCAPED BY 문자로 그것들을 prefix로 만드는 것에서 벗어난는 점에 유의 하
라. 또한 여러분이 빈 ESCAPED BY 값을 명시하면 LOAD DATA INFILE에 의해 올바르게 읽혀 질수 없는 output을 만들 가능
성이 있다는것을 주의 하라. 예를 들면 선행하는 output은 escape문자가 비어 있으면 다음과 같이 나타날 것이다. 네번째 줄의 두
번째 필드가 다음 인용 을 하는 콤마를 포함 한경우 필드를 끝내기 위해 나타난다.
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20
FIELDS ESCAPED BY는 특별한 문자들을 어떻게 읽고 쓰는지 제어 한다. 만약 FIELDS ESCAPED BY 문자가 비어 있지 않으
면 output에서 다음 문자들을 prefix로 하는데 사용한다.
FIELDS ESCAPED BYTE 문자가 빈 경우, 어떤 문자들도 이를 벗어 날 수 없으며 NULL은 ₩N 이 아닌 NULL로 출력된다. 빈
escape문자를 명시하는 것은 좋은 생각이 아니며 데이타의 필드 값들이 주어진 문자들 중 하나를 포함 한다면 더욱 좋지 않다.
'₩' escape 문법에 관한 보다 자세한 사항은 9.1장 "문자 값" 부분을 참조 하라.
LINES TERMINATED BY가 빈 문자열이고 FIELDS TERMINATED BY가 비어있지 않을경우 라인은 FIELDS
TERMINATED BY로 끝맺는다.
FIELDS TERMINATED BY 와 FIELDS ENCLOSED BY값들은 모두 빈(empty,'')경우, fixed-row 포맷이 사용된다. fixed-
row포맷과는 어떤 경계자(delimiter)들도 필드 사이에서 사용되지 않는다. 대신 컬럼 값들은 컬럼의 display 폭을 이용하여 읽기
와 쓰기를 한다. 예를 들면 한 컬럼이 INT(7)로 선언 되면, 그 컬럼의 값들이 7자리 필드를 이용하여 쓰여진다. 입력시, 컬럼에 대
한 값들은 7자리 문자들을 읽어 얻어진다.
LINES TERMINATED BY가 각 라인들을 분리 하기 위해 사용된다. 한 라인이 모든 필드를 포함 하지 않으면 나머지 컬럼들은 기
본값으로 설정 된다. 라인 종결자를 갖지 않으면 여러분은 이를 ''로 설정 해야한다. 이경우 텍스트 파일은 각 레코드를 위해 모든 필
드를 포함한다.
Fixed-row 포맷은 나중에 설명이 되겠지만 NULL값들의 처리에 영향을 준다. 고정 크기의 포맷은 여러분이 multi-byte문자 모
기본 FIELDS와 LINES 값들에 대해, NULL이 output을 위해 ₩N의 필드 값으로 쓰여지고 ₩N의 필드 값이 입력시 NULL로 읽
혀 진다. (ESCAPED BY 문자 가 '₩N'이라 가정한면)
FIELDS ENCLOSED BY가 empty가 아니면 NULL 문자를 포함한 필드는 NULL 값으로 읽혀 진다. 이것은 FIELDS
ENCLOSED BY 문자열안에 묶인 NULL과는 다른데 이것은 문자열 'NULL'로 읽혀 진다.
fixed-row포맷으로 (FIELDS TERMINATED BY와 FIELDS ENCLOSED BY 모두가 empty empty일경우 사용된다.), NULL
이 empty 문자열로 사용된다.이것은 NULL 값들과 table의 empty문자열이 파일에 쓰여질때 둘다가 empty 문자열로 쓰여지므로
구분이 불가능하다. 만양 여러분이 파일에서 읽어 들일때 서로 다르게 말해야하 할 경우가 있다면 fixed-row 포맷을 사용할수 없
다.
고정 크기 레코드(FIELDS TERMINATED BY와 FIELDS ENCLOSED BY모두 empty)와 BLOB 혹은 TEXT 컬럼들.
FIELDS ESCAPED BY가 empty이면 FIELDS TERMINATED BY 값에 수반된 FIELDS ENCLOSED BY혹은 LINES
TERMINATED BY를 포함하는 한 필드 값은 LOAD DATA INFILE이 되어 필드나 라인을 읽는것을 빨리 멈춘다. LOAD
DATA INFILE이 필드나 라인 값이 어디에서 끝나는지 정확히 결정 할 수 없기때문에 발생한다.
기본적으로 컬럼 리스트가 LOAD DATA INFILE 문의 끝에 제공 되지 않으면 입력 라인들은 각 테이블 컬럼에 대해 하나의 필드
를 포함하는것으로 예상된다. 만약 여러분이 테이블의 컬럼들중 일부만을 읽어들이고 싶다면 컬럼 리스트를 명시 하라.
여러분은 입력 파일의 필드 순서가 테이블 안의 컬럼들의 순서와 다른 경우 여러분은 하나의 컬럼 리스트를 명시 해야 한다. 그렇
지 않으면 MySQL은 테이블 컬럼과 입력 필드들을 어떻게 매치 시킬지 말할 수 없다.
MySQL 5.0.3이전에는 컬럼 리스트는 읽혀진 컬럼들의 이름을 포함 해야하며 SET 절은 제공 되지 않는다. MySQL 5.0.3에서부
터는 컬럼 리스트는 컬럼 이름들이나 사용자 변수들을 포함할 수 있다. 사용자 변수들과 함께 SET절은 그 결과를 컬럼들에 할당
하기 전에 변수 값들에 변환을 수행 할수 있게 한다.
SET절의 사용자 변수들은 몇가지 방법으로 사용될 수 있다. 다름 예제는 t1.column1의 값에 직접 처음 입력 컬럼을 사용하고 두
번째 컬럼은 t1.column2의 값에 사용되기전의 분리 연산에 의해 사용자변수에 할당 된다.
SET절은 입력 파일로부터 나오지 않은 값들을 제공하는데 사용될수 있다. 다음 SQL문은 column3을 현내 날짜와 시간으로 설정
한다.
입력 값을 사용자 변수에 할당하여 없애고 그 변수를 테이블 컬럼에 할당하지 않음으로서 제거 할 수 있다.
SET 할당의 오른쪽에 하부 질의를 사용할 수 있다. 한 컬럼에 할당되기 위한 값을 리턴하는 하부 질의는 스칼라(scalar) 하부 질
의 이다. 또한 여러분은 읽혀지고 있는 테이블로 부터 선택을 하기 위해 하부 질의를 사용할 수 없다.
fixed-row포맷으로 데이타를 로딩할때 사용자 변수들이 display폭을 갖지 않으므로 사용자 변수들은 사용될 수 없다.
입력 라인을 처리 할때 LOAD DATA는 필드들로 나누고 값들을 컬럼/변수 리스트와 SET절에 따라 나눈다. 그리고 결과 레코드
는 테이블에 삽입된다. 테이블을 위해 BEFORE INSERT 나 AFTER INSERT 트리가가 있는경우 레코드 삽입 이전 혹은 이후에
개별 적으로 활성화 된다.
empty필드 값이 다르게 해석 되면
date와 time형인 경우 컬럼은 "zero"값으로 설정된다. 이 내용은 11.3장 "날짜와 시간 형"부분을 참고하라.
LOAD DATA INFILE 는 모든 입력을 문자열들로 인식하고 INSERT 문과 함께 ENUM이나 SET컬럼을 위한 숫자 값들을 사용
할 수 없다. 모든 ENUM과 SET값들은 문자열들로 명시 되어야 한다.
127
+----------+
| bin(b+0) |
+----------+
| 10 |
| 1111111 |
+----------+
여러분이 C API 함수를 사용한다면 mysal_info()함수를 호출하여 SQL문에관한 정보를 얻을 수 있다. 22.2.3.34장 "mysql_info
()"부분을 참조 하라.
어떤 잘못된 것이 있는지에 관한 정보로서 max error_count 경고의 리스트를 얻기 위해서 SHOW WARNINGS를 사용할 수 있
제목검색
또는:
또는:
REPLACE 는 표준 SQL에 대한 MySQL의 확장이다. 이것은 삽입, 혹은 삭제 후 삽입을 한다. 여러분이 이 SQL문 뒤에 오는 SQL
문에 대해 알고자 한다면 13.2.4.3장 “INSERT ... ON DUPLICATE KEY UPDATE”” 부분을 참조 하라.
테이블이 PRIMARY KEY 나 UNIQUE 인덱스를 갖지 않는 한, REPLACE문을 이용하는 것은 적절 하지 못하다는 것을 유의 해
야 한다. 이것은 새로운 레코드가 다른 것과 중복 될 때 결정하는데 필요한 인덱스가 없으므로 INSERT문과 같아진다.
모든 컬럼들에 대한 값은REPLACE 문에서 명시된 값들로부터 얻어진다. 빠진 누락된 컬럼들은 INSERT 문에서와 같이 기본값들
로 설정 된다. 현재 레코드에서 값을 참조 하거나 새로운 레코드에서 참조 할 수 없다. SET col_name=col_name + 1과 같은 할
당문을 사용할 경우, 오른쪽의 컬럼이름에 대한 참조는 DEFAULT(col_name)으로 할당 되고 이 할당은 SET col_name =
DEFAULT(col_name) + 1 과 같다.
REPLACE문은 영향을 받는 레코드의 수를 가리키는 값을 리턴한다. 이것은 삭제되고 삽입된 레코드의 합계이다. 그 수가 단일 레
코드 REPLACE인 경우 하나의 레코드가 삽입되고 삭제된 레코드가 없음을 의미한다. count값이 1보다 큰 경우 하나 혹은 그 이상
의 오랜 레코드들은 새로운 레코드가 삽입되기 전에 삭제 된 것이다. 테이블이 다중 유일 인덱스를 포함하고 있고 새로운 레코드가
다른 유일 인덱스 에서 오래된 레코드와 다른 중복된 값을 갖게 된다면 오래된 것과 교체될 가능성이 있다.
제목검색
SELECT 문은 하나 이상의 테이블에서 선택된 레코드들을 가져오기 위해 사용된다. 13.2.7.2 “UNION”과 13.2.8
“Subquery”부분을 참조 하라.
가장 빈번하게 사용되는 SELECT문의 절은 다음과 같다: The most commonly used clauses of SELECT statements are
these:
WHERE 절에서 MySQL이 제공하는 어떤 함수나 연산자를 사용하여도 된다. 단지 예외가 되는 것은12장 “기능과 오퍼
레이터” 을 참조하라.
SELECT는 어떤 테이블에 대한 참조 없이도 레코드를 가져오는데 사용될 수 있다.
예를 들면:
mysql> SELECT 1 + 1;
-> 2
어떤 테이블도 참조 되지 않는 상황에서는 dummy 테이블을 의미하는 DUAL 을 명시할 수 있다.:
mysql> SELECT 1 + 1 FROM DUAL;
-> 2
DUAL 은 FROM 절을 필요로 하는 다른 데이터베이스 서버들과의 호환성을 한 것이다. MySQL은 어떤 테이블도 참조 되지 않으
면 그 저을 필요로 하지 않는다.
일반적으로 상용되는 절들은 문법 표현에서 보여지는 순서대로 정확하게 주어져야 한다. 예를 들면 HAVING절은 GROUP BY절
뒤에 와야 하고 ORDER BY절 앞에 위치 해야 한다. INTO 절은 문 앞에 위치 하거나 FROM절 바로 앞에 위치 할 수 있다.
● select_expr 는 AS alias_name를 사용하여 하나의 alias로 사용될 수 있다. Alias는 문장의 컬럼 이름으로서 사용되며
GROUP BY, ORDER BY 혹은 HAVING절들 안에서 사용될 수 있다. 예를 들면
역 방향으로 정렬하기 위해서 여러분이 정열하려는 ORDER BY 절 안에 컬럼의 이름을 위한 DESC 키워드를 추가하라.
기본 값은 ascending 순서이며 이것은 ASC 키워드를 사용하여 명시적으로 지정될 수 있다.
컬럼 위치의 사용은 그 문법이 SQL 표준에서 없어졌으므로 사용하지 말아야 한다.
● MySQL는 GROUP BY 절을 확장하여 절안에서 명명된 컬럼들 뒤에 ASC 와 DESC 를 지정할 수 있다. extends the
GROUP BY clause so that you can also specify ASC and DESC after columns named in the clause:
● MySQL은 GROUP BY절에서 언급되지 않은 필드의 선택을 허용하기 위해 GROU BY의 사용을 확장한다. 여러분이 질의
로부터 바라는 결과를 얻지 못한다면 12.10장 “GROUP 절과 함께 사용하는 함수들과 modifier들”.
● GROUP BY 는 WITH ROLLUP modifier를 허용한다. 12.10.2장 “GROUP BY Modifiers”부분을 참조하라.
● 최적화 없이 아이템들이 클라이언트로 보내지기 전데 HAVING 절이 가장 마지막에 적용 된다
● MySQL 5.0.2이전에는 HAVING 절은 SELECT 리스트 안의 select_expr안에서 명명된 alias나 어떤 컬럼도 참조 할 수
있다. SQL 표준은 HAVING은 GROUP BY절 안의 컬럼들혹은 aggregate 함수에서 사용되는 컬럼 들에 대해서만 참조해
야 한다는 것을 요구한다. 표준과 MySQL 모두를 수용하기 위해서-SELECT리스트에서 컬럼들을 참조할수 있는 특별 행
동자,MySQL 5.0.2과 그 이상의 버전은 SELECT list에서 컬럼들이나 GROUP BY절안의 컬럼들, 외부 sub질의안에서의
컬럼, aggregate 함수들을 참조 하는 것을 허용한다
● 예를 들면 다음 예문은 MySQL5.0.2에서 동작하지만 이전 버전에서는 에러가 발생한다:
HAVING절이 모호한 컬럼을 참조할 경우 경고가 발생한다. 다음 문장 에서col2가 컬럼 이름과 alias모두로 사용되고
있기 때문에 모호해 진다.
두 개의 argument중 첫 번째는 리턴될 첫 레코드의 offset이고 두번째는 리턴될 최대 레코드 수를 지정한다. 초기 레코드
의 offset은 0이다
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
● SELECT의SELECT ... INTO OUTFILE 'file_name' 폼은 선택된 레코드들을 한 파일에 기록한다. 이 파일은 서버 호스
트에서 생성되므로 이 문을 사용하기 위해서는 FILE 권한을 가지고 있어야 한다. file_name 은 존재하지 않는 파일 일 수
도 있다. 이는 /etc/passwd 나 데이터베이스 테이블과 같은 파일들을 삭제 하지 못하게 한다. MySQL 5.0.19부터는
character_set_filesystem 시스템 변수가 파일 이름의 해석을 조절 한다.
SELECT ... INTO OUTFILE 문은 테이블을 서버에 있는 한 텍스트 파일에 빠르게 쎃넣게 하기 위해 주로 사용된다. 여
러분이 서버가 아닌 클라이언트 호스트에 결과 파일을 생성 하고자 한다면 SELECT … INTO OUTFILE을 사용 할 수 없
다. 이 경우, mysql –e “SELECT … “ > file_name문을 파일을 클라이언트에 생성하기 위해 사용해야 한다.
SELECT ... INTO OUTFILE는 LOAD DATA INFILE의 보완이다. 즉, SQL문의 export_options 부분의 문법은
LOAD DATA INFILE과 함께 사용되는 같은 FIELDS와 LINES절로 구성된다. 이에 대한 내용은 13.2.5장 “LOAD
DATA INFILE”을 참조하라.
FIELDS ESCAPED BY 은 특수 문자들의 사용 방법을 제어한다. 만일 FIELDS ESCAPED BY 문자가 비어 있지 않으
면 output에서 다음 문자들에 선행되는 하나의 prefix로 사용된다.
❍ FIELDS ESCAPED BY 문자
❍ FIELDS [OPTIONALLY] ENCLOSED BY 문자
❍ FIELDS TERMINATED BY 의 첫 문자와 LINES TERMINATED BY 값
❍ ASCII NUL (제로값의 바이트; 실제로 이스케이프 문자 다음에 따라오는 것은 ASCII ‘0’이며, 제로값의 바이
트는 아니다)
FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY, 혹은 LINES TERMINATED BY 문자들 은 escaped되
어 여러분은 그 파일을 신뢰성 있게 다시 읽을 수 있다. ASCII NUL pager들로 보기 쉽게 escaped된다.
결과 파일은 SQL문법을 따를 필요가 없으며 어느 것도 escape될 필요가 없다.
FIELDS ESCAPED BY 문자가 empty이면 어떤 문자도 escape될 수 없으며 NULL은 ₩N이 아닌 NULL로 출력된다.
Empty escape문자를 명시하는 것은 좋은 생각이 아니며, 특히 데이터 안의 필드 값이 방금 나열된 문자들 중 하나를 포
함하고 있을 때에는 더욱 좋지 않다.
다음은 많은 프로그램에서 사용되는 콤마로 구별되는 값을 가진 파일을 생성하는 예문이다:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '₩n'
FROM test_table;
● INTO OUTFILE대신 INTO DUMPFILE을 사용하면 MySQL은 어떤 컬럼 이나 레코드의 종료와 escape처리 없이, 파일
에 오직 하나의 레코드를 기록 한다. 이것은 여러분이 파일에 BLOB값을 저장 할 때 유용하다.If you use INTO
DUMPFILE instead of INTO OUTFILE, MySQL writes only one row into the file, without any column or line
termination and without performing any escape processing. This is useful if you want to store a BLOB value in
a file.
● 주의:INTO OUTFILE이나 INTO DUMPFILE에 의해서 생성된 파일은 서버 호스트상의 모든 사용자에 의해 쓰여 질 수
있다. 이 이유는 MySQL 서버가 계정을 가진 사용자 외에 다른 어떤 사용자에 의해 소유된 파일을 생성 할 수 없기 때문이
다. (어떤 이유에서건 mysqld를 root로 실행 하지 말라) 그 그 파일은 모두에게 쓰기 가능해야 하며 따라서 여러분은 그 내
용을 변경 할 수 있다.
● 이 장 도입부에 있는 SELECT문은 그 문장의 끝부분에서 INTO 절이 존재 한다. FROM 절에 선행하여 INTO OUTFILE
이나 INTO DUMPFILE을 직시 사용하는 것도 가능하다.
● PROCEDURE 절은 결과 집합에서 처리 해야 할 프로시져를 명명한다. 이에 대한 예는 24.3.1장 “프로시저 분석”부분
을 참조 하라.
● 페이지 혹은 레코드 잠금을 사용하는 저장엔진과 함께 FOR UPDATE를 사용한다면 질의에 의해 조사되는 레코드들은 현
재 트랜잭션이 끝날때까지 쓰기 잠금 상태가 된다. ROCK IN SHARE MODE의 사용은 검사된 레코드들을 읽도록 다른 트
랜잭션에 허용하나 업데이트와 삭제는 할 수 없는 공유 잠금을 설정한다. 이에 대한 내용은 14.2.10.5장 “SELECT …
FOR UPDATE 와 SELECT … LOCK IN SHARE MODE 잠금 읽기”부분을 참조 하라.
● HIGH_PRIORITY 는 테이블을 업데이트 하는 문장보다 SELECT에 높은 priority를 준다. 여러분은 한번에 그리고 매우
빨리 처리 해야 할 질의에 이것을 사용해야 한다. 읽기를 위해 테이블이 잠긴 동안 수행된 SELECT HIGH_PRIORITY 질
의는 테이블이 free상태가 되길 기다리는 업데이트 문이 있을 지라도 수행 된다.
● STRAIGHT_JOIN 는 최적화기로 하여금 FROM절에 열거된 순서대로 테이블들을 join하도록 한다. Optimizer가 바람직
하지 않은 순서로 테이블을 joint할 경우 이 질의 속도를 높이기 위해 사용할 수 있다. 7.2.1장 “EXPLAIN 과 최적화 질
의” 부분을 참조 하라. STRAIGHT_JOIN은 table_references 리스트에서 사용될 수 있다. 13.2.7.1장 “JOIN”부분을
참조 하라..
● SQL_BIG_RESULT 는 결과 집합이 많은 레코드를 갖는 다는 것을 optimizer에게 말하기 위해 GROUP BY나 DISTINCT
와 함께 사용될 수 있다. 이 경우, MySQL은 필요할 경우 직접 디스크 기반 임시 테이블을 사용하고 GROUP BY 상의 키
로 임시 테이블을 정렬한다.
● SQL_BUFFER_RESULT 는 결과가 임시 테이블에 저장되도록 한다. 이것은 MySQL이 테이블의 잠금을 빨리 해지 하하
는 것을 도우며 클라이언트에게 결과를 보내는데 오랜 시간이 걸리는 경우에도 도움을 준다.
● SQL_SMALL_RESULT 는 결과 집합이 작다는 것을 optimizer에게 말해주기 위해 GROUP BY나 DISTINCT와 함께 사
용될 수 있다. 이 경우 MySQL은 정렬을 사용하는 대신 결과 테이블을 저장하기 위해 빠른 임시 테이블을 사용한다. 이것
은 보통 는 필요하지 않다.
● SQL_CALC_FOUND_ROWS 은 MySQL이 LIMIT절과 상관 없이, 얼마나 많은 레코드가 결과 집합에 있어야 하는지 계
산 하도록 한다. 레코드의 수는 SELECT FOUND_ROWS()로 얻어질수 있다. 12.9.3장 “정보 함수”부분을 참조 하라.
SQL_NO_CACHE 는 MySQL이 질의 결과를 질의 cache에 저장하지 못하게 한다. 5.14장 “MySQL Query Cache”부분을 참
조 하라. UNION이나 sub 질의를 사용하는 질의에 대해선, 이 옵션이 질의의 SELECT에 영향을 준다.
제목검색
13.2. 데이터 조작 SQL문 MySQL 은 SELECT문 과 다중 테이블 DELETE 그리고 UPDATE문의 table_reference 부분을 위해 다음과 같이 JOINT을 지
table_reference:
table_factor
| join_table
table_factor:
| ( table_references )
ON conditional_expr }
join_table:
join_condition:
ON conditional_expr
| USING (column_list)
우리가 table_reference 아이템의 한 리스트 안의 각 콤마를 inner join과 동등하게 여긴다면 이것은 convervative extension이
다. 예를 들면:
는 아래 문장과 동등하다:
SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
MySQL에서, CROSS JOIN 은 INNER JOIN과 동등하다. 표준 SQL에서는 그렇지 않다. INNER JOIN은 ON 절과 함께 쓰이며
CROSS JOIN은 그렇지 않다.
5.0.1이전의 MySQL에서는 table_references안의 괄호들이 생략되고 모든 join 연산들은 왼쪽으로 그룹지어진다. 일반적으로 괄
호들은 단지 inner join연산을 포함하는 join 표현 안에서 무시 될 수 있다. 5.0.1부터는 nested join이 허락된다 (7.2.10장
“nested join optimization”부분을 참조하라.
join연산 에서 좀더 많은 변경들이 5.0.12에서 이루어 졌으며 MySQL을 표준 SQL을 따르도록 했다. 이들 변경들은 이 장의 후반
부에서 설명된다.
● 테이블 참조는 tbl_name as alias_name 이나 tbl_name alias name을 사용하여 alias될 수 있다.
● INNER JOIN 과 콤마(,)는 join 조건의 결여로 의미론적으로 동등하다. 양자는 명시된 테이블 사이에서 데카르트 곱을 만
들어 낸다. (즉, 첫 번째 테이블의 각각 모든 레코드는 두 번째 테이블의 각각 모든 레코드와 join된다.)
그러나 콤마 연산자의 서열은 INNSER JOIN, CROSS JOIN, LEFT JOIN등 보다 낮다. Join 조건이 있는 경우 다른
join 형들과 콤마를 혼합하면 Unknown column ‘col_name’ in ‘on clause”의 형태의 에러가 발생한다. 이 문제
처리에 관한 정보는 이 장의 후반부에 다루어진다.
● ON 조건은 WHER 절에서 사용될 수 있는 형태의 조건 표현이다. 일반적으로 테비블들을 어떻게 join하는 지를 명시하는
조건을 위해선 ON조건을 결과 집합에서 어떤 레코드를 원하는 가에 대한 제한을 위해서는 WHERE절을 사용해야 한다.
● LEFT JOIN에서 ON이나 USING부분에서 오른쪽 테이블과 매칭 되는 레코드가 없는 경우 모든 컬럼들이 NULL로 설정
된 레코드가 오른쪽 테이블을 위해 사용된다. 다른 테이블과 대응을 갖지 못하는 테이블에서 레코드를 찾기 위해 이 사실
을 사용할 수 있다.
● 두 테이블의 NATURAL [LEFT] JOIN 은 두 테이블에 존재하는 모든 컬럼을 지정하는 USING절의 INNSER JOIN 이나
LEFT JOIN과 의미적으로 동일하도록 정의 된다.
● RIGHT JOIN 는 LEFT JOIN과 유사하게 작용한다. LEFT JOIN. 데이터베이스 들 간에 이식 가능한 코드를 유지 하기 위
해서는 RIGHT JOIN보다 LEFT JOIN을 사용하는 것이 좋다.
● JOIN문 설명에서 보여지는 { OJ ... LEFT OUTER JOIN ...} 문은 ODBC와의 호환성을 위해 존재 한다. 이 문장에서 중괄
호는 정확히 쓰여져야 하는데 다른 구문 표현들에서 보여지는 포괄적 의미로 사용되는 것과는 다르다.
● STRAIGHT_JOIN 은 왼쪽 테이블이 오른쪽 테이블보다 항상 먼저 읽힌 다는 점을 제외하면 JOIN과 동일하다. JOIN
optimizer가 테이블을 잘못된 순서로 놓을 경우에 사용될 수 있다.
테이블로부터 정보를 가져올 때 MySQL이 사용할 인덱스에 대한 힌트를 제공 할 수 있다. USE INDEX (key_list)를 사용하여
MySQL이 테이블의 레코드들을 찾기 위해 가능한 인덱스들중 단지 하나만 사용하도록 할 수 있다. 선택적 구문인 IGNORE
INDEX(key_list)문은 MySQL이 특정 인덱스를 사용하지 못하도록 할 수 있다. 이러한 힌트들은 EXPLAIN문이 MySQL이 인덱
스들 중 잘못된 인덱스를 사용하고 있다는 것을 보여준다면 유용하다.
여러분은 FORCE INDEX 문을 사용 할 수 있는데 이것은 USE INDEX(key_list)와 같이 작용하며 테이블 스캔이 추가적이다. 즉,
테이블에서 레코드를 찾기 위해 주어진 인덱스들을 사용할 수 없는 경우에만 테이블 스캔이 사용될 수 있다.
USE INDEX, IGNORE INDEX와FORCE INDEX 문은 테이블에서 레코드를 어떻게 찾고 JOIN을 하기 위해 어떻게 해야 하는지
MySQL이 결정 할 때에 어떤 인덱스들이 사용될 것인지에 영향을 미친다. 이들은 ORDER BY 나 GROUP BY를 결정할 때 사용할
인덱스에는 영향을 주지 않는다.
USE KEY, IGNORE KEY 와 FORCE KEY 는 USE INDEX, IGNORE INDEX, FORCE INDEX 와 동일하다.
예:
MySQL 5.0.12에서 natural joins 과 외부 join 변수들을 포함한 USING을 사용한 join은 SQL:2003 표준에 따라 처리 된다. 그
목적은 MySQL의 구문들과 의미들을 SQL:2003에 따라 NATURAL JOIN과 JOIN… USING 을 조절하는 것이다. 그러나 이들
join연산에서의 변화들은 어떤 join들에 대해서는 다른 출력물을 결과로 내놓을 수 있다. 또한 이전 버전들에서 정확히 동작하는 것
처럼 보여진 몇몇 질의들이 표준에 맞게 새롭게 씌여 져야만 한다.
● MySQL이 NATURAL 혹은 USING Join 연산에서 결과 컬럼을 결정하는 방법(이는 전체 FROM절의 결과이다.)
● SELECT * 과 SELECT tbl_name.* 의 선택된 컬럼 들의 리스트로의 확장.
● NATURAL과 USING join에서 컬럼 이름들의 결정.
● NATURAL 이나 USING 에서 JOIN ... ON. 으로의 전이
● JOIN…ON에서 ON조건에 있는 컬럼 이름의 결정.
다음의 리스트는 join 연산에 관한 5.0.12에서의 변화의 몇 가지 효과에 관한 상세한 정보를 제공한다. “previously”의 의미는
“MySQL 5.0.12 이전 “ 을 의미한다.
● NATURAL 이나 USING join의 컬럼들은 이전 버전과 다를 수 있다. Redundant한 결과들은 더 이상 나타나지 않으며
SELECT *확장에서의 컬럼 순서는 전과 다를 수 있다.
+------+------+------+------+
|i |j |k |j |
+------+------+------+------+
| 1| 1| 1| 1|
+------+------+------+------+
+------+------+------+------+
|i |j |k |j |
+------+------+------+------+
| 1| 1| 1| 1|
+------+------+------+------+
+------+------+------+
|j |i |k |
+------+------+------+
| 1| 1| 1|
+------+------+------+
+------+------+------+
|j |i |k |
+------+------+------+
| 1| 1| 1|
+------+------+------+
두개 일반 컬럼들을 대체하는 하나의 결과 컬럼은 COALESCE연산을 통해정의 된다. 즉 t1.a와 t2.a의 단일 join 컬럼
은 a로 정의 되는데 구문은
a = COALESCE(t1.a, t2.a)과 같다. where:
만일 join연산이 다른 join연산이라면 그 join의 결과 컬럼들은 join된 테이블들의 모든 컬럼의 연결로 이루어 진다. 이것
은 이전 버전의 MySQL와 동일하다.
coalesced컬럼의 정의에 대한 결과는 그 컬럼이 두개의 컬럼중 하나가 항상NULL이라면 coalesced컬럼은 NULL이
아닌 컬럼의 값을 포함한다. 두 컬럼이 NULL이거나 NULL이 아닌경우, 양쪽 일반 컬럼들은 같은 값을 갖게 되고
coalesced 컬럼의 값으로 어떤 것이 선택 되었는지는 문제가 되지 않는다. 이것을 해석하는 가장 간단한 방법은 outer
join의 coalesced컬럼이 JOIN의 JOIN의 inner테이블의 일반 컬럼에 의해 재 표현 된다. 다음 두개의 테이블 t1(a,b)
와 t2(a,c)이 다음과 같은 값을 가지고 있다면::
t1 t2
---- ----
1x 2z
2y 3w
그러면:
+------+------+------+
|a |b |c |
+------+------+------+
| 1|x | NULL |
| 2|y |y |
+------+------+------+
+------+------+------+
|a |c |b |
+------+------+------+
| 2|y |y |
| 3|z | NULL |
+------+------+------+
+------+------+------+------+
|a |b |a |c |
+------+------+------+------+
| 2|y | 2|y |
+------+------+------+------+
+------+------+------+------+
|a |b |a |c |
+------+------+------+------+
| 2|y | 2|y |
+------+------+------+------+
이제 두 절들은 더 이상 같지 않다:
❍ join조건을 어떤 레코드가 만족 시키는지를 결정하는 것과 관련하여 두가지 모두의 join은 의미적으로 동일하다.
❍ SELECT * 확장을 위해 어떤 컬럼을 display할지 결정하는 것과 관련하여 두개의 join은 의미적으로 동일 하지 않
다. USING join은 ON join이 모든 테이블로부터 모든 컬럼을 선택하는데 반해, 컬럼들 중 coalesced 값을 선택한
다. USING join에 선행자로 SELECT* 는 이들 값들을 선택한다:
● 다중 natural join에 대한 평가는 질의를 다시 쓰도록 요구하는 NATURAL이나 USING join의 결과에 영향을 미치는 매
우 중요한 방법 에서 다르다. 예를 들어 세개의 테이블 t1(a,b), t2(c,b) 그리고 t3(a,c)가 있고 각각의 테이블은 t1(1,2),
t2(10,2) 그리고 t3(7,10)으로 하나의 레코드를 갖는다고 가정하자. 또한 세개의 테이블들에서 다음과 같이 NATURAL
JOIN을 갖는다고 가정해보자:
이전 버전의 MySQL에서는 그 문장이 nested join 인 (t1 NATURAL JOIN t2)이므로 두번째 JOIN의 연산 대상자는 t2
로 인식되었다. 결과적으로 t3의 컬럼들은 t2에서 일반 컬럼들로 체크되고 t3가 t1과 함께 일반 컬럼들을 갖는다면 이들
컬럼들은 equi-join컬럼 들로 사용되지 않는다. 따라서 이전버전의 MySQL에서는 선행적인 질의가 다음 equi-join으로
변환 된다.:
그 JOIN은 (t1.a = t3.a) 동등 질의 속성을 빠뜨리고 있다. 결과적으로 그것이 가져야 할 empty 결과를 갖지 못하고 하나
의 레코드를 생산한다. 정확한 동등 질의는 다음과 같다:
여러분이 이전 버전과 현재 버전에서 같은 결과를 갖는 질의를 요구한다면 첫번째 동등 join으로 natural join을 다시 쓰도
록 하라.
● 이전 버전에서, 컴마 연산자(,)와 JOIN 연산자 모두는 같은 우선 순위를 가졌다. 따라서 join 연산 t1,t2 JOIN t3는 ((t1,
t2) JOIN t3)로 해석 되었다. 현재 버전은 JOIN이 좀더 높으며 따라서 그 SQL문은 (t1, (t2 JOIN t3))로 해석 된다. 이
변경은 ON절을 사용하는SQL문들에 영향을 주는데 그 절이 JOIN의 피 연산자 안에 있는 컬럼 들만을 참조 할 수 있고 우
선순위의 변화는 그들 피 연산자의 해석에 변화를 주기 때문이다.
예:
이전 버전에서 SELECT는 t1,t2를 (t1,t2)와 같이 암시적 그룹으로 인식 하므로 문법적으로 맞다. 현재 버전에서는 JOIN
이 우선순위를 가지며 ON 절에 있는 피 연산자로 t2와 t3가 된다. t1.i1이 t2와 t3에 속한 컬럼 조건에 해당 하지 않으며
이는 Unknown column ‘t1.i1’ in ‘on clause’ 에러를 만들게 된다. 그 JOIN이 처리 되도록 하기 위해서는 처음 두
테이블을 괄호로 그룹을 만들어 주어야 하며 이렇게 되면 ON절의 피 연산자는 (t1,t2)와 t3가 된다:
이 변경은 INNER JOIN, CROSS JOIN, LEFT JOIN, 그리고 RIGHT JOIN 와 콤마 연산자가 혼합된 SQL문에 적용 되
며 이들 모두는 콤마 연산자보다 높은 우선순위를 갖는다.
예:
이전 버전에서 SELECT문은 맞는 표현이었으나 현재 버전에서는 Unknown column 'i3' in 'on clause' 에러와 함께 실패
한다. i3 컬럼이 t3 안에 없기 때문인데 이는 ON절의 피 연산자가 아니다. 이 문장은 다음과 같이 다시 쓰여져야 한다.
● NATURAL이나 USING join들 안에서 컬럼 이름 들의 결과는 이전 버전과 다르다. FROM절의 외부에 있는 컬럼 이름들
에 대해, MySQL은 이전 버전과 대비 되는 질의들의 집합을 다룬다. 즉, MySQL이 어떤 컬럼이 모호 하다는 에러를 공식적
으로 발생 시킬 경우, 그 질의는 정확히 다루어 진다. 이것은 MySQL이 이제 NATURAL 이나 USING join의 일반 컬럼 들
을 하나의 컬럼으로 다루기 때문이며 따라서 한 질의가 그런 컬럼 들을 참조할 경우 질의 compiler는 그것들을 모호하게
여기지 않는다.
예:
이전 버전에서 이 질의는 ERROR 1052 (23000): Column 'b' in where clause is ambiguous 에러를 출력한다. 현재 버
+------+------+------+
|b |c |y |
+------+------+------+
| 4| 2| 3|
+------+------+------+
제목검색
+---------------+
| REPEAT('a',1) |
+---------------+
|a |
| bbbbbbbbbb |
+---------------+
(이전 버전의 MySQL에서 첫번째 SELECT로부터 그 형과 길이가 사용되고 두번째 레코드는 길이가 1로 변경될 것이다.)
같은 질의 안에서 UNION ALL 와 UNION DISTINCT를 사용할 수 있다. 혼합된 UNION 타입들은 DISTINCT UNION이 ALL
UNION을 그것의 왼쪽으로 덮어 쓰도록 취급된다. DISTINCT UNION은 UNION DISTINCT을 사용하여 명시적으로 만들어지거
나 DISTINCT나 ALL keyword없이 UNION을 사용하여 암시적으로 만들어 질 수 있다.
정렬을 위해 ORDER BY나 LIMIT절을 사용하기 위해서, 혹은 전체 UNION 결과를 제한 하기 위해 각 SELECT문을 괄호로 묶고
마지막에 ORDER BY나 LIMIT을 위치 시킨다. 다음 예제는 두 가지 절 모두를 사용한다.:
UNION
이런 종류의 ORDER BY는 테이블 이름을 포함하는 컬럼 참조들을 사용하지 않는다. (즉, tbl_name.col_name 포맷으로 명명한
다) 대신, 첫 SELECT 문에서 컬럼 alias를 제공하고 ORDER BY에서 그 alias를 참조 한다. (대안적으로 그 컬럼 위치를 이용하
는 ORDER BY안에서 컬럼을 참조 한다. 그러나 컬럼 위치의 사용은 반대 된다.)
개별 SELECT에 ORDER BY나 LIMIT를 적용하기 위해서는 SELECT를 괄호로 묶어 그 안에 절을 위치 시키도록 하라:
UNION
개별 SELECT문을 위한 ORDER BY의 사용은 기본적으로 UNION은 레코드 집합을 순서 없이 만들게 되기 때문에 최종 결과에
서 레코드들이 어떻게 나타나야 하는지 순서에 관해 아무것도 암시 하지 않는다. ORDER BY가 LIMIT과 함께 쓰일 경우, 그것은
SELECT를 위해 가져온 선택된 레코드의 부분 집합을 결정하기 위해 사용된다. 그러나 그것은 최종 UION 결과에서 레코드들의
순서에 영향을 주지 않는다. ORDER BY가 한 SELECT문에서 LIMIT없이 나타나는 경우 아무런 영향을 갖지 않으므로 최적화는
되지 않는다..
UNION결과에 있는 레코드들을 순서대로 각 SELECT 에 의해 취해진 레코드들의 집합으로 구성되도록 하려면, 정렬 컬럼으로 사
용하기 위해 각 SELECT문에서 추가적인 컬럼을 선택하고 마지막 SELECT뒤에 ORDER BY를 추가 하도록 하라:
UNION
UNION
제목검색
한 서브쿼리는 하나의 scalar(하나의 값), 하나의 레코드, 하나의 컬럼 혹은 하나의 테이블(하나이상의 컬럼을 갖
는 하나이상의 레코드)을 리턴할 수 있다. 이것들은 scalar, column, row 그리고 테이블 서브쿼리라 불린다. 특정
종류의 결과를 리턴하는 서브쿼리는 특정 context에서 사용될 수 있으며 이에 대한 것은 다음 장들에서 설명된다.
하나의 제약은 서브쿼리의 outer 문은 SELECT, INSERT, UPDATE,DELETE, SET 이나 DO중 하나이어야 한
다. 또다른 제약은 하나의 서브쿼리 안에서 여러분이 동시에 테이블의 수정이나 같은 테이블로부터 선택을 할 수
없다는 것이다. 이것은 as DELETE, INSERT, REPLACE, UPDATE, 그리고 (서브쿼리들이 SET절 안에서 사용
될 수 있기 때문이다.) LOAD DATA INFILE과 같은SQL문에 적용된다.
서브 쿼리의 형태에 관한 성능 관련 사항을 포함하여 서브쿼리 사용 제약에 관한 포괄적은 논의는 1.3장 “서브쿼
리의 제약들” 부분에서 다루어진다.
제목검색
13.2. 데이터 조작 SQL문 가장 단순한 형으로 하나의 값을 리턴하는 scalar 서브쿼리가 있다. Scalar 서브쿼리는 하나의 단순한 연산 함수이고 여러분은 하
13.2.8 서브쿼리 나의 단순 컬럼 값이나 literal이 규칙에 맞는 어느 곳에서나 사용할 수 있다. 모든 피연산자 들이 갖는 데이터 형, 길이, NULL이 될
수 있는지 없는지에 대한 지정 등의 특징을 얘기 할 수 있다. 예를 들어:
13.2.8.1 단계적 변수로써의 서브쿼리
13.2.8.2 서브쿼리를 이용한 비교
CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL);
13.2.8.3 ANY, IN과 SOME를 가진 서브쿼리
13.2.8.4 ALL을 가진 서브쿼리
INSERT INTO t1 VALUES(100, 'abcde');
13.2.8.5 로우 서브쿼리
13.2.8.6 EXISTS and NOT EXISTS SELECT (SELECT s2 FROM t1);
13.2.8.7 서로 관련된 서브쿼리들
13.2.8.8 FROM 절 안에서의 서브쿼리들 SELECT문에서 서브쿼리는 CHAR 형이고 길이가 5이며 문자열 모음과 대조가 CREATE TABLE시에 기본값과 동일하며 컬럼안
다소 간소한 구조를 포함하고 있는 다음 섹션에서 예를 보면서(SELECT column1 FROM t1), 더욱 다양하고 복잡한 구조를 가진
코드를 생각해 보자
SELECT를 수행하면:
Scalar 서브쿼리는 표현의 부분이 될 수 있으나 괄호를 사용해야 하며 서브 쿼리가 함수에 대해 하나의 인자를 제공하는 연산자 함
수일 때도 마찬가지 이다. 예를 들면 다음과 같다:
제목검색
13.2.8 서브쿼리
13.2.8.1 단계적 변수로써의 서브쿼리
가장 일반적인 서브쿼리는 다음과 같은 형태이다.:
13.2.8.2 서브쿼리를 이용한 비교
13.2.8.3 ANY, IN과 SOME를 가진 서브쿼리 non_subquery_operand comparison_operator (subquery)
13.2.8.4 ALL을 가진 서브쿼리
13.2.8.5 로우 서브쿼리 comparison_operator 는 다음 연산자들 중 하나이다:
일반 형태의 서브쿼리 비교의 예는 다음과 같으며 이는 JOIN과 함께 사용될 수 없다. 이SQL문은 t2의 최대값과 같은 값을 갖는 레
코드를 t1테이블에서 찾는다:
또 다른 예로, 테이블들의 하나에 대해 aggregating을 포함하기 때문에 JOIN이 불가능하다. 주어진 컬럼에서 두번 나타나는 값을
포함하고 있는t1 테이블에서 모든 레코들 찾는다.:
SELECT * FROM t1 AS t
이들 연산자들중 하나와 함께 수행되는 비교를 위해 서브쿼리는 scalar를 리턴 해야 한다. 이때 예외적으로 =는 레코드 서브쿼리
와 함께 사용될 수도 있다. 13.2.8.5장 “레코드 서브쿼리” 부분을 참조 하라.
제목검색
그러나 NOT IN은 <> ANY에 대한 alias가 아니다. 13.2.8.4장 “ALL문장과 서브쿼리” 부분을 참조 하라.
SOME 의 사용은 드물지만 이 예제는 그것을 사용했을 때의 유용함을 보여준다. 모든 사람들의 귀에는 영어 문장 “a is not
equal to any b”가 “there is no b which is equal to a”로 해석된다. 그러나 SQL문에서는 다르다. 그 의미는 “there is
some b to which a is not equal”을 의미한다. <> SOME의 사용은 모두가 그 질의의 진짜 의미를 이해 하는데 도움을 준
다.
제목검색
13.2.8 서브쿼리
operand comparison_operator ALL (subquery)
13.2.8.1 단계적 변수로써의 서브쿼리
13.2.8.2 서브쿼리를 이용한 비교
비교 연산자 뒤에 있는 모든 ALL 은 서브 쿼리가 리턴 하는 컬럼안의 값들 모두에 대해 비교가 TRUE이면 TRUE를 리턴 하
13.2.8.3 ANY, IN과 SOME를 가진 서브쿼리
라”의 의미이다. 예를 들면:
13.2.8.4 ALL을 가진 서브쿼리
13.2.8.5 로우 서브쿼리 SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
13.2.8.6 EXISTS and NOT EXISTS
13.2.8.7 서로 관련된 서브쿼리들 t1테이블 안에 (10)을 포함하는 레코드가 있다고 가정하자. 이 표현은 t2테이블이 (-5,0,+5)를 가지면 true가 되는데 10이 t2의
13.2.8.8 FROM 절 안에서의 서브쿼리들 세 값 모두보다 크기 때문이다. T2테이블이 (0,NULL,1)을 포함하면 그 표현은 unknown이 된다(즉, NULL).
13.2.8.9 서브쿼리 에러
마지막으로 t2테이블이 empty이면 결과는 TRUE가 된다. 따라서 다음 문장은 t2가 empty일 때 TRUE가 된다.
13.2.8.10 서브쿼리 최적화
13.2.8.11 MySQL 초기버전 용 Joins로써의 리라
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);
이팅 서브쿼리들
일반적으로 tables containing NULL values 와 empty tables 은 “edge cases.”이다. 서브쿼리를 사용할 때 항상 여러분은 이
런 두가지 가능성을 염두 해 두어야 한다.
제목검색
13.2. 데이터 조작 SQL문 이부분에 대한 논의는 scalar 혹은 컬럼 서브쿼리 였다: 즉, 컬럼 값들 혹은 하나의 값을 리턴하는 서브 쿼리들을 의미한다. row
13.2.8 서브쿼리 subquery 는 하나의 레코드를 리턴하는 서브쿼리 이고 하나 이상의 컬럼 값을 리턴한다. 아래 예제를 참조 하라:
13.2.8.8 FROM 절 안에서의 서브쿼리들 문장은 의미적으로 동일하다(두번째 문장만 최적화 될 수 있음에도 불구하고):
13.2.8.9 서브쿼리 에러
SELECT * FROM t1 WHERE (column1,column2) = (1,1);
13.2.8.10 서브쿼리 최적화
13.2.8.11 MySQL 초기버전 용 Joins로써의 리라
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
이팅 서브쿼리들
레코드 생성자의 일반적인 사용은 두개 이상의 컬럼을 리턴하는 서브쿼리와 비교를 위한 것이다. 예를 들면 다음 쿼리는 요구 “t2
테이블에도 존재하고 t2테이블에도 존재하는 모든 레코드를 찾아라”한다:
SELECT column1,column2,column3
FROM t1
WHERE (column1,column2,column3) IN
제목검색
13.2. 데이터 조작 SQL문 서브쿼리가 어떤 레코드 던지 리턴하면 EXIST subquery는 TRUE이며 NOT EXIST suquery는 FALSE가 된다. 예를 들면:
13.2.8 서브쿼리
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
13.2.8.1 단계적 변수로써의 서브쿼리
13.2.8.2 서브쿼리를 이용한 비교
전통적으로 EXISTS서브쿼리는 SELECT *와 함께 시작하나, SELECT 5 혹은 SELeCT column1과 함께 시작할 수도 있다.
13.2.8.3 ANY, IN과 SOME를 가진 서브쿼리
MySQL은 그런 서브쿼리에서 SELECT를 무시하여 차이를 만들지 않는다.
13.2.8.4 ALL을 가진 서브쿼리
13.2.8.5 로우 서브쿼리 처음 예문에서 NULL 값들만 가진 레코드라도 t2가 레코드를 포함하면 EXISTS조건은 TRUE를 갖는다. 실제로 [NOT] EXISTS
13.2.8.6 EXISTS and NOT EXISTS 서브 쿼리는 항상 상호 관계를 갖기 때문에 드문 예제 이다. 여기 실질적인 예제가 있다.:
13.2.8.7 서로 관련된 서브쿼리들
13.2.8.8 FROM 절 안에서의 서브쿼리들 ● 어떤 종류의 가계가 하나 이상의 도시에 있는가?
13.2.8.9 서브쿼리 에러
SELECT DISTINCT store_type FROM stores
13.2.8.10 서브쿼리 최적화
13.2.8.11 MySQL 초기버전 용 Joins로써의 리라
WHERE EXISTS (SELECT * FROM cities_stores
이팅 서브쿼리들
마지막 예문은 이중 중첩 NOT EXISTS 쿼리이다. 즉, NOT EXISTS질의이다. 즉 NOT EXISTS절 안에 NOT EXISTS절을 갖는
다. 공식적으로 그것은 “가계들 안에서 있는 않은 한 가계를 가진 도시가 있는가?”의 질문에 응답한다. 그러나 중첩 NOT
EXISTS가 “x가 모든 y에 대해 TRUE”인가 라는 질문에 답하기를 쉽도록 한다.
제목검색
13.2. 데이터 조작 SQL문 서로 관련된 서브쿼리 는 outer query에 나타난 테이블에 대한 참조를 포함한 서브쿼리이다. 예를 들면:
13.2.8 서브쿼리
SELECT * FROM t1 WHERE column1 = ANY
13.2.8.1 단계적 변수로써의 서브쿼리
13.2.8.2 서브쿼리를 이용한 비교
(SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
13.2.8.3 ANY, IN과 SOME를 가진 서브쿼리
13.2.8.4 ALL을 가진 서브쿼리 서브쿼리가 그것의 FROM절이 t1테이블을 언급하지 않았으면서도 t1의 한 컬럼에 대한 참조를 포함하고 있다. 따라서 MySQL은
13.2.8.5 로우 서브쿼리 서브쿼리의 외부를 살피고 outer query에서 t1을 찾는다.
13.2.8.6 EXISTS and NOT EXISTS
13.2.8.7 서로 관련된 서브쿼리들 T1테이블이 column1=5이고 column2=6인 레코드를 포함한다고 가정하자. T2테이블은 column1=5이고 column2 =7인 레코
13.2.8.8 FROM 절 안에서의 서브쿼리들 드를 포함한다. 이 단순한 표현 ... WHERE column1 = ANY (SELECT column1 FROM t2) 는 TRUE가 될것이다 그러나 이 예
13.2.8.9 서브쿼리 에러 제에서 서브쿼리안의 WHERE 절은 FALSE가 된다( 왜냐 하면 (5,6)이 (5,7)과 갖지 않기 때문이다). 따라서 전체로서 서브쿼리
는 FALSE가 된다.
13.2.8.10 서브쿼리 최적화
13.2.8.11 MySQL 초기버전 용 Joins로써의 리라
Scoping rule: MySQL 내부에서 외부로 판단해 간다. 예를 들면:
이팅 서브쿼리들
이 문장에서 x.column2 은 SELECT column1 FROM t2 AS x ... 이 t2을 재 명명하기 때문에 t2테이블 안의 컬럼 이어야 한다.
이것은 SELECT column1 FROM t1 ... 가 farter out인 outer 쿼리이기 때문에 t1테이블 안의 컬럼 이 아니다.
그렇지 않으면 그것들은 비효율적이고 느려진다. JOIN으로서 쿼리의 재 작성은 성능을 향상 시킬것이다.
제목검색
13.2. 데이터 조작 SQL문 서브쿼리는 SELECT문의 FROM절에서 유효 하다. 실제 구문은 다음과 같다:
13.2.8 서브쿼리
SELECT ... FROM (subquery) [AS] name ...
13.2.8.1 단계적 변수로써의 서브쿼리
13.2.8.2 서브쿼리를 이용한 비교
[AS] name 절은 필수인데 FROM절의 모든 테이블이 하나의 이름을 가져야 하기 때문이다. subquery 선택 리스트안의 어떤 컬
13.2.8.3 ANY, IN과 SOME를 가진 서브쿼리
럼도 유일한 이름을 가져야 한다. 이 매뉴얼의 다른 곳에서 “derived tables.”으로 사용되는 설명되는 이 구문을 찾을 수 있다.
13.2.8.4 ALL을 가진 서브쿼리
13.2.8.5 로우 서브쿼리 실례를 위해 다음 테이블이 있다고 가정하자:
13.2.8.6 EXISTS and NOT EXISTS
13.2.8.7 서로 관련된 서브쿼리들 CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);
SELECT sb1,sb2,sb3
또 다른 하나의 예가 있는데, group화 된 테이블에 대한 합계의 평균을 알고 있다고 가정 하자. 이 문장은 수행 되지 않는다.
SELECT AVG(sum_column1)
FROM절에서 서브쿼리들은 scalar, 컬럼, 레코드 혹은 테이블을 리턴할 수 있다. FROM절의 서브쿼리들은 서브 쿼리들과
correlate될 수 없다.
제목검색
13.2. 데이터 조작 SQL문 서브쿼리에만 적용되는 몇몇 에러들이 있으며 이 장에서는 그들에 대해 설명한다.
13.2.8 서브쿼리
● 서브 쿼리에서 부정확한 수의 컬럼:
13.2.8.1 단계적 변수로써의 서브쿼리
13.2.8.2 서브쿼리를 이용한 비교
ERROR 1241 (ER_OPERAND_COL)
13.2.8.3 ANY, IN과 SOME를 가진 서브쿼리
13.2.8.4 ALL을 가진 서브쿼리 SQLSTATE = 21000
13.2.8.5 로우 서브쿼리
13.2.8.6 EXISTS and NOT EXISTS Message = "Operand should contain 1 column(s)"
SQLSTATE = 21000
SQLSTATE = HY000
여러분은 UPDATE문 내에서 할당을 위한 서브쿼리를 사용할 수 있는데 그서브쿼리들은 SELECT문 뿐만 아니라
UPDATE와 DELETE문들 내에서 적합하기 때문이다. 그러나 서브쿼리의 FROM절과 업데이트 target모두를 위해 같은
테이블을 사용할 수 없다.
트랜잭션 저장 엔진을 위해 서브쿼리절의 실패는 전체 문장을 실패로 만들게 된다. 비 트랜잭션 저장 엔진의 경우 그 에러가 발생하
기 전에 만들어진 데이터 수정은 보존된다.
제목검색
13.2. 데이터 조작 SQL문 개발은 계속되고 있으며 최적화 팁이 장 시간 동안에는 신뢰성이 없다. 다음 리스트는 여러분이 다루길 원하는 몇 가지 흥미로운 트
이것 대신:
SELECT * FROM t1
이런 쿼리 대신 :
SELECT * FROM t1
이 쿼리 대신
SELECT * FROM t1
이 쿼리 대신:
SELECT * FROM t1
AND t2.column2=t1.column2);
이들 트릭은 프로그램을 빠르게 혹은 느리게 할 수 있다. BENCHMARK() 함수와 같이 MySQL의 제공하는 서비스를 이용하면 여
러분의 상황에서 무엇이 도움이 될지에 관해 아이디어를 얻을 수 있다. 12.9.3장 “정보 함수”를 참조 라.
● MySQL은 서브쿼리 안의 선택 리스트 컬럼들이 인덱스될 가능성에 대한 이점을 갖도록 하기 위해 IN, ALL, ANY, 그리고
SOME 서브 쿼리를 사용한다.
● MySQL는 다음 형태의 서브쿼리들을 인덱스 조사 함수로 대치 하는데 이런 EXPLAIN은 특별한 JOIN형으로 표현한다.
(unique_subquery 나 index_subquery):
● MySQL은 NULL 값들나 empty 집합이 포함되지 않는한 MIN()이나 MAX()를 포함하는 표현과 함께 다음 form의 표현
을 강화 한다.
예를 들어 이 WHER절은:
이와 같은 초적화에 의해 처리 될 수 있다.
제목검색
13.2. 데이터 조작 SQL문 MySQL의 이전 버전에서는 INSERT … SELECT ..와 REPLACE … SELECT …형의 쿼리들만 지원 되었다. 이것은 MySQL
13.2.8 서브쿼리 5.0에서의 경우가 아닐 지라도 값들 안에 있는 멤버쉽을 테스트 하기 위한 다른 방법들이 있다는 점은 사실이다. 그것은 또한 몇 가
지 경우에도 사실이며, 서브 쿼리를 갖지 않은채 쿼리를 다시 쓰기는 불가능 하며 서브쿼리를 사용하는 것보다 이러한 기술들을 사
13.2.8.1 단계적 변수로써의 서브쿼리
용하는 것이 좀더 효과적이다. 이러한것들 중 하나는 IN()이다:
13.2.8.2 서브쿼리를 이용한 비교
13.2.8.3 ANY, IN과 SOME를 가진 서브쿼리
예를 들면 이 쿼리는
13.2.8.4 ALL을 가진 서브쿼리
13.2.8.5 로우 서브쿼리 SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);
13.2.8.6 EXISTS and NOT EXISTS
13.2.8.7 서로 관련된 서브쿼리들 다음 처럼 다시 쓰여 질 수 있다:
LEFT [OUTER] JOIN 은 동등한 서브쿼리 보다 빠를 수 있는데 서버가 그것을 좀더 최적화 할 수 있기 때문이다. 이 것은
MySQL 서버 에게만 해당되는 사항이 아니다. SQL-92 이전에는 outer join은 존재 하지 않았고 따라서 서브쿼리 들이 그러한
일들을 하기 위한 유일한 방법이었다. 오늘날 MySQL서버와 다른 많은 데이터베이스 시스템은 outer join 형을 제공한다.
제목검색
13.2.9 TRUNCATE TRUNCATE TABLE 은 테이블을 완전히 비운다. 논리적으로 이것은 모든 열을 삭제하는 DELETE 문에 해당되지만, 실제로는
몇몇 상황에 있어 차이가 있다.
5.0.3 버전 이전의 InnoDB 의 경우, TRUNCATE TABLE 은 DELETE와 같아서 차이가 없다. MySQL 5.0.3 버전부터,
TRUNCATE TABLE 이 사용되고 있다. 그러나 테이블에 인용한 외부 키 제약이 있다면, 오퍼레이션은 여전히 DELETE 로 된
다. (빠른 종료를 사용하면 AUTO_INCREMENT 카운터를 리셋한다. MySQL5.0.13버전부터, AUTO_INCREMENT 카운터는
외부 키 제약과 관계없이 TRUNCATE TABLE에 의해 리셋된다.)
다른 스토리지 엔진의 경우, MySQL 5.0에서 다음과 같이 TRUNCATE TABLE 는 DELETE 와 다르다:
테이블 트렁케이션(중단/끊기)은 DELETE 를 사용할 수 없지만, TRUNCATE 문은 ON DELETE 트리거를 불러올 수 없다.
TRUNCATE TABLE 은 MySQL에서 채택된 오라클 SQL 확장이다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=2&scate=9&idx=16292006-08-08 오후 6:18:27
:::MySQL Korea:::
제목검색
멀티 테이블 신텍스:
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_condition]
단일 테이블 신텍스의 경우, UPDATE 문은 tbl_name 로우에 있는 컬럼을 새로운 값으로 업데이트 한다. SET 절은 수정된 컬럼
과 주어진 값을 보여준다. WHERE 절은 업데이트할 로우를 확인하는 조건을 지정한다. WHERE 절이 없다면, 모든 로우는 업데이
트 된 것이다. ORDER BY 절이 지정되어 있다면, 로우는 지정된 순서대로 업데이트 된다. LIMIT 절은 업데이트될 수 있는 로우의
수에 제한을 둔다.
멀티 테이블 신텍스의 경우, UPDATE 문은 조건을 만족하는 table_references 에 명명된 각각의 테이블의 로우을 업데이트한다.
이런 경우, ORDER BY 와 LIMIT 는 사용될 수 없다.
where_condition 은 업데이트된 각각의 로우를 평가하는 표식이다. 이것은 13.2.7 “SELECT 신텍스” 장에 기술되어 있는대로
지정된다.
UPDATE 작업은 왼쪽에서 오른쪽으로 진행된다. 예를들어, 다음의 문은 age 칼럼을 이중으로하며, 그것을 인크리먼트 한다.:
UPDATE 는 실제로 변경된 로우들을 반환한다. mysql_info() C API 함수는 조건에 상응하는 로우들과, 업데이트 된 로우들, 그
리고UPDATE 도중에 발생하는 경고들을 반환한다.
UPDATE 유효범위를 한정하기 위해서 LIMIT row_count 를 사용할 수 있다. LIMIT 절은 로우에 부합하는 제한이다. 실제로 변
앞의 예는 콤마 오퍼레이터를 사용하는 내적인 집합을 보여준다. 그러나 멀티 테이블 UPDATE 문은 LEFT JOIN 에서와 마찬가지
로, SELECT 문에서 허용된 집합 타입을 사용할 수 있다.
실제로 업데이트 된 멀티 테이블 UPDATE 에서 언급된 컬럼의 경우 UPDATE 권한이 필요하다. 읽혀지지만 수정되지 않은 컬럼
에만 SELECT 권한을 사용하면 된다
만약 외부키 제한이 있는 InnoDB 테이블에 포함된 멀티 테이블 UPDATE 문을 사용한다면, MySQL 옵티마이저는 테이블들의
parent/child relationship (부자관계)과는 별도로 처리하게 된다. 이런 경우, 명령문은 실패하고 롤백된다. 대신에, 싱글 테이블을
업데이트되고, InnoDB 가 제공하는 ON UPDATE 기능에 따라 적절하게 다른 테이블을 수정하게 된다. 14.2.6.4. “외부키 제
한” 장을 참조하라.
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=3&scate=0&idx=16312006-08-08 오후 6:18:41
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
13.3.1. DESCRIBE Syntax
col_name 는 하나의 컬럼 이름이 되거나, 문자열에 맞는 컬럼일 때에만 출력되는 와일드카드 문자인 SQL ‘%’ 와 ‘_’ 를 포함
하는 문자열일 수도 있다. 만약 문자열에 스페이스나 다른 특별한 문자가 포함되어 있지 않다면 인용문 안에 문자열을 넣을 필요가
없다.
+------------+----------+------+-----+---------+----------------+
+------------+----------+------+-----+---------+----------------+
| Name | char(35) | NO | | | |
| Population | int(11) | NO | |0 | |
+------------+----------+------+-----+---------+----------------+
Key 필드는 컬럼이 인덱싱되어 있는지를 보여준다. PRI 의 값은 컬럼이 테이블의 주요 키의 일부분이라는 것을 보여준다. UNI 는
컬럼이 UNIQUE 인덱스의 부분이라는 것을 보여준다. MUL 값은 해당 컬럼 안에 주어진 값이 여러 번 나올 수 있다는 것을 보여준
다.
UNIQUE 인덱스에 디스플레이 되는 MUL 에 있어 하나의 이유는 몇몇 컬럼들이 합성 UNIQUE 인덱스를 만든다는 것이다; 물론
컬럼의 조합이 유일무이하고, 각각의 컬럼에서 주어진 값이 여러 번 나올 수 있다. 하나의 합성 인덱스에서 가장 왼쪽에 있는 컬럼
만 Key 필드에 입력할 수 있다는 것을 주의하라.
MySQL 5.0.11 버전 이전에는, 만약 컬럼이 NULL 값을 고려한다면, Key 값은 UNIQUE 인덱스를 사용할 때 조차 MUL이 될 수
있다. UNIQUE에 있는 복합적인 로우는 컬럼이 NOT NULL 이라고 밝히지 않는다면, NULL 값을 가질 수 있다. MySQL 5.0.11
에서, 디스플레이는 컬럼이 NULL을 허락하는지에 관계없이MUL보다는 UNI이다; 컬럼이 NULL을 포함하고 있는지 여부는
NULL 필드에서 볼 수 있다.
Extra 필드는 주어진 컬럼에 유효한 추가적 정보를 포함하고 있다. 예시에서 보여주듯이, Extra 필드는 Id 컬럼이
AUTO_INCREMENT 키워드로 생성된다는 것을 보여준다.
만약 데이터 타입이 예상밖으로 CREATE TABLE 문에 바탕을 둔 것과 다르다면, 가끔 MySQL이 데이터 타입을 변경시킨다는 것
을 주의하라. 13.1.5.1.”암묵적인 컬럼 지정 변경” 장을 참조하라.
SHOW CREATE TABLE 과 SHOW TABLE STATUS 문은 테이블에 관한 정보를 제공한다. 13.5.4”SHOW 신텍스”장을 참
조하라.
제목검색
상위메뉴리스트 ◆
13.3.2. USE Syntax
USE db1;
USE db2;
USE db1;
제목검색
13. SQL 문법(SQL Statement Syntax) 13.4.1. START TRANSACTION, COMMIT, ROLLBACK
13.4. MySQL 트랜잭션 과 잠금문 13.4.2. 록백(ROLLBACK)될 수 없는 문
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=4&scate=0&idx=16762006-08-08 오후 6:19:02
:::MySQL Korea:::
제목검색
13.4.1 START TRANSACTION, COMMIT, 와 ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK SET AUTOCOMMIT = {0 | 1}
MySQL 5.0부터 WORK 옵션 키워드가 CHAINT과 RELASE절 처럼 COMMIT과 RELEASE에 제공된다. CHAIN과
RELEASE는 트랜잭션의 완수를 위한 추가적인 제어를 위해 사용될 수 있다. Completion_type 시스템 변수의 값은 기본 완
료 동작을 결정한다. 5.2.2장 “서버 시스템 변수”부분을 참고하라.
AND CHAIN 절은 현재 트랜잭션이 끝나자마자 새로운 트랜잭션을 시작하도록 하고 새로운 트랜잭션은 이전 트랜잭션과 같
은 격리(isolation) 레벨을 갖는다. RELEASE절은 서버가 현재 트랜잭션을 끝낸 후 서버와의 연결을 끊도록 한다. NO 키워
드의 포함은 CHAIN이나 RELEASE완료를 억제 하도록 하는데 이는 compoletion_type 시스템 변수가 기본적으로 chain과
release완료를 하도록 설정하는데 유용하다.
기본적으로 MySQL은 자동 커밋(autocommit) 모드 상태로 운영된다. 이는 여러분이 테이블을 업데이트 하는 문장을 수행하
자마자MySQL은 디스크에 저장한다.
트랜잭션 안전 저장 엔진(예를 들면, InnoDB, BDB 혹은 NDB Cluster )을 사용하면 아래와 같은 문장으로 자동 커밋을 비
활성화 할 수 있다.:
SET AUTOCOMMIT=0;
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
BEGIN 과 BEGIN WORK 트랜잭션을 시작하기 위한 START TRANSACTION의 alias로 제공된다. START
TRANSACTION은 표준 SQL구문이고 ad-hoc 트랜잭션을 시작하기 위해 권장되는 방법이다.
BEGIN 문은 BEGIN … END 복합 문을 시작하는 BEGIN 키워드의 사용과는 다르다. 후자는 트랜잭션을 시작하지 않는다.
17.2.5장 “BEGIN…END 복합문”부분을 참고하라.
WITH CONSISTENT SNAPSHOT 절은 가능한 저장 엔진에 대해 일관된 읽기를 시작하도록 한다. 현재, 이것은 InnoDB에
만 적용된다. 이는 어떤 InnoDB테이블로부터 SELECT에 의한 START TRANSACTION을 사용하는 것과 같은 효과를 갖
는다.14.2.10.4장 “일관된 비잠금 읽기(consistent non-blocking read)”부분을 참조하라.
제공한다.
● InnoDB와 BDB같은 하나 이상의 트랜잭션 지원 스토리지 엔진의 테이블을 사용할 경우, 트랜잭션 격리 수준은
SERIALIZABLE이 아니면 한 트랜잭션이 커밋 할 때 같은 테이블을 사용 하고 있는 다른 트랜잭션은 첫번째 트랜잭
션에 의해 만들어진 변경 사항들을 보게 된다. 이것은 트랜잭션의 원자성(atomicity)이 혼합된 엔진들과는 보증되지
않으며 비 일관성의 결과가 될 수 있다. (혼합 엔진 트랜잭션들이 드문 경우가 아니면 필요할 때 트랜잭션 단위로
SERIALIZABLE에 대한 격리 수준을 설정하기 위해 SET TRANSACTION ISOLATION LEVEL을 사용할 수 있
다.)
● 한 트랜잭션 안에서 비 트랜잭션 안전 테이블을 사용하면 자동 커밋 모드 상태에 관계없이 그 테이블들에 대한 변경
사항들이 동시에 저장된다.
각 트랜잭션은 COMMIT문에 의해 하나의 단위(one chunk)로 바이너리 로그에 저장된다. 롤백(roll back)되는 트랜잭션은
저장되지 않는다. (예외: 비 트랜잭션 테이블들에 대한 변경은 롤백 될 수 없다. 롤백된 트랜잭션이 비 트랜잭션 테이블들을
포함한다면 전체 트랜잭션은 그 테이블들에 대한 변경이 복제되었음을 확실히 하기 위해 롤백 문을 사용한다.) 5.12.3장 “바
이너리 로그” 부분을 참조하라.
롤백(roll back)은 사용자에게 명시적인 알림 없이 일어날 수 있는 느린 수행이 될 수 있다(예를 들면, error가 발생하는 경
우) 이 때문에 SHOW PROCESSLIST는 암시적/명시적 rollback동안 연결을 위한 State컬럼에서 Rolling back을 보여준
다.
제목검색
상위메뉴리스트 ◆
13.4.2. Roll back될 수 없는 SQL문
여러분은 이러한 SQL문을 포함하지 않도록 트랜잭션을 디자인 해야 한다. 만일 rollback될 수 없는 트랜잭션 에서 앞의 한 SQL문
을 사용한 후 뒤의 다른 SQL문이 실패하면 그 트랜잭션의 전체 영향은 ROLLBACK문을 사용하는 경우처럼 rollback될 수 없다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=4&scate=2&idx=16782006-08-08 오후 6:19:09
:::MySQL Korea:::
제목검색
13. SQL 문법(SQL Statement Syntax) 다음과 같은 SQL 문 각각은 여러분이 그 문장을 수행하기 전에 COMMIT을 한 것처럼, 암묵적으로 트랜잭션을 끝낸다:
13.4. MySQL 트랜잭션 과 잠금문
13.4.3 암묵적 Commit을 유발하는 SQL문 ● ALTER FUNCTION, ALTER PROCEDURE, ALTER TABLE, BEGIN, CREATE DATABASE, CREATE
FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE TABLE, DROP DATABASE, DROP
FUNCTION, DROP INDEX, DROP PROCEDURE, DROP TABLE, LOAD MASTER DATA, LOCK TABLES, LOAD
DATA INFILE, RENAME TABLE, SET AUTOCOMMIT=1, START TRANSACTION, TRUNCATE TABLE,
UNLOCK TABLES.
● UNLOCK TABLES 은 테이블들이 잠겨있는 경우에만 트랜잭션을 커밋 한다.
● CREATE TABLE, CREATE DATABASE DROP DATABASE과TRUNCATE TABLE 문은 MySQL 5.0.6서부터 암묵
적 commit을 유발한다. ALTER FUNCTION, ALTER PROCEDURE, CREATE FUNCTION, CREATE
PROCEDURE, DROP FUNCTION 와 DROP PROCEDURE 문들은 MySQL 5.0.13 서부터 암묵적 commit을 유발한다.
● InnoDB 에서 CREATE TABLE 문은 단일 트랜잭션으로 처리 된다. 이는 사용자가 실행한 ROLLBACK이 트랜잭션 동안
사용자가 만든 CREATE TABLE문을 수행 하지 않음을 의미한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=4&scate=3&idx=16792006-08-08 오후 6:19:11
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
13.4.4. SAVEPOINT 와 ROLLBACK TO SAVEPOINT
ROLLBACK TO SAVEPOINT 문은 명명된 savepoint로 롤백(roll back) 한다. 현재 트랜잭션이 savepoint후에 레코드들에
대한 변경은 롤백에서 수행되지 않지만, InnoDB는 savepoint뒤에 메모리에 저장된 열 잠금을 풀지 않는다. (새로이 삽입된 레
코드에 대해, 잠금 정보는 레코드에 저장된 트랜잭션 ID에 따라 전달 된다. 이 경우, 열 잠금은 실행 취소시 풀린다.) 명명된
savepoint보다 뒤에 설정된 Savepoints는 삭제된다.
MySQL 5.0.17서부터는 저장된 함수가 불리거나 트리거가 활성화 될 때 새로운 savepoint 레벨이 생성된다. 이전 레벨에서
savepoint들은 사용불가능하게 되고 새로운 레벨의 savepoint되 충돌을 피하게 된다. 함수나 트리거가 종료되면 생성된
savepoint 들은 삭제되고 이전 savepoint 레벨은 복귀된다.
제목검색
테이블 잠금은 다른 클라이언트들에 의한 부적절한 읽기나 쓰기를 제한 한다. 잠금을 소유한 클라이언트는 그것이 읽기 잠금일지라
도 DROP TABLE과 같은 테이블 수준의 연산들도 수행 할 수 있다.
다은 트랜잭션 가능한 테이블들에 대한 LOCK TABLES의 사용에 유념 하라:
● LOCK TABLES 은 안전한 트랜잭션이 아니고 테이블을 잠그려는 시도 이전에 수행 중인 모든 트랜잭션을 암묵적으로
commit한다. 또한 트랜잭션의 시작(예를 들면, START TRANSACTION)은 UNLOCK TABLES을 암묵적으로 수행한
다.(13.4.3장 “암묵적 commit을 유발하는 SQL문”을 참조하라.)
● InnoDB테이블과 같은 트랜잭션 테이블들과 함께 LOCK TABLES를 사용하는 정확한 방법은 AUTOCOMMIT=0 으로
설정 하고 트랜잭션을 명시적으로 commit할 때까지 UNLOCK TABLES를 호출 하지 않는 것이다. 여러분인 LOCK
TABLES를 호출할 때 InnoDB는 그자신의 table잠금을 가지게 되고 MySQL은 그 자신의 테이블 잠금을 가진다. InnoDB
는 다음 commint에서 테이블 잠금을 해제 하지만, MySQL이 그 테이블 잠금을 해제 하기 위해서는 여러분이 UNLOCK
TABLES를 호출 해야 한다. InnoDB가 LOCK TABLES의 호출 후에 테이블 잠금을 즉시 해제 하고 데드락(deadlock)이
매우 쉽게 발생 할 수 있기 때문에 AUTOCOMMIT=1을 가질 필요는 없다. 오래된 application들이 불필요한 deadlock을
피하는 것을 돕기 위해 AUTOCOMMIT=1일지라고 InnoDB 테이블 잠금을 얻지 않는 것에 유의하라.
LOCK TABLES을 사용하기 위해, 여러분은 포함된 테이블들에 대한 SELECT권한 및 LOCK TABLES권한을 가지고 있어야 한
다.
한 쓰레드가 한 테이블에서 READ 잠금을 가지면, 쓰레드는 그 테이블에서 오직 읽기만 가능하다. 테이블에 대해 WRITE잠금만
가진 경우, 잠금을 소유한 쓰레드만 그 테이블에 쓸 수 있다. 다른 쓰레드들은 그 잠금이 해제 될 때까지 block된다.
READ LOCAL 과 READ 의 차이는 READ LOCAL이 잠금을 소유한 동안 실행될 충돌 없는(non-conflicting) INSERT 문들을
허용한다. 그러나, 이것은 여러분이 잠금을 소요하는 동안 MySQL외부에서 데이터베이스 파일을 조작 하려 할 때는 사용될 수 없
다. InnoDB테이블들에 대해 READ LOCAL은 MySQL 5.0.13에서의 READ과 같다.( 그 이전에는, READ LOCAL은 아무 것도
하지 않았다. 즉 테이블에 대해 전혀 잠금을 하지 않으며 InnoDB 테이블들에 대해 READ LOCAL의 사용은 일관된 읽기 SELECT
가 같은 읽을 하고 잠금이 필요하지 않기 때문에 반대(deprecated) 된다.)
LOCK TABLES을 사용할 때, 여러분의 질의에서 사용하려는 모든 테이블들에 대해 잠금을 설정해야 한다.
질의가 alias를 이용하여 테이블을 참조한다면 여러분은 같은alias를 사용하여 그 테이블을 잠금(lock)설정을 해야 한다. Alias를
명시 하지 않고 테이블에 대한 잠금은 수행되지 않는다:
반대로, 여러분이 alias를 사용하여 테이블을 잠그면, 질의 내에서는 그 alias를 사용해서만 참조해야 한다.:
WRITE 잠금은 업데이트가 가능한 빨리 처리되도록 하기 위해 READ 잠금들 보다 높은 우선순위를 가진다. 이는 만약 한 쓰레드
가 READ 잠금을 가지고 다른 쓰레드가 WRITE 잠금을 요청 한 경우 READ 잠금 요청은 WRITE 쓰레드가 잠금을 가지고 그것을
해제할 때까지 대기 해야 함을 의미한다. 여러분은 그 쓰레드가 WRITE lock을 기다리는 동안 READ lock들을 갖도록 허용하기
위해 LOW_PRIORITY WRITE lock을 사용할 수 있다. 어떤 쓰레드도 READ lock을 가지지 않는 때가 있는 것이 확실 한 경우에
만 LOW_PRIORITY WRITE lock을 사용해야 한다.
이 정책은 테이블 잠금이 deadlock일으키지 못하도록 한다. 그러나 여러분이 이 정책에 대해 알아야 할 다른 사항들이 있다: 한 테
이블에 대해 LOW_PRIORITY WRITE를 사용하는 경우 MySQL은 READ lock을 원하는 쓰레드가 없을 때까지 이런 잠금 동안
대기 함을 의미한다. 그 쓰레드가 WRITE lock을 가지고 잠금 테이블 리스트에서 다음 테이블에 대한 lock을 얻기 위해 기다리면,
다른 모든 쓰레드들은 WRITE lock이 해제 되길 기다린다. 만약 이것이 여러분의 응용프로그램에 심각한 문제가 된다면 여러분의
테이블들 중 일부를 안전한 트랜잭션 테이블로의 변환을 고려해야 한다.
여러분은 테이블 lock을 기다리고 있는 쓰레드를 안전하게 종료 시키기 위해 KILL을 사용할 수 있다. 13.5.5.3장 “KILL”부분
을 참조 하라.
INSERT가 분리된 쓰레드에 의해 수행되는 경우 때문에 INSERT DELAYED를 사용하는 어떤 테이블에 대해서도 lock을 설정
할 수 없음을 유의하라
모든 단일 UPDATE 문들은 하나의 작은 단위이므로 테이블들에 잠금을 설정할 필요는 없다. 이는 어떤 쓰레드도 현재 수행 중인
SQL문을 방해 할 수 없음을 의미한다. 그러나 테이블 잠금이 이점을 제공하는 몇 가지 경우가 있다.:
● MyISAM 테이블들에서 많은 연산을 수행하려면, 사용하려는 테이블을 잠그는 것이 빠르다. MyISAM 테이블들에 대한 잠
금은 삽입,업데이트나 삭제시 속도를 높여준다. If you are going to run many operations on a set of MyISAM tables,
it is much faster to lock the tables you are going to use. Locking MyISAM tables speeds up inserting, updating,
or deleting on them. 어떤 쓰레드도 READ잠금이 된 테이블을 업데이트 할 수 없으며 어떤 쓰레드도 WRITE잠금이 된
테이블을 접근할 수 없다.
MyISAM연산이 LOCK TABles에서 빠른 이유는 MySQL이 UNLOCK TABLE이 호출 되기 전까지 잠금 설정된 테이블
들에 대해 키 캐쉬(cache)를 삭제 하지 않기 때문이다. 일반적으로 key cache는 각 SQL문 이후에 비워진다.
● MySQL에서 트랜잭션을 지원하지 않는 저장 엔진을 사용하면, 여러분은 어떠한 쓰레드도 SELECT 와 UPDATE사이에
올 수 없도록 하기 위해 LOCK TABLES를 사용해야 한다. 여기 보여지는 예제는 안전하게 수행하기 위해 LOCK
TABLES를 요구 한다:
LOCK TABLES이 없으면 다른 쓰레드가 SELECT와 UPDATE문이 수행 중인 가운데 trans 테이블에 새로운 레코드를
삽입할 가능성이 있다.
여러분은 많은 경우 관련된 업데이트들(UPDATE customer SET value=value+new_value)의 사용이나 LAST_INSERT_ID()
함수를 사용함으로써 LOCK TABLES의 사용을 피할 수 있다. 1.9.5.3장 “트랜잭션과 atomic 연산”부분을 참조하라.
FLUSH TABLES WITH READ LOCK문을 사용하여 일기 잠금으로 모든 데이터베이스의 모든 테이블들에 대해 잠금 설정을 할
수 있다. 13.5.5.2장 “FLUSH”부분을 참조 하라. 이것은 여러분이 시간에 snapshot을 가질 수 있는 Veritas와 같은 파일 시스템
을 가진 경우 backup하기 위한 매우 편리한 방법이다.
Note: 잠금된 테이블에 ALTER TABLE을 사용할 경우 unlock이 될수 있다. 이에 대한 사항은 A.7.1장 “ALTER TABLE의 문
제점”부분을 참조하라.
제목검색
상위메뉴리스트 ◆
13.4.6. SET TRANSACTION
Mysqlid를 초기 기본 전역 격리 레벨을 설정하기 위해서는 trasaciton-isolation 옵션을 사용하라. 5.2.1장 “mysql command
option”을 참조하라.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=4&scate=6&idx=16822006-08-08 오후 6:19:19
:::MySQL Korea:::
제목검색
13.4.7 XA 트랜잭션
13.4.7.1 XA Transaction SQL 신텍스 MySQL 5.0.3 과 그 상위 버전은 XA 트랜잭션을 위한 서버측 지원을 제공한다. 현재 이 지원은 InnoDB저장 엔진에 대해 가능하
다. MySQL XA 구현은 X/Open CAE 문서 인 Distributed transaction processing: XA Specification을 기반으로 구현되었다.
13.4.7.2 XA Transaction States
이 문서는 Open Group에 의해 작성되었고 http://www.opengroup.org/public/pubs/catalog/c193.htm에서 얻을 수 있다. 현재
XA 구현의 제한은 1.5장 “XA 트랜잭션에서의 제약 사항” 부분을 참조하라.
client측에서는 특별한 요구 사항이 없다. MySQL 서버에 대한 XA 인터페이스는 XA 키워드로 시작하는 SQL문으로 이루어져 있
다. MySQL client프로그램은 SQL문을 보내고 XA문 인터페이스에 대한 의미를 이해할 수 있어야 한다. 최근 클라이언트 library
에 링크되지 않아도 된다. 기존 client library들이 또한 작업할 것이다.
MySQL 컨넥터(connectors)들 중, MySQL Connector/J 5.0.0은 XA 디렉토리를 지원한다(여러분을 위한 XA SQL문 인터페이
스를 다루는 클래스 인터페이스를 의미한다).
XA는 분산 트랜잭션을 지원한다. 즉, 여러 개의 분리된 트랜잭션 리소스들로 하여금 하나의 글로벌(global) 트랜잭션에 참여 하도
록 하는 것을 의미한다. 트랜잭션 리소스들은 대부분 RDBMS들이지만 다른 리소스들이 될 수도 있다.
하나의 global 트랜잭션은 그 들 안에서 트랜잭션 되는 몇 가지 action들을 포함한다. 그러나 그 모두는 하나의 그룹으로서 성공적
으로 완료되거나 하나의 그룹으로서 롤백(rollback)된다. 본질적으로, 이것은 ACID 속성을 “up a level”로 하여 여러 개의
ACID트랜잭션들이 하나의 global 연산의 구성원들로서 조화를 이루어 수행될 수 있게 된다. (그러나, 분산 트랜잭션에 경우
ACID 속성을 위해서는 SERIALIZABLE 격리 레벨을 사용해야 한다. 비-분산 트랜잭션을 위해 REPEATABLE READ를 사용해
도 되지만 분산 트랜잭션의 경우에는 그럴 수 없다).
몇 가지 분산 트랜잭션의 예를 들면:
● 하나의 응용 프로그램이 하나의 RDBMS와 함께 메시징 서비스를 결합하여 하나의 통합 툴로서 작동할 수 있다. 이
application은 메시지 전송, 검색(retrieval), 그리고 하나의 트랜잭션 database를 포함하는 처리(processing)가 하나의
global 트랜잭션 안에서 일어나도록 한다. 여러분은 이것을 “transaction email”로 생각할 수도 있다.
● 한 응용 프로그램은 MySQL서버와 Oracle 서버와 같이 이기종의 데이터베이스 서버들을 포함하는 action들을 수행하는
데, 이때 여러 서버들을 포함하는 action들은 각 서버들에게 분리된 트랜잭션이 아닌 하나의 global 트랜잭션의 부분으로
발생 해야 한다.
● 한 은행이 RDBMS에 계좌 정보를 가지고있고 ATM기를 통해서 돈을 받는다. 이때 ATM의 action들은 그 계좌에게 정확
하게 반영되어야 한다. 그러나 이 작업은 RDBMS 혼자서 이루어질 수 없다. 하나의 global트랜잭션 매니저(manager)가
ATM과 데이터베이스 리소스들을 통합하여 전반적인 트랜잭션들의 일관성을 유지 시켜주어야 한다.
● 리소스 매니저(Resource Manager)는 트랜잭션 리소스들에 대한 접근을 제공한다. 데이터베이스 서버는 하나의 리소스
매니저이다. 이것은 리소스 매니저에 의해 관리 되는 트랜잭션을 commit하거나 rollback할 수 있어야 한다.
● 트랜잭션 매니저(Transaction Manager)는 하나의 global트랜잭션의 부분인 트랜잭션들을 통합(coordination)한다. 이것
은 이들 트랜잭션 각각을 다루는 리소스 매니저들과 함께 정보를 주고받는다. 하나의 global 트랜잭션에서 개별적인 트랜잭
션은 global 트랜잭션의 “branches”이다. Global트랜잭션과 그 branch들은 나중에 설명되는 naming scheme에 의해
구별된다.
XA MySQL의 MySQL구현은 MySQL서버로 하여금 한 global 트랜잭션 안에서 XA트랜잭션들을 다루는 하나의 리소스 매니저
(RM)으로 행동하도록 한다. MySQL서버에 연결하는 클라이언트 프로그램은 트랜잭션 매니저로서 행동한다.
한 global 트랜잭션을 완료 하기 위해서는 어떤 구성원이 포함되어 있고, 각 구성원이 commint되거나 rollback되는 시점을 언제
가져 올지에 대해 알고 있어야 한다. 각 구성원이 성공 하기 위한 능력을 어떻게 보고 하느냐에 따라서 그것들 모두가 commit 되거
나 rollback되어야 한다. 즉, 모든 구성원들이 commit되거나, 모든 구성원들이 roll back되어야 한다. 하나의 global트랜잭션을 다
루기 위해서는 어떤 구성원이나 연결 네트웍도 실패할 수 있다는 것을 유념할 필요가 있다.
하나의 global트랜잭션을 실행하기 위한 process는 2단계 commit(2PC)를 사용한다. 이것은 global 트랜잭션의 branch들에 의
해 수행되는 action들 뒤에 일어난다.
commit할 준비 상태가 된다. 일반적으로 이것이 의미하는 것은 브랜치(branch)를 관리하는 각각의RM(리소스 매니저)
는 안정된 스토리지에서 브랜치의 액션들을 기록한다는 것이다. 이 브랜치들은 이것을 할 수 있는지, 그리고 결과가 두번
째 단계에서 사용되는지를 표시한다.
2. 두번째 단계에서는 TM(트랜잭션 매니저)가 RM(리소스 매니저)에게 커미트할 것이지 또는 롤백할 것인지 명령한
다. 만약 모든 브랜치들이 준비되어 있을 때 커미트가 불가능하다고 표시한다면, 모든 브랜치들은 롤백하라고 명령한다.
몇 가지 경우global 트랜잭션은 한 단계 commit을 사용한다. 예를 들면, 트랜잭션 매니저가 global 트랜잭션이 단지 하나의 트랜잭
션 자원으로 성 되었다는 것을 알았을 때 그 자원은 동시에 준비되고 commit되도록 이야기 될수 있다.
제목검색
13.4.7 XA 트랜잭션
XA {START|BEGIN} xid [JOIN|RESUME]
13.4.7.1 XA Transaction SQL 신텍스
13.4.7.2 XA Transaction States
XA PREPARE xid
XA ROLLBACK xid
XA RECOVER
각 XA 문은 XA키워드로 시작하고, 그들 대부분은 xid 값을 필요로 한다. 하나의 xid는 XA 트랜잭션의 구별자 이다. 이것은 그 문
장이 적용되는 트랜잭션을 가리킨다. xid값들은 클라이언트에 의해 제공되거나 MySQL 서버에의해 생성된다. xid값은 하나에서
세개 부분으로 나뉘어진다.
gtrid 는 global 트랜잭션 구별자이고, bqual은 가지 한정자(branch qualifier) 이다. formatID는 gtrid와 bqual 값들에 의해 사용
되는 포맷을 지정하는 숫자이다. Bqual과 formatID는 옵션 사항이다. 기본 bqual값은 ‘ ‘이다. 기본 formatID값은 1이다.
gtrid 와 bqual 는 최대 64자리 길이의 문자열이다. Gtrid와 bqual은 여러 차례 명시 될 수 있다. 인용 문구인 ‘ab’로 사용하거
나 16진수 문자열인 (0x6162,X’ab) 혹은 비트 값은 (b’nnn’)으로 사용할 수 있다.
gtrid 와 bqual 값들은 MySQL 서버의 XA 지원 루틴에 의해 byte들로 해석된다. 그러나, XA문을 포함한 한 SQL문이 해석되는 동
안에는 서버는 특별한 문자열 집합을 사용하여 작업한다. 안전을 위해 gtrid와 bqual을 16진수 문자열로 사용하라.
xid 값들은 전형적으로 트랜잭션 매니저에 의해 생성된다. 하나의 트랜잭션 매니저에 의해 생성된 값들은 다른 트랜잭션 매니저에
의해 생성된 값들과 달라야 한다. 하나의 트랜잭션 매니저는 XA RECORVER문에서 리턴 된 값들 중에서 자신의 값을 인지할 수
있어야 한다.
XA START xid 는 주어진 xid값을 이용하여 하나의 XA 트랜잭션을 시작한다. 각 XA 트랜잭션은 유일한 xid값을 가져야 하며
그 값은 다른 XA 트랜잭션에 의해 사용될 수 없어야 한다. 유일성은 gtrid와 bqual 값들을 이용하여 획득된다. XA 트랜잭션을 위
한 모든 다음 XA트랜잭션 문은 XA START 문에서 주어진 값을 xid값을 이용하여 명시 되어야 한다. 여러분이 이들 문장들 중 하
나를 사용하지만 몇몇 기존의 XA트랜잭션에 부합하지 않는 xid값을 명시 한다면, 에러가 발생한다.
하나 혹은 그 이상의 XA트랜잭션은 같은 global 트랜잭션의 부분일 수 있다. 하나의 주어진 global트랜잭션 안에서 모든 XA 트랜
잭션은 같은 xid 값에서 같은 gtrid값을 사용해야 한다. 이러한 이유로, gtrid값은 전역적으로(globally)유일해야 하며 이로써 XA
트랜잭션이 어떤 global 트랜잭션의 부분인지에 관한 모호성이 사라진다. xid값의 bqual 부분은 하나의 global 트랜잭션 안에서
각 XA트랜잭션과 달라야 한다. (bqual 값들이 달라야 하는 요구 사항은 현재 MySQL XA 구현의 한계이다. 이것은 XA 명시의 부
분이 아니다)
XA RECOVER 문은 PREPARED 상태에 있는 MySQL 서버에서 XA트랜잭션 들을 위한 정보를 리턴한다. (13.4.7.2 장 “XA 트
랜잭션 상태”등을 참조 하라) 결과는 서버상에서 XA 트랜잭션을 위한 하나의 레코드들 포함한다.
mysql> XA RECOVER;
+----------+--------------+--------------+--------+
+----------+--------------+--------------+--------+
| 7| 3| 3 | abcdef |
+----------+--------------+--------------+--------+
제목검색
13.4.7 XA 트랜잭션
13.4.7.1 XA Transaction SQL 신텍스
13.4.7.2 XA Transaction States
1. 하나의 XA 트랜잭션을 시작하기 위해서는 XA START를 사용하고 ACTIVE 상태로 둔다.
2. 하나의 ACTIVE XA 트랜잭션에 대해 트랜잭션을 구성하는 SQL문들을 호출한다. 그 다음 XA END문을 사용한다.
XA END는 트랜잭션을 IDLE상태로 변경 한다.
3. 하나의 IDLE XA트랜잭션에 대해, XA PREPARE 문이나 XA COMMIT … ONE PHASE 문을 사용할 수 있다:
• XA PREPARE 은 트랜잭션을 PREPARE상태로 한다. 이때 XA RECOVER문은 XA RECOVER가
PREPARED상태에 있는 모든 XA 트랜잭션을 나열하기 때문에 출력 값으로 트랜잭션의 xid 값을 포함할 것이
다.
• XA COMMIT ... ONE PHASE 는 트랜잭션을 준비하고 commit한다. xid값은 트랜잭션이 끝나기 때문에
XA RECOVER에 의해 나열되지 않을 것이다.
4. PREPARED XA 트랜잭션에 대해 그 트랜잭션을 commit하고 종료 하기 위해 XA COMMIT문을 사용 할 수 있다.
혹은 트랜잭션을 롤백하고 종료하기 위해 XA ROLLBACK 을 사용할 수 있다.
아래는 global트랜잭션의 일 부분으로서 하나의 테이블에 하나의 레코드를 삽입하는 간단한 트랜잭션을 예로 든다.
제목검색
13.5.5.5 RESET
제목검색
중요: MySQL의 몇몇 릴리즈들은 새로운 권한과 기능이 추가된 grant 테이블 구조의 변화를 소개하고 있다.MySQL을 새버전으로
업데이트할 때면 언제나 테이블들이 현재의 구조로 구성되어 있어 새로운 권한을 가질 수 있는지 확인하기 위해서 grant 테이블을
업데이트 해야 한다. 5.6.2, “mysql_upgrade — MySQL 업그레이드를 위한 테이블 체크”장을 참조하라.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=5&scate=1&idx=16842006-08-08 오후 6:19:40
:::MySQL Korea:::
제목검색
13.5.1 계정 관리문
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
13.5.1.1 CREATE USER
13.5.1.2 DROP USER Syntax
CREATE USER 문은 MySQL 5.0.2 버전에서 새롭게 추가되었다. 이 문은 새로운 MySQL 계정을 생성한다. 이것을 사용하기 위
13.5.1.3 GRANT
해서 MySQL 용 글로벌 CREATE USER 권한이나NSERT 권한을 갖고 있어야 한다. 각각의 계정에 CREATE USER 는 권한이
13.5.1.4 RENAME USER
없는 mysql.user 테이블에 새로운 레코드를 생성한다. 계정이 이미 존재한다면 에러가 발생한다. 각각의 계정은 GRANT 문에 관
13.5.1.5 REVOKE 하여 같은 포맷으로 명명된다; 예를들면, jeffrey'@'localhost'.
13.5.1.6 SET PASSWORD
계정 이름의 사용자와 호스트(Host) 부분은 그 계정에 대한 User 테이블의 레코드상의 User 와 Host 컬럼 값과 일치한다.
계정은 임의의 IDENTIFIED BY 절을 가진 패스워드가 주어질 수 있다. user 값과 패스워드는 GRANT 문에 대하여 같은 방법으
로 주어진다. 특히 단조로운 텍스트에서 패스워드를 지정하기 위해서, PASSWORD 키워드는 생략하라. PASSWORD() 기능에 의
해 리턴된 해쉬값으로 패스워드를 지정하기 위해서 PASSWORD 키워드를 포함하라.13.5.1.3 “GRANT 신텍스” 장을 참조하라
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=5&scate=1&idx=16852006-08-08 오후 6:19:53
:::MySQL Korea:::
제목검색
13.5.1 계정 관리문
DROP USER 문은 하나 또는 그 이상의 MySQL 계정을 제거한다. 이것을 사용하기 위해서, mysql용으로 글로벌 CREATE
13.5.1.1 CREATE USER
USER 권한 또는 DELETE 권한을 가지고 있어야 한다. 각 계정은 GRANT 문에 대하여 같은 포맷을 사용하여 명명된다. 예를들
13.5.1.2 DROP USER Syntax
어, 'jeffrey'@'localhost'. 계정 이름의 사용자와 호스트(Host) 부분은 그 계정에 대한 User 테이블의 레코드상의 User 와 Host
13.5.1.3 GRANT
컬럼 값과 일치한다.
13.5.1.4 RENAME USER
13.5.1.5 REVOKE
13.5.1.6 SET PASSWORD
MySQL 5.0.0에서 DROP USE는 오직 권한이 없는 계정만을 제거한다. MySQL 5.0.2에서는 계정 권한까지 제거하도록 수정되었
다. 이것은 한 계정을 제거하는 처리절차가 MySQL버전에 따라 다르다는 것을 의미한다.
MySQL 5.0.0 와 5.0.1에서, DROP USER 는 오직 권한이 없는 MySQL 계정만을 삭제한다. 이 MySQL 버전에서 user 테이블로
부터 각각의 계정 레코드를 삭제하는 데에만 작용한다. 한 MySQL 계정을 완전히 삭제하려면(그것의 모든 권한을 포함해), 다음
의 프로시져를 차례로 사용해야 한다:
1. 계정이 가지고 있는 권한을 결정하기 위해서SHOW GRANTS를 사용한다. 13.5.4.12, “SHOW GRANTS”장을
참조하라.
2. SHOW GRANTS 를 통해 보여주는 권한을 취소하기 위해서 REVOKE를 사용한다. 이것은 user테이블을 제외한 모
든 grant로부터 계정에 대한 로우를 삭제하고 user테이블에 있는 글로벌 권한을 취소한다. 13.5.1.3, “GRANT 신텍
스”. 장을 참조하라
3. user 테이블 레코드를 제거하기 위해 DROP USER 를 사용하여 계정을 삭제한다.
중요: DROP USER 는 어떤 오픈 유저 세선을 자동적으로 종료하지 않는다. 오히려 하나의 오픈 세션을 가진 유저가 드롭되는 경우
에, 명령문은 그 사용자의 세션이 드롭될 때까지 효력을 발생하지 않는다. 세션이 종료되기 이전에, 사용자가 드롭되고, 사용자가
로그인을 시도하면 실패할 것이다. This is by design.
제목검색
13. SQL 문법(SQL Statement Syntax) GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
13.5. 데이터베이스 관리문 ON [object_type] {tbl_name | * | *.* | db_name.*}
object_type =
TABLE
| FUNCTION
| PROCEDURE
with_option =
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
GRANT 문은 시스템 관리자가 MySQL 사용자 계정을 생성하고 계정으로부터 권한을 부여할 수 있도록 한다. GRANT를 사용하
려면, 반드시GRANT OPTION 권한을 가지고 있어야 하며, 또한 스스로 권한을 부여할 수 있어야 한다. REVOKE 문과 관련이 있
으며, 관리자가 계정권한을 삭제할 수 있도록 한다. 13.5.1.5, “REVOKE ”장을 참조하라.
MySQL 계정 정보는 mysql 데이터베이스 테이블에 저장되어 있다. 이 데이터베이스와 엑세스 컨트롤 시스템은 “5. 데이터베이
스 관리” 장에 자세히 언급되어 있다
중요: MySQL의 몇몇 릴리즈에는 새로운 권한과 기능을 추가한 grant 테이블의 구성에 변경이 있다고 소개한다. MySQL 새로운
버전으로 업데이트할 때면 언제나grant 테이블도 업데이트해야 한다. 그럼으로써 새로운 기능을 이용할 수 있는지 현재 구성을 확
인할 수 있다. 5.6.2, “mysql_upgrade — Check Tables for MySQL Upgrade”장을 참조하라.
Grant 테이블이 mixed-case 데이터베이스 또는 테이블 이름들을 포함하고 있는 권한 로우를 가지고 있거나,
lower_case_table_names 시스템 변수를 non-zero 값으로 셋팅한다면, REVOKE 는 이 권한들을 취소할 수 없다. grant 테이블
을 직접 조정할 필요가 있다. (GRANT는 lower_case_table_names 가 셋팅되었을 때, 그런 로우를 생성하지 않는다.그러나 그런
로우는 변수를 셋팅하기에 앞서 생성되기도 한다
● Global level
Global 권한은 주어진 하나의 서버에 모든 데이터베이스를 적용한다. 이 권한은 mysql.user 테이블에 저장되어 있다.
GRANT ALL ON *.* 과 REVOKE ALL ON *.* 은 오직 글로벌 권한들만을 부여하고 취소한다.
● Database level
데이터베이스 권한은 주어진 하나의 데이터베이스에서 모든 오브젝트에 적용한다. 이 권한은 mysql.db 와 mysql.host 테
이블에 저장되어 있다. GRANT ALL ON db_name.* 와REVOKE ALL ON db_name.* 은 오직 데이터베이스 권한들만
부여하고 취소한다.
● Table level
테이블 권한은 주어진 하나의 테이블에서 모든 컬럼에 적용한다. 이 권한은 mysql.tables_priv 테이블에 저장되어 있다.
● Column level
컬럼 권한은 주어진 하나의 테이블에서 싱글 컬럼에 적용한다. 이 권한은 mysql.columns_priv 테이블에 저장되어 있다.
REVOKE를 사용할 때, 부여받은 것과 같은 컬럼을 지정해야만 한다.
● Routine level
CREATE ROUTINE, ALTER ROUTINE, EXECUTE, GRANT 권한은 스토어드 루틴에 적용한다. (기능과 프로시져).
이 권한들은 글로벌과 데이터베이스 레벨에서 부여된다. 물론 CREATE ROUTINE 을 제외하고, 이 권한들은 각가의 루
틴을 위한 루틴 레벨에서 부여될 수 있으며, mysql.procs_priv 테이블에 저장되어 있다.
object_type 절은 MySQL 5.0.6에서 추가되었다. 다음 오브젝트가 하나의 테이블, 하나의 저장된 기능, 또는 하나의 스토어드 프
로시져라면, TABLE, FUNCTION, 또는 PROCEDURE 로 지정되어야 한다.
권한 의미
CREATE
TEMPORARY CREATE TEMPORARY TABLE 사용 허용
TABLES
DELETE DELETE 사용 허용
INSERT INSERT 사용 허용
RELOAD FLUSH 사용 허용
REPLICATION
사용자가 슬레이브 또는 마스터 서버가 있는 곳을 질문할 수 있음
CLIENT
SELECT SELECT 사용 허용
UPDATE UPDATE 사용 허용
EXECUTE 권한은 MySQ5.0.3까지 실행할 수 없었다. CREATE VIEW 와 SHOW VIEW 는 MySQL 5.0.1에 추가되었다.
CREATE USER, CREATE ROUTINE, 와 ALTER ROUTINE MySQL 5.0.3에 추가되었다.
어떤 권한을 계정에 부여할지 결정할 때 SHOW GRANTS 를 사용하라 13.5.4.12, “SHOW GRANTS Syntax”장을 참조하라.
ON *.* 신텍스를 이용해 글로벌 권한을 또는 ON db_name.* 신텍스를 이용해 데이터베이스-레벨 권한을 지정할 수 있다. 만약
ON *지정하고, 디폴트 데이터베이스를 선택한다면, 권한은 데이터베이스-레벨이 부여된다.
테이블에 지정할 수 있는 priv_type 값은 SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT OPTION,
INDEX, ALTER, CREATE VIEW 그리고 SHOW VIEW이다.
컬럼에 지정할 수 있는 priv_type 값은(즉, column_list 절을 사용할 때) SELECT, INSERT, 그리고 UPDATE이다.
루틴 레벨에 지정할 수 있는 priv_type 값은 ALTER ROUTINE, EXECUTE, 그리고 GRANT OPTION이다. CREATE
ROUTINE 은 루틴을 생성하기 위해서는 우선 이 권한을 가지고 있어야 하기 때문에 루틴-레벨 권한이 아니다.
글로벌, 데이터베이스, 테이블, 루틴 레벨에 있어, GRANT ALL 은 사용자가 지정하는 레벨에 존재하는 권한만을 지정한다. 예를
들어, GRANT ALL ON db_name.* 은 데이터베이스-레벨 문이다. 그러므로 그것은 FILE 과 같이 글로벌-권한은 부여되지 않는
다.
MySQL에서 사용자는 존재하지 않는 데이터베이스 오브젝트에 까지도 권한을 부여할 수 있다. 이런 경우, 주어진 권한들은
CREATE 권한을 포함하고 있어야 한다. 이런 것은 계획적이며, 데이터베이스 관리자가 나중에 생성될 데이터베이스 오브젝트를
위한 사용자 계정과 권한을 준비할 수 있도록 한다.
중요: MySQL 은 테이블이나 데이터베이스가 드롭된다고, 권한이 자동적으로 취소되지 않는다. 그러나, 루틴이 드롭되면, 루틴-레
벨에 주어진 권한은 취소된다.
주의: ‘_’ 과 ‘%’ 와일드카드는 글로벌 또는 데이터베이스 레벨에 권한을 부여한 GRANT문에서 데이터베이스 이름을 지정
할 때, 허용된다. 즉, 예를 들어, ‘_’ 문자를 데이터베이스 이름의 부분으로 사용하고자 한다면, 예를 들어 GRANT ... ON `foo
₩_bar`.* TO ... 와 같이 와일드카드 패턴으로 매칭되는 추가적인 데이터베이스에 사용자가 접근하는 것을 막기 위해서 GRANT
문에서 ‘₩_’로 지정해야 한다.
경고: 여러분이 익명의 사용자들이 MySQL서버로의 연결을 허가 한다면, 여러분은 user_name@localhost로서 모든 local 사용자
들에게 권한을 부여해야 한다. 그렇지 않으면 명명된 사용자들이 local 시스템으로부터 MySQL서버에 로그인 하려 할 때에 mysql.
user테이블(MySQL 설치 시 생성된)내의 localhost에 대한 익명의 사용자 계정이 사용된다. 보다 상세한 사항은 5.8.5장
“Access Control, Stage 1 : Connection Verification”부분을 참조 하라.
다음과 같은 쿼리를 실행함으로써 이것을 적용할 것인지를 결정할 수 있으며, 이는 익명의 사용자들을 기재한다:
만일 여러분이 방금 설명된 문제를 피하기 위해 local 익명 사용자 계정을 삭제 하길 원한다면 다음과 같은 문장을 사용하라:
GRANT 는 최대 60자의 호스트 이름을 지원한다. 데이터베이스,테이블,컬럼 그리고 루틴 이름들은 64자 문자열까지 가능하다. 사
용자 이름들은 16자까지 가능하다.
주의: 사용자이름에 대한 허용가능한 길이는 mysql.user 테이블의 내용을 조절하여 변경될 수 없으며 이러한 시도는 그 사용자들
이 해당 MySQL서버에 로그인 하지 못하는 예상치 못한 결과를 초래 할 수 있다. 여러분은 5.6.2장 “mysql_upgrade – Check
Tables for MySQL Upgrade”에서 설명된 MySQL AB에 의해 규정된 procedure의 방법을 제외하고 어떤 방법으로든 mysql
데이터베이스 내의 테이블의 내용을 변경 할 수 없다.
global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
OR routine privileges
대부분의 경우, 여러분은 권한 레벨의 하나에서만 사용자에게 권한을 부여 한다. 권한 check 프로시져에 대한 자세한 사항은 5.8
장 “MySQL Access Privilege System’부분을 참조하라.
경고: 여러분이 새로운 사용자를 생성하고 IDENTIFIED BY 절을 명시 하지 않으면, 그 사용자는 패스워드를 갖지 않는다. 이것은
매우 위험하다. MySQL 5.0.2에서부터는, 여러분은 IDENTIFIED BY가 새로운 사용자에게 패스워드를 제공하기 위해 주어지지
않는한, 새로운 사용자를 생성할 때 GRANT를 방지 하기 위해 NO_AUTO_CREATE_USER SQL 모드를 활성화 할 수 있다.
새로운 사용자가 생성되거나 여러분이 global grant 권한을 가진 경우, 사용자의 패스워드는 IDENTIFIED BY절에 의해 명시 된
예를 들면:
GRANT ...
IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
SHOW DATABASES 권한은 사용자 계정이 SHOW DATABASE문을 실행하여 데이터베이스 이름을 볼 수 있도록 한다. 이 권한
을 갖지 않는 계정들은 그들이 권한을 가진 몇몇 데이터베이스만을 볼 수 있고 서버가 –skip_show-database옵션으로 시작 했다
면 그 문장을 사용할 수 없다.
한 사용자가 한 테이블에 대해 권한을 갖지 않는 경우 이 테이블 이름은 사용자가 테이블 리스트를 요구할 경우에 display되지 않
는다(예를 들면, SHOW TABLES 문).
WITH GRANT OPTION절은 사용자에게 명시된 권한 레벨에 따라 그가 가진 권한들 중 어느 것이든 줄 수 있는 권한을 준다. 여
러분은 다른 권한을 가진 두 사용자가 join 권한을 활성화 할 수 있기 때문에, GRANT OPTION권한을 줄 대상에 대해 주의 해야
한다.
여러분은 여러분이 갖지 않은 권한을 다른 사용자에게 부여 할 수 없다. GRANT OPTION권한은 자신이 소유한 권한들만을 할당
할 수 있게 한다.
여러분이 틀별한 권한 레벨로 GRANT OPTION권한을 한 사용자에게 부여할 때, 그 레벨에서 사용자가 소유(혺은 미래에 제공될)
한 어떤 권한들도 다른 사용자에게 부여 될 수 있다. 여러분이 한 데이터베이스에 INSERT권한을 부여할 경우를 가정해 보라. 여러
분이 데이터베이스에서 SELECT 권한을 부여하고 WITH GRANT OPION을 명시 하면, 그 사용자는 SELECT 권한을 부여할 뿐
만 아니라 INSERT권한도 부여할 수 있다.
여러분이 그 데이터베이스에 대해 UPDATE 권한을 부여하면 그 사용자는 INSERT, SELECt, 그리고 UPDATE에 대한 권한도
부여할 수 있다.
관리자가 아닌 사용자에 대해, 여러분은 global혹은 mysql 데이터베이스에 대해 ALTER권한을 부여할 수 없다. 만약 이것을 할 경
우, 그 사용자는 테이블들을 재 명명하여 권한 시스템을 파괴 하려 할 수 있다.
주의: 존재하는 권한들을 영항을 미치지 않고 기존 사용자에게 자원 제한 옵션을 명시하기 위해서는 GRANT USAGE ON *.* …
WITH MAX_...를 사용하라.
MySQL은 username과 password에 기반한 일반적인 인증에 더해서 X509 자격 속성을 체크 할수 있다.
MySQL 계정을 위해 SSL관련 옵션들을 명시하기 위해서는 GRANT문의 REQUIRE절을 사용하라(MySQL과 SSL의 사용에 관
한 배경 정보는 5.9.7장 “Using Secure Connections”을 참조하라.)
● 계정이 SSL 이나 X509 자격을 갖지 않으면 username과 password가 유효 할 경우 비암호화된 연결이 허락된다. 그러나
client의 옵션에서, 클라이언트가 적절한 인증과 키파일을 갖는 경우, 암호화된 연결들이 사용될 수 있다.
● REQUIRE SSL 옵션은 그 계정에 대해서 오직 SSL-암호화 연결만을 허용하도록 말한다. 이 옵션은 비-SSL 연결들을 허
용하는 접근 제어 레코드들이 존재하면 생략될 수 있다.
● REQUIRE X509 는 client는 유효한 인증을 가져야 하여 정확한 인증, isuser, 그리고 subject는 문제가 되지 않음을 의미
한다. 단지 필요한 요건은 CA 인증 중 하나로 그 서명(signature)를 확인할 수 있어야 한다.
● REQUIRE ISSUER 'issuer' 클라이언트가 CA 'issuer'로 발생한 유효한 X509 인증을 제출 해야하는 연결 시도에 대해 제
한을 가한다. 만약 그 사용자가 유효하지만 다른 issuer를 가진 인증을 제시 할경우 서버는 이 연결을 거부한다. X509 인증
의 사용은 항상 암호화를 내포하며 SSL 옵션은 이 경우 불 필요하다.
● REQUIRE SUBJECT 'subject' 는 subject 를 포함하는 유효한 X509 인증을 제시해야 하는 연결 시도에대해 제약을 가한
다. 클라이언트가 유효하지만 다른 subject를 가진 인증을 제시하면 서버는 그 연결을 거부 한다.
● REQUIRE CIPHER 'cipher' 는 충분한 강도의 암호문들과 키가 사용되도록 할 필요가 있다. SSL은 짧은 암호화 키들을
이용하는 오래된 알고리즘이 사용될 경우 약해질 수 있다. 이 옵션을 사용하면 여러분은 특정 암호화 방법이 연결을 허락하
기 위해 사용될 수 있는지 물어봐야 한다.
mysqld 이 시작할 때, 모든 권한들은 메모리로 읽어 온다. 이에 대한 자세한 사항은 5.8.7장 “Wen Privilege Changes Take
Effect”를 참조하라.
여러분이 심지어 한 사용자에 대해서 table, column 혹은 routine 권한을 사용할 경우, 서버는 모든 사용자에 대한 table, column
그리고 routine 권한을 검사하며 이는 MySQL을 다소 느리게 한다. 유사하게, 임의의 사용자들에 대해 query, update, 혹은 연결
의 수를 제한한다면 그 서버는 이들 값들을 모니터 해야 한다.
제목검색
13.5.1 계정 관리문
[, old_user TO new_user] ...
13.5.1.1 CREATE USER
13.5.1.2 DROP USER Syntax
RENAME USER 문은 MySQL 5.0.2 버전에서 추가되었다. 이것을 사용하려면, 글로벌 CREATE USER 권한 또는 mysql 데이터
13.5.1.3 GRANT
베이스용 UPDATE 권한이 있어야 한다. 임의의 오래된 계정이 존재하지 않거나 임의의 새로운 계정이 존재하면 에러가 발생한다.
13.5.1.4 RENAME USER
각각의 계정은 GRANT 문과 같은 포맷을 사용하여 명명된다. 예를들어 'jeffrey'@'localhost'. 사용자나 계정이름의 호스트 부분
13.5.1.5 REVOKE 은 계정에 있어 user 로우의 User 와 Host 컬럼 값에 따라 결정된다.
13.5.1.6 SET PASSWORD
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=5&scate=1&idx=18462006-08-08 오후 6:20:10
:::MySQL Korea:::
제목검색
13.5.1 계정 관리문
ON [object_type] {tbl_name | * | *.* | db_name.*}
13.5.1.1 CREATE USER
13.5.1.2 DROP USER Syntax
FROM user [, user] ...
13.5.1.3 GRANT
13.5.1.4 RENAME USER
13.5.1.5 REVOKE
13.5.1.6 SET PASSWORD REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
REVOKE 문은 시스템 관리자가 MySQL 계정으로부터 권한을 취소할 수 있게 해준다. REVOKE 문을 사용하려면, GRANT
OPTION 권한을 가지고 있어야 하며, 취소권한이 있어야 한다.
권한을 가진 레벨, 허용된 priv_type 값, 지정한 사용자와 비밀번호에 관한 신텍스에 관한 자세한 사항은 13.5.1.3, “GRANT
Syntax” 장을 참조하라
grant 테이블이 mixed-case 데이터베이스 또는 테이블 이름이 포함된 권한 로우에 있고, lower_case_table_names 시스템 변수
가 제로(zero)가 아닌 값으로 셋팅되어 있다면, REVOKE는 이 권한들을 취소할 수 없다. 그것은 grant 테이블을 직접 조작하는데
필요하게 될 것이다. (GRANT 는 lower_case_table_names 이 셋팅되었을 때, 그런 로우를 생성하지 못한다. 그러나 그런 로우
는 변수 셋팅에 앞서 생성될 수 있다.
모든 권한을 취소하려면, 다음의 신텍스를 사용하라. 이 신텍스는 명명된 사용자 또는 사용자들의 모든 글로벌, 데이터베이스-, 테
이블-, 컬럼-레벨 권한을 드롭시킨다:
이 REVOKE 신텍스를 사용하려면, 글로벌 CREATE USER 권한 또는 mysql 데이터베이스 용 UPDATE 권한이 있어야 한다.
제목검색
13.5.1 계정 관리문
SET PASSWORD 문은 현재 MySQL에 있는 사용자 계정에 비밀번호를 지정한다.
13.5.1.1 CREATE USER
13.5.1.2 DROP USER Syntax
FOR 가 없는 절에서, 이 문은 현재 사용자의 비밀번호를 셋팅한다 익명이 아닌 계정을 사용하는 서버에 접속된 클라이언트는 그 계
13.5.1.3 GRANT
정의 비밀번호를 변경할 수 있다.
13.5.1.4 RENAME USER
13.5.1.5 REVOKE FOR 절에서, 이 문은 현재 서버 호스트에서 특정한 계정의 비밀번호를 셋팅한다. mysql 데이터베이스용UPDATE 권한을 가진 클
13.5.1.6 SET PASSWORD 라이언트만 이것을 할 수 있다. user 값은 user_name@host_name 포맷에 주어진다. 이 포맷은 user_name 과 host_name 이
mysql.user 테이블 입력의 User와 Host 컬럼에 기록된 것과 똑같다. 예를 들어, 'bob' 와 '%.loc.gov' 의 User와 Host 컬럼 값을
입력했다면, 다음과 같이 명령문을 쓴다:
FLUSH PRIVILEGES;
주의: MySQL 4.1 또는 4.1 클라이언트 프로그램을 사용하는 서버에 연결되어 있다면, 먼저 5.8.9, “MySQL 4.1에서의 비밀번
호 해쉬(hash)” 장을 읽어보고 SET PASSWORD 또는 UPDATE 문을 사용하라. 비밀번호 포맷이 MySQL 4.1 버전에서 변경되
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=5&scate=2&idx=17172006-08-08 오후 6:20:15
:::MySQL Korea:::
제목검색
13.5. 데이터베이스 관리문 ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
Column Value
Table 테이블 이름
Op 항상 analyze
Msg_text 메시지
SHOW INDEX 문으로 스토어드 키 디스트리뷰션을 체크할 수 있다. 13.5.4.13, “SHOW INDEX” 장을 참조하라
마지막 ANAYZE TABLE 문 이래로 테이블이 변경되지 않는다면, 테이블은 다시 분석되지 않는다.
임의의 NO_WRITE_TO_BINLOG 키워드(또는 그것의 알리아스 LOCAL)를 사용하지 않는다면, ANALYZE TABLE 문은 바이
너리 로그로 쓰여진다. 리플리케이션 마스터로 작용하는 MySQL 서버에서 사용중인 ANALYZE TABLE 문은 리플리케이션 슬레
이브로 디폴트로 리플리케이션 될 것이다.
제목검색
13.5.2.7 RESTORE TABLE 그 두 파일로부터 개조될 수 있다. 디렉토리는 완전한 경로이름으로 열거된다. 테이블을 복구하기 위해서, RESTORE TABLE 을
사용한다.
백업하는 동안, 리드록(read rock)은 백업될 순서대로 각각의 테이블에 보관된다. 만약 몇몇 테이블을 스냅샷으로 백업하고 싶다
면(백업을 실행하는 동안 변경되는 것으로부터 이것을 보호하기 위해), 그룹 내 모든 테이블에 리드록(read lock)을 포함시키기
위해 LOCK TABLES 문을 먼저 실행한다.
Column Value
Table 테이블 이름
Op 항상 backup
Msg_text 메시지
제목검색
13. SQL 문법(SQL Statement Syntax) CHECK TABLE tbl_name [, tbl_name] ... [option] ...
13.5. 데이터베이스 관리문
Column Value
Table 테이블 이름
Op 항상 backup
Msg_text 메시지
문은 각각 체크된 테이블에 관한 정보가 있는 많은 로우를 생성할 수 있다는 것을 유념하라. 마지막 로우는 staus의 Msg_type 값
을 가지고 있고, Msg_text 은 일반적으로 OK이다. 만약 OK또는 Table is already up to date 가 나오지 않는다면, 일반적으로 테
이블 복구를 실행해야한다. 5.10.4, “테이블 관리와 크래쉬복구”장을 참조하라. Table is already up to date 는 테이블의 스토
리지 엔진이 테이블을 체크할 필요가 없다고 표시한다는 것을 의미한다.
FOR UPGRADE 옵션은 명명된 테이블이 현재 MySQL 버전과 호환성이 있는지 체크한다. 이 옵션은 MySQL 5.0.19버전에 추가
되었다. 테이블이 생성된 이래로 테이블의 데이터 타입이나 인덱스에 있어 어떤 호환성없는 변경이 있는지 측정하기 위해서, 서버
는 FOR UPGRADE로 각 테이블을 체크한다. 변경이 없다면 체크는 성공이다. 그렇지 않고 호환성이 없다면, 서버는 테이블을 모
두 체크한다(시간이 좀 걸린다). 풀 체크가 성공하면, 서버는 테이블의 .frm 파일을 현재 MySQL 버전 숫자로 표시한다. .frm 파일
로 표시함으로써, 서버와 같은 버전으로 테이블을 체크하는 것이 더 빨라질 것이다.
데이터타입에 따라 스토리지 포맷이 변경되거나, 정렬순서가 변경되기 때문에 호환되지 않는 경우가 발생한다. 우리의 의도는 이
런 변경을 예방하는 것이다. 그러나 때때로 릴리즈된 버전 간에 호환이 안되는 문제를 교정하는 것이 필요하다.
● InnoDB와 MyISAM테이블의 TEXT 컬럼에 있어 end-space 인덱싱 순서는 MySQL 4.1과 5.0 사이에서 변경되었다.
● 새로운 DECIMAL 데이터 타입의 저장방법은 MySQL 5.0.3과 5.0.5 사이에 변경되었다.
다른 체크 옵션은 다음 표에서 보여준다. 이 옵션들은 오직 MyISAM 테이블을 체크하는 데에만 적용되며, InnoDB 테이블과 뷰에
서는 무시된다.
Type Meaning
삭제된 링크가 유효한지 검증하기 위해 로우를 스캔한다. 이것은 로우의 키 검사합계를 계산하고, 키들의 계산된
MEDIUM
검사합계를 가지고 이것을 검증한다.
EXTENDED 각 로우의 모든 키들을 검색한다. 이것은 테이블이 100% 일치한다는 것을 보여주지만 시간이 오래 걸린다.
QUICK, MEDIUM, 또는 EXTENDED 옵션이 열거되어 있지 않다면, 동적인 포맷 MyISAM 테이블에 디폴트 체크 타입은
MEDIUM이다. 이것은 테이블에 있어 myisamchk --medium-check tbl_name 실행과 같은 결과이다. CHANGED 또는 FAST
가 열거되어 있지 않다면, 정적인 포맷 MyISAM 테이블에 디폴트 체크 타입 또한 MEDIUM이다. 그런 경우, 디폴트가 QUICK 이
다. 로우가 오류를 일으키는 경우가 매우 드물기 때문에, 로우 스캔은 CHANGED와 FAST의 경우 생략한다.
완전히 종료되었는지 결정하기 위해 테이블에서 빠른 체크를 실행하는 다음의 예와 같이 체크옵션을 결합할 수도 있다:
주의: 몇 명의 경우에서 CHECK TABLE은 테이블을 변경시킨다. 만약 테이블에 “오류발생” 또는 “완전히 종료되지 않음”이
라는 표시가 나타나면 이런 변경이 발생한다. 그러나 CHECK TABLE은 이 테이블에서 문제점을 찾지 못한다. 이런 경우 CHECK
TABLE은 OK로 표시된다.
테이블에 오류가 발생한다면, 문제가 데이터 파트가 아니라 인덱스에 있다는 것과 같다. 전술한 체크 타입 모두 인덱스를 완전히 체
OK라고 생각되는 테이블을 체크하고자 한다면, 체크옵션이나 QUICK옵션을 사용할 필요가 없다. 후자(QUICK 옵션)는 급할 때
사용되며, 데이터파일에서 QUICK이 에러를 찾아내지 못하는 정도의 매우 작은 리스크를 감당할 수 있다. (대부분의 경우, 일반적
인 사용에는 MySQL이 데이터파일에 있는 모든 에러를 찾아낸다. 이런 경우가 발생하면, 테이블에 “corrupted”라고 표시되며
정정될 때까지 사용이 중단된다.)
만약 때때로 테이블을 체크하고자 한다면, FAST 와 CHANGED 는 대체로 한 스크립트로부터 사용된다(예를 들어 cron 으로부
터 실행됨) 대부분의 경에, FAST 가 CHANGED보다 선호된다. (그것이 선호되지 않는 경우는 오로지 MyISAM코드에서 버그가
발견되었다고 생각될 때 뿐이다.)
EXTENDED 는 일반적으로 체크하고도 MySQL이 로우를 업데이트하거나, 키로 로우를 찾을 때, 테이블에서 이상한 에러가 생기
는 경우에만 사용된다. 일반적인 체크가 성공한다면, 이런 경우는 아주 드물다.
이것은 테이블에 AUTO_INCREMENT 인덱스 컬럼이 0 값을 포함한 로우가 있음을 의미한다. (UPDATE 문으로 컬럼
을 명확하게 0으로 셋팅함으로써 AUTO_INCREMENT 컬럼이 0인 로우를 생성할 수 있다. )
이것은 그 자체로써 에러가 아니다. 그러나 테이블을 덤프하고 그것을 복구하거나 또는 테이블에서 ALTER TABLE을 하
기로 결정한다면, 트러블을 일으킬 수 있다. 이런 경우, AUTO_INCREMENT 컬럼은 중복-키 에러와 같은 문제를 야기
하는 AUTO_INCREMENT 컬럼 규칙에 따라 값을 변경한다.
제목검색
13.5. 데이터베이스 관리문 CHECKSUM TABLE tbl_name [, tbl_name] ... [ QUICK | EXTENDED ]
QUICK 이나 EXTENDED 모두 지정되지 않아 테이블 스토리지 엔진이 지원되지 않고 다른 방법으로 테이블이 스캔되면, MySQL
은 유효한 검사합계를 리턴한다.
존재하지 않는 테이블의 경우, CHECKSUM TABLE 은 NULL 을 리턴한다. 이것은 MySQL 5.0.3 부터 경고하고 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=5&scate=2&idx=17472006-08-08 오후 6:20:29
:::MySQL Korea:::
제목검색
13.5. 데이터베이스 관리문 OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
대체로 셋업에는, OPTIMIZE TABLE이 전혀 필요하지 않다. 비록 가변길이 로우로 업데이트를 많이 한다고 하더라도, 일주일이
나 한 달에 한 번 이상이 일정한 테이블에서만 할 필요는 없다.
BDB 테이블의 경우, OPTIMIZE TABLE 는 ANALYZE TABLE로 표시된다. 13.5.2.1, “ANALYZE TABLE Syntax”장을
참조하라.
InnoDB 테이블의 경우, OPTIMIZE TABLE 은 ALTER TABLE로 표시된다. 이것은 인덱스 통계와 연결된 인덱스에서 사용되
지 않는 공간을 업데이트하여, 테이블을 개조한다.
--skip-new 또는 --safe-mode 옵션으로 mysqld를 시작함으로써 OPTIMIZE TABLE 을 다른 스토리지 엔진에서 작용하게
만들 수 있다. 이런 경우, OPTIMIZE TABLE 은 ALTER TABLE로 표시된다.
Column Value
Table 테이블 이름
Op 항상 optimize
Msg_text 메시지
임의의 NO_WRITE_TO_BINLOG 키워드(또는 그것의 알리아스 LOCAL) 를 사용하지 않는다면, OPTIMIZE TABLE 문은 바이
너리 로그로 씌여 있다. 그래서 MySQL 서버에서 리플리케이션 마스터로 사용하는 OPTIMIZE TABLE 문은 리플리케이션 슬레
이브에서 디폴트로 복제될 것이다.
제목검색
일반적으로, 이 문을 실행할 필요가 없다 그러나, 장애가 발생하면, REPAIR TABLE이 MyISAM테이블로부터 모든 데이터를 되
돌린다. 만약 테이블이 자주 오류를 일으킨다면, 그것의 원인을 찾아 REPAIR TABLE을 이용할 필요가 없도록 해야 한다. A.4.2,
“MySQL 시스템 고장시 대처법”, 장과 14.1.4, “MyISAM 테이블 문제들”장을 참조하라.
주의: REPAIR TABLE 실행 중 서버가 멈춘다면, 우선 서버를 재시작한 후, 어떤 작동을 하기 전에 즉시 다른 REPAIR TABLE문
을 실행한다. (백업하고 새로 시작하는 것이 언제나 가장 좋다.) 최악의 경우, 데이터파일에 관한 정보없이 새로운 인덱스 파일을
만들어야 한다. 그리고 나서 해야 할 일은 데이터파일을 중복해서 쓰는 것이다. 그러나 이런 일은 거의 일어나지 않는다.
Column Value
Table 테이블 이름
Op 항상 repair
Msg_text 메시지
REPAIR TABLE 문은 각 복구된 테이블에 관한 정보의 로우가 많이 생성된다. 마지막 로우는 status의 Msg_type 값을 갖으며,
Msg_test는 일반적으로 OK이다. OK되지 않은 경우, myisamchk --safe-recover 로 테이블을 복구해 본다. (REPAIR
TABLE 은 아직 myisamchk 의 모든 옵션에서 실행되지 않는다.) myisamchk --safe-recover로, --max-record-length
와 같이, REPAIR TABLE이 지원하는 옵션을 사용할 수 있다.
QUICK 이 주어지면, REPAIR TABLE 인덱스 트리만 복구하려고 시도한다. 이런 복구 타입은 myisamchk --recover --
quick 로 하던 것과 같다.
EXTENDED를 사용한다면, MysQL은 인덱스를 한번에 하나씩 생성하지 않고 로우별로 차례로 생성한다. 이런 복구 타입은
myisamchk --safe-recover 로 하던 것과 같다.
REPAIR TABLE 의 경우 USE_FRM 모드를 사용할 수 있다. .MYI 인덱스 파일이 빠지거나 또는 그것의 헤더가 손상되었다면, 이
것을 이용하라. 이런 모드에서, MySQL은 .frm 파일로부터 정보를 사용하는 .MYI 파일을 재 생성한다. 이런 종류의 복구는
myisamchk 로 할 수 없다. 주의: 이 모드는 보통의 REPAIR 모드가 사용되지 못할 경우에만 사용하라. .MYI 헤더는 REPAIR ...
USE_FRM 에 묻혀있는 중요한 테이블 메타데이터를 포함하고 있다. (특히, 현재 AUTO_INCREMENT 값과 Delete link) 이런
정보가 .MYI 파일에 저장되어 있기 때문에, 테이블이 압축되었다면, USE_FRM을 사용하지 말라.
임의의 NO_WRITE_TO_BINLOG 키워드(또는 그것의 알리아스 LOCAL)를 사용하지 않는다면, REPAIR TABLE 문은 바이너
리 로그로 쓰여진다. 그래서 MySQL 서버에서 리플리케이션 마스터로 사용하는 REPAIR TABLE 문은 리플리케이션 슬레이브에
서 디폴트로 복제될 것이다.
제목검색
13.5. 데이터베이스 관리문 RESTORE TABLE tbl_name [, tbl_name] ... FROM '/path/to/backup/directory'
13.5.2.7 RESTORE TABLE 파일을 개조하기 위해 그것을 사용한다. 인덱스 개조가 필요하기 때문에 복구하는 것이 백업하는 것보다 오래 걸린다. 테이블에 인
덱스가 많을수록 시간은 더 길어진다.
Column Value
Table 테이블 이름
Op 항상 restore
Msg_text 메시지
제목검색
SET 문은 서버혹은 여러분의 client의 동작에 영향을 주는 다른 종류의 변수들에 값들을 할당하는 문장이다. MySQL의 이전 버전
에서는 SET OPTION을 사용했으나 이 문은 OPTION없이 SET만을 사용하도록 변경되었다.
시스템 변수들은 5.2.3장 “Using System Variables”에서 설명 되는 바와 같이 서버의 시작 시점에 설정될 수 있다.
● SET PASSWORD 는 사용자 계정에 대한 비밀 번호를 할당한다. 13.5.1.6장 “SET PASSWORD”를 참조하라
● SET TRANSACTION ISOLATION LEVEL 은 트랜잭션 처리에 대한 격리 레벨을 설정한다. 13.4.6장 “SET
TRANSACATION”을 참조하라.
● SET은 로컬 루틴 변수들에 값을 할당하기 위해 저장 루틴 안에서 사용된다. 17.2.7.2장 “Variables SET 문”을 참조하
라.
한 SET 문은 콤마로 분리되는 다중 변수 할당을 포함할 수 있다. 여러분이 몇가지의 시스템 변수를 할당하면 그 문안의 가장 빈번
한GLOBAL혹은 SESSION 수식어들이 수식어가 명시되지 않은 다음 변수들에 사용될 수 있다.
예:
SET sort_buffer_size=10000;
SET @@local.sort_buffer_size=10000;
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
여러분이 SET으로 하나의 시스템 변수에 값을 할당할 때, 그 값에 접미어(suffix)를 쓸 수 없다.(이것은 시작 옵션에서 가능한 기
능이다). 그러나 그 값은 다음과 같은 형태의 표현을 가질 수 있다:
세션 시스템 변수를 변경하면, 그 값은 여러분의 세션이 끝나거나 여러분이 그 값을 다른 값으로 변경 할때까지 유지된다. 그 변경
은 다른 client들에게는 보여지지 않는다.
global 시스템 변수를 변경하면, 그 값은 서버가 재 시작 될 때까지 기억되어 새로운 연결에 대해서 사용된다. (global 시스템 변
수의 설정을 영구적으로 만들기 위해서는 옵션 파일 안에 설정해 놓아야 한다.) 그 변경은 global변수에 접근하는 어느 client에게
도 보여진다. 그러나, 그 변경은 이후에 연결하는 클라이언트들에 대해서만 영향을 미친다. global변수 변경은 현재 연경되어 있는
client들을 위한 세션 변수에는 영향을 미치지 않는다. (SET GLOBAL 문을 사용하는 clicent 변수라 할지라도)
잘못된 사용을 방지하기 위해 MySQL은 여러분이 SET SESSION과 사용될수 있는 변수에 SET GLOBAL을 사용하거나 global
변수를 설정할 때 GLOBAL(혹은 @@global)을 명시하지 않으면 에러를 발생한다.
컴파일된 MySQL 기본 값에 GLOBAL 값이나 SESSION 변수에 GLOBAL변수를 설정하기 위해서는 DEFAULT 키워드를 사용하
라. 예를 들면 다음 두 문장은 max_join_siz의 세션 값을 global 변수로 설정한다.
SET max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;
모든 시스템 변수가 DEFAULT가 될수는 없다. 이런 경우, DEFAULT 의 사용은 에러를 발생 시킨다.
여러분은 @@-수식어들중 하나를 사용하여 표현들에서 특정global혹은 session 시스템 변수들의 값을 참조 할 수 있다. 예를 들
면 여러분은 아래와같이 SELECT문에서 값들을 가져올 수 있다:
시스템 변수이름과 값들을 display하기 위해서 SHOW VARIABLES문을 사용하라. ( 13.5.4.24, 장“SHOW VARIABLES ”을
참조하라.)
다음 리스트는 5.2.2장 “Server System Variables”에서 보여지는 시스템 변수들을 리스트에서 설명되지 않거나 비 표준 구문
을 가진 옵션들을 설명한다. 여기에서 설명되는 옵션들이 SHOW VARIABLES에 의해 display되지는 않지만 여러분은 SELECT
를 사용하여 그 값들을 얻을수 있다.(CHARACTER SET 과 SET NAMES는 제외)
예를 들면:
● AUTOCOMMIT = {0 | 1}
Autocomint 모드로 설정한다. 1로 설정하면 한 테이블에 대한 모든 변경들이 즉시 영향을 미친다. 0으로 설정하면 한 트
랜잭션을 받아들이기 위해 COMMIT을 사용하거나 그것을 취소하기 위해서 ROLLBACK을 사용해야 한다. 기본적으로
client 연결은 AUTOCOMMIT을 1로 하여 시작한다. 여러분이 AUTOCOMMIT을 0에서 1로 변경하면, MySQL은 트랜
잭션에 대한 자동 COMMIT을 수행한다. 트랜잭션을 시작하기 위한 다른 방법은 START TRANSACTION이나 BEGIN
문을 사용하는 것이다. 13.4.1 장 “START TRANSACTION, COMMIT그리고 ROLLBACK문”을 참조하라.
● BIG_TABLES = {0 | 1}
1로 설정하면 모든 임시 테이블들은 메모리가 아닌 디스크에 저장된다. 그러나 에러문인 The table tbl_name is full은
큰 임시 테이블을 필요로하는 SELECT 연산에 대해서는 일어나지 않는다. 새로운 연결에 대한 기본값은 0(메모리 임시
테이블)이다. 보통, In-메모리 테이블들은 필요할 경우 disk 기반 테이블들로 자동으로 변환되기 때문에, 여러분은 이 값
을 설정할 필요가 없다. (Note: 이 변수는 SQL_BIG_TABLES로 명명되었다.)
● FOREIGN_KEY_CHECKS = {0 | 1}
● IDENTITY = value
이 변수는 LAST_INSERT_ID 변수와 동의어 이다. 이것은 다른 데이터베이스 시스템과의 호환성을 위해 존재 한다. 여러
분은 SELECT @@IDENTITY를 사용하여 이 값을 읽고 SET IDENTITY를 이용하여 값을 설정 할 수 있다.
● INSERT_ID = value
● LAST_INSERT_ID = value
● ONE_SHOT
이 옵션은 하나의 변수가 아닌 수식어(modifier)이다. 이것은 문자셋, 대조(collation) 그리고 타임존(time zone)을 설정
하는 변수들의 효과에 영향을 주는 데 사용될 수 있다. ONE_SHOT은 주로 복제 목적으로 사용된다: mysqlbinlog는
rollforward시에 반영하기 위해 문자셋(character set), 대조(collation) 그리고 타임존(time zone)의 값들을 일시적으
로 변경하기 위해SET ONE_SHOT을 사용한다. ONE_SHOT은 MySQL 5.0에서부터 가능하다.
여러분은 허락된 변수들 외에 다른데서 ONE_SHOT을 사용할 수 없다. 만약 이를 시도할 경우 아래와 같은 에러를 얻게
된다:
예:
● SQL_AUTO_IS_NULL = {0 | 1}
1(기본 값)로 설정하면 여러분은 다음 문을 사용하여 AUTO_INCREMENT 컬럼을 포함하고 있는 테이블의 최근 삽입된
레코드를 찾을 수 있다:
WHERE auto_increment_column IS NULL
이것은 Access와 같은 몇몇 ODBC프로그램들에 의해 사용된다.
● SQL_BIG_SELECTS = {0 | 1}
● SQL_BUFFER_RESULT = {0 | 1}
● SQL_LOG_BIN = {0 | 1}
0으로 설정되면 client를 위한 바이너리 로그에 로그 정보가 남지 않느다. 클라이언트는 이 옵션을 설정하기 위해서
SUPER 권한을 가져야 한다. 기본 값은 0이다.
● SQL_LOG_OFF = {0 | 1}
1로 설정하면 이 클라이언트에 대해 일반적인 쿼리에 대한 로그가 남지 않는다. 이 옵션을 설정하기 위해서는 client가
SUPER권한을 가져야 한다. 기본 값은 0이다.
● SQL_LOG_UPDATE = {0 | 1}
● SQL_NOTES = {0 | 1}
1(기본값)으로 설정하면, Note레벨의 경고가 기록된다. 0으로 설정하면 Note 경고들은 은폐(suppressed)된다.
Mysqldump는 이 값을 0으로 하여 dump 파일의 재로드가 재로드 연산의 무결성에 영향을 주지 않는 이벤트들에 대한 경
고를 생성하지 않도록 하기 위해 output을 포함한다. SQL_NOTES 는 MySQL 5.0.3에서 추가 되었다.
● SQL_QUOTE_SHOW_CREATE = {0 | 1}
1(기본 값)으로 설정하면 서버는 SHOW CREATE TABLE 와SHOW CREATE DATABASE 문들에 대한 지시자들을
인용한다. 0으로 설정하면 인용은 disable상태가 된다. 이 옵션은 기본적으로 enable되어 인용이 필요한 지시자들을 위
해 복제를 한다. 13.5.4.6, 장“SHOW CREATE TABLE ”과 13.5.4.4장 “SHOW CREATE DATABASE ”을 참조
하라.
● SQL_SAFE_UPDATES = {0 | 1}
1로 설정하면 MySQL은 WHER절이나 LIMIT절에서 key를 사용하지 않는 UPDATE 혹은 DELETE문의 실행을 중지한
다. 이것은 많은 수의 레코드를 변경하거나 삭제 할 경우 키들이 사용되지 않는 UPDATE 혹은 DELETE문을 catch하도
록 한다. 기본값은 0이다.
● SQL_WARNINGS = {0 | 1}
이 변수는 단일 레코드 INSERT문이 경고가 발생할 경우 정보 문자열을 생성할 것인지를 조절한다. 기본 값은 0이다. 정
보 문자열을 생성하기 위해서는 값을 1로 설정한다.
이 클라이언트에 대한 시간을 설정한다. 이것은 여러분이 레코드들을 복원하기 위해 바이너리 로그를 사용하는 경우 원래
timestamp를 얻는데 사용된다. Timestamp_value는 MySQL의 timestamp가 아닌Unix 에서의 timestamp이어야 한
다.
SET TIMESTAMP 은 SYSDATE()가 아닌 NOW()에 의해 리턴되는 값에 영향을 준다. 이는 바이너리 로그에서
timestamp 설정들이 SYSDATE()호출에서 영향을 미치지 않는 것을 의미한다. 서버가SYSDATE()가 NOW()에 대한
별칭이 되도록 하는 –sysdate-is-now 옵션과 함께 시작될 수 있다. 이 경우 SET TIMESTAMP는 두 함수에 영향을
준다.
● UNIQUE_CHECKS = {0 | 1}
제목검색
13.5.4. SHOW
상위메뉴리스트 ◆
13.5.4.2 SHOW COLLATION 13.5.4.5. SHOW CREATE PROCEDURE 와 SHOW CREATE FUNCTION
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW CHARACTER SET [LIKE 'pattern']
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW CHARACTER SET 문은 모든 사용할 수 있는 캐틱터 셋을 보여준다. 그것은 어떤 캐릭터 셋이 이름과 매치되는지 보여주
는 임의의 LIKE 절을 취한다. 예를 들어:
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
mysql> SHOW CHARACTER SET LIKE 'latin%';
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE +---------+-----------------------------+-------------------+--------+
13.5.4.5 SHOW CREATE PROCEDURE 와
SHOW CREATE FUNCTION | Charset | Description | Default collation | Maxlen |
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW +---------+-----------------------------+-------------------+--------+
13.5.4.19 SHOW PROCESSLIST Maxlen 컬럼은 하나의 캐릭터를 저장하기 위해 요구되는 최대 바이트 수를 보여준다.
제목검색
13.5. 데이터베이스 관리문 SHOW COLLATION의 출력은 모든 사용가능한 캐릭터셋을 포함한다. 이것은 대조 이름이 일치하도록 하는 pattern 을 보여주는 임의의
13.5.4.22 SHOW TABLES Sortlen 은 캐릭터 셋에서 나타내는 일련의 스트링에 요구되는 메모리 양과 관계가 있다.
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW COLUMNS 주어진 테이블에 있는 컬럼에 대한 정보를 보여준다. 이것은 MySQL5.0.1버전의 뷰에서 작동한다
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW CREATE {DATABASE | SCHEMA} db_name
13.5. 데이터베이스 관리문
13.5.4 SHOW 주어진 데이터베이스를 생성하는 CREATE DATABASE 문을 보라. SHOW CREATE SCHEMA 는 MySQL 5.0.2에서
SHOW CREATE DATABASE 와 동일하다.
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
mysql> SHOW CREATE DATABASE test₩G
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE *************************** 1. row ***************************
13.5.4.5 SHOW CREATE PROCEDURE 와
SHOW CREATE FUNCTION Database: test
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW Create Database: CREATE DATABASE `test`
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW CREATE {PROCEDURE | FUNCTION} sp_name
13.5. 데이터베이스 관리문
13.5.4 SHOW 이 문은 MySQL 확장기능이다. SHOW CREATE TABLE과 비슷하다면, 그것은 명명된 루틴을 재 생성하기 위해 사용될 수 있는
정확한 스트링으로 리턴한다
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
mysql> SHOW CREATE FUNCTION test.hello₩G
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE *************************** 1. row ***************************
13.5.4.5 SHOW CREATE PROCEDURE 와
SHOW CREATE FUNCTION Function: hello
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW sql_mode:
제목검색
13.5.4 SHOW 주어진 테이블을 생성하는 CREATE TABLE 문을 보라. MySQL 5.0.1에서, 이 문은 뷰와 함께 작동한다.
제목검색
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW {DATABASES | SCHEMAS} [LIKE 'pattern']
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW DATABASES 는 MySQL 서버 호스트에서 데이터베이스를 열거한다. SHOW SCHEMAS 는 MySQL 5.0.2에서
SHOW DATABASES 와 동일하다.
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
글로벌SHOW DATABASES 권한을 가지고 있지 않다면, 몇몇 권한을 가지고 있는 저런 데이터베이스만 볼 수 있다.
13.5.4.3 SHOW COLUMNS
mysqlshow 명령을 사용하여 이 목록을 얻을 수 있다.
13.5.4.4 SHOW CREATE DATABASE
13.5.4.5 SHOW CREATE PROCEDURE 와 SHOW 서버가 --skip-show-database 옵션으로 시작되었다면, SHOW DATABASES권한을 가지지 않고서는 절대로 이 문을
CREATE FUNCTION
사용할 수 없다.
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW
13.5.4.8 SHOW DATABASES
13.5.4.9 SHOW ENGINE
13.5.4.10 SHOW ENGINES
13.5.4.11 SHOW ERRORS
13.5.4.12 SHOW GRANTS
13.5.4.13 SHOW INDEX
13.5.4.14 SHOW INNODB STATUS
13.5.4.15 SHOW LOGS
13.5.4.16 SHOW OPEN TABLES
13.5.4.17 SHOW PRIVILEGES
13.5.4.18 SHOW PROCEDURE STATUS 과 SHOW
FUNCTION STATUS
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW ENGINE engine_name {LOGS | STATUS }
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW ENGINE은 로그와 스토리지 엔진에 관한 상태 정보를 보여준다. 다음 문이 현재 지원되고 있다.:
제목검색
13.5.4 SHOW SHOW ENGINES 서버의 스토리지 엔진에 관한 상태 정보를 보여준다. 이것은 특별히 스토리지 엔진이 지원되는지 체크하고, 디
폴트 엔진이 무엇인지 보는데 사용된다. SHOW TABLE TYPES 는 반대되는 동의어이다.
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
mysql> SHOW ENGINES₩G
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE *************************** 1. row ***************************
13.5.4.5 SHOW CREATE PROCEDURE 와
SHOW CREATE FUNCTION Engine: MyISAM
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW Support: DEFAULT
Support: YES
Engine: MRG_MYISAM
Support: YES
Engine: ISAM
Support: NO
Engine: MRG_ISAM
Support: NO
Engine: InnoDB
Support: YES
Engine: INNOBASE
Support: YES
Engine: BDB
Support: YES
Engine: BERKELEYDB
Support: YES
Engine: NDBCLUSTER
Support: NO
Engine: NDB
Support: NO
Engine: EXAMPLE
Support: NO
Engine: ARCHIVE
Support: YES
Engine: CSV
Support: NO
Engine: FEDERATED
Support: YES
Engine: BLACKHOLE
Support: YES
Support 값은 특별한 스토리지 엔진이 지원되는지, 그리고 어떤 것이 디폴트 엔진인지 보여준다. 예를 들어, 만약 서버가 --
default-table-type=InnoDB 옵션으로 시작된다면, InnoDB로우의 Support 값은 DEFAULT 값을 갖는다. 4, 스토리지엔진과
테이블 타입. 장을 참조하라.
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW ERRORS [LIMIT [offset,] row_count]
13.5. 데이터베이스 관리문
제목검색
13.5.4 SHOW 이 문은 GRANT문 또는 MySQL 사용자 계정에 주어진 권한을 복사하기 위해 비롯된 문을 열거한다. 계정은 GRANT문과 같은 포
맷으로 명명된다; 예를들어, 'jeffrey'@'localhost'. 사용자와 계정이름의 호스트 부분은 User와 계정의 user 테이블 로우의 Host 컬
13.5.4.1 SHOW CHARACTER SET
럼 값에 상응한다.
13.5.4.2 SHOW COLLATION
13.5.4.3 SHOW COLUMNS
mysql> SHOW GRANTS FOR 'root'@'localhost';
13.5.4.4 SHOW CREATE DATABASE
13.5.4.5 SHOW CREATE PROCEDURE 와 +---------------------------------------------------------------------+
SHOW CREATE FUNCTION
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW INDEX FROM tbl_name [FROM db_name]
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW INDEX 는 테이블 인덱스 정보를 리턴한다. 포맷은 ODBD SQLStatistics 라 불리는 것과 비슷하다.
● Sub_part
컬럼이 부분적으로 인덱스되어 있다면, 인덱스된 캐릭터의 숫자. 모든 컬럼이 인덱스되어 있다면, NULL
● Packed
● Null
컬럼이 NULL을 포함하고 있으면 YES. 그렇지 않으면, MySQL 5.0.3과 그 이전버전에서 컬럼은 NO를 포함하
고 있다.
● Index_type
● Comment
다양한 주의사항.
SHOW KEYS 는SHOW INDEX와 같다. mysqlshow -k db_name tbl_name 명령으로 테이블의 인덱스를 열거할 수 있
다.
제목검색
13.5.4 SHOW MySQL 5.0에서, 이것은 SHOW ENGINE INNODB STATUS에 대한 비추천 동의어이다. 13.5.4.9,
“SHOW ENGINE ”장을 참조하라..
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE
13.5.4.5 SHOW CREATE PROCEDURE 와 SHOW CREATE
FUNCTION
제목검색
13.5.4 SHOW MySQL 5.0에서, 이것은 SHOW ENGINE BDB LOGS에 대한 비추천 동의어이다. 13.5.4.9,
“SHOW ENGINE ”장을 참조하라..
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE
13.5.4.5 SHOW CREATE PROCEDURE 와 SHOW CREATE FUNCTION
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW
13.5.4.8 SHOW DATABASES
13.5.4.9 SHOW ENGINE
13.5.4.10 SHOW ENGINES
13.5.4.11 SHOW ERRORS
13.5.4.12 SHOW GRANTS
13.5.4.13 SHOW INDEX
13.5.4.14 SHOW INNODB STATUS
13.5.4.15 SHOW LOGS
13.5.4.16 SHOW OPEN TABLES
13.5.4.17 SHOW PRIVILEGES
13.5.4.18 SHOW PROCEDURE STATUS 과 SHOW FUNCTION STATUS
13.5.4.19 SHOW PROCESSLIST
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW OPEN TABLES [FROM db_name] [LIKE 'pattern']
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW OPEN TABLES 은 테이블 캐쉬(Cache)에 현재 오픈되어 있는 non-TEMPORARY 테이블을 열거한다. 7.4.8,
“MySQL은 테이블을 어떻게 열고 닫는가 ”장을 참조하라.
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
SHOW OPEN TABLES 은 다음 필드를 리턴한다:
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE ● Database
13.5.4.5 SHOW CREATE PROCEDURE 와 SHOW
CREATE FUNCTION 테이블을 포함한 데이터베이스.
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW ● Table
제목검색
13.5.4 SHOW SHOW PRIVILEGES 는 MySQl 서버가 지원하는 시스템 권한 리스트를 보여준다. 정확한 권한 리스트는 서버 버전에 따라 다
르다.
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
mysql> SHOW PRIVILEGES₩G
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE *************************** 1. row ***************************
13.5.4.5 SHOW CREATE PROCEDURE 와
SHOW CREATE FUNCTION Privilege: Alter
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW Context: Tables
Context: Functions,Procedures
Context: Databases
...
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']
13.5. 데이터베이스 관리문
13.5.4 SHOW 이 문은 MySQL 확장이다. 데이터베이스, 이름 , 타입, 생성자, 생성, 날짜변경 등과 같은 루틴들의 특성을 리턴한다. 패턴이 지
정되지 않았다면, 저장된 모든 프로시져 또는 기능에 관한 정보는 사용하는 문에 따라 열거된다.
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
mysql> SHOW FUNCTION STATUS LIKE 'hello'₩G
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE *************************** 1. row ***************************
13.5.4.5 SHOW CREATE PROCEDURE 와
SHOW CREATE FUNCTION Db: test
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW Name: hello
13.5.4.19 SHOW PROCESSLIST INFORMATION_SCHEMA에서ROUTINES 테이블로부터 저장된 루틴에 관한 정보를 얻을 수 있다. 20.14,
제목검색
13.5.4 SHOW SHOW PROCESSLIST 는 어떤 스레드가 작동하는지 보여준다. mysqladmin processlist 명령을 사용하는 정보를 얻을 수 있다.
SUPER 권한을 가졌다면, 모든 스레드를 볼 수 있다. 그렇지 않으면, 오로지 자신의 스레드만 볼 수 있다.(즉, 사용 중인 MySQL
13.5.4.1 SHOW CHARACTER SET
계정과 연계된 스레드). 13.5.5.3, “KILL ”장을 참조하라. FULL 키워드를 사용하지 않는다면, 각 문의 처음 100개 문자만 Info
13.5.4.2 SHOW COLLATION
필드에 보인다.
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE
13.5.4.5 SHOW CREATE PROCEDURE 와
SHOW CREATE FUNCTION
“too many connections” 에러 메시지를 받아, 실행중인 것을 찾으려고 할 때, 이 문은 매우 유용하다. MySQL은 관리자가 항
13.5.4.6 SHOW CREATE TABLE 상 시스템에 접속해 점검할 수 있도록 SUPER권한을 가지는 계정에 의해 사용되는 하나의 별도 커넥션을 남겨둔다(이 권한을 모
13.5.4.7 SHOW CREATE VIEW 든 사용자에게 주지 않는다고 가정한다면).
13.5.4.8 SHOW DATABASES
13.5.4.9 SHOW ENGINE SHOW PROCESSLIST 의 아웃풋은 다음과 같다:
Id: 2
Host:
db: NULL
Command: Connect
Time: 1004
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
Id: 3112
User: replikator
Host: artemis:2204
db: NULL
Time: 2144
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
Id: 3113
User: replikator
Host: iconnect2:45781
db: NULL
Time: 2086
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
Id: 3123
User: stefan
Host: localhost
db: apollon
Command: Query
Time: 0
State: NULL
● Id
접속 식별자.
● User
이 문을 사용하는 MySQL 사용자. 사용자가 system user라면, 내부적으로업무를 조정하기 위해 서버에 의해 파생된
non-클라이언트 스레드에 적용된다. 이것은 슬레이브 리플리케이션 또는 지연-로우 조절에 사용되는 I/O 또는 SQL 스
레드일 수 있다. system user의 경우, Host 컬럼에 정해진 호스트는 없다.
● Host
● db
● Command
● Time
● State
다음 중 하나가 될 수 있는 실행, 경우, 상태: After create, Analyzing, Changing master, Checking master version,
Checking table, Connecting to master, Copying to group table, Copying to tmp table, Creating delayed handler,
Creating index, Creating sort index, Creating table from master dump, Creating tmp table, Execution of
init_command, FULLTEXT initialization, Finished reading one binlog; switching to next binlog, Flushing tables,
Killed, Killing slave, Locked, Making temp file , Opening master dump table, Opening table, Opening tables,
Processing request, Purging old relay logs, Queueing master event to the relay log, Reading event from the
relay log, Reading from net, Reading master dump table data, Rebuilding the index on master dump table,
Reconnecting after a failed binlog dump request, Reconnecting after a failed master event read, Registering
slave on master, Removing duplicates, Reopen tables, Repair by sorting, Repair done, Repair with keycache,
Requesting binlog dump, Rolling back, Saving state, Searching rows for update, Sending binlog event to slave,
Sending data, Sorting for group, Sorting for order, Sorting index, Sorting result, System lock, Table lock,
Thread initialized, Updating, User lock, Waiting for INSERT, Waiting for master to send event, Waiting for
master update, Waiting for slave mutex on exit, Waiting for table, Waiting for tables, Waiting for the next
event in relay log, Waiting on cond, Waiting to finalize termination, Waiting to reconnect after a failed binlog
dump request, Waiting to reconnect after a failed master event read, Writing to net, allocating local table,
cleaning up, closing tables, converting HEAP to MyISAM, copy to tmp table, creating table, deleting from main
table, deleting from reference tables, discard_or_import_tablespace, end, freeing items, got handler lock, got
old table, info, init, insert, logging slow query, login, preparing, purging old relay logs, query end, removing
tmp table, rename, rename result table, reschedule, setup, starting slave, statistics, storing row into queue,
unauthenticated user, update, updating, updating main table, updating reference tables, upgrading lock, waiting
for delay_list, waiting for handler insert, waiting for handler lock, waiting for handler open
가장 일반적인 State 값은 이 장의 다른 곳에 서술되어 있다. 다른 State값은 대부분 서버에서 버그를 찾는 데에만 유용하
다. 리플리케이션 서버를 위한 프로세스 상태에 관한 추가적인 정보는 6.3, “Replication Implementation Details”장
을 참조하라.
SHOW PROCESSLIST 문의 경우, State 값은 NULL이다.
● Info
● Checking table
● Closing tables
스레드가 변경된 테이블 데이터를 디스크로 쏟아내고 사용된 테이블을 닫는 것을 의미한다. 이것은 빠른 오퍼레이션이다.
만약 그렇지 않다면, 풀(full) 디스크를 가지고 있지 않은지 그리고 디스크가 너무 과중하게 사용되지는 않는지 체크해야
한다.
● Connect Out
서버가 디스크에 있는 임시 테이블로 복사한다. 임시 결과 세트는 tmp_table_size 보다 크고, 스레드는 메모리를 절약하
기 위해서 인-메모리에서 디스크 기반 포맷으로 임시 테이블을 변경시킨다.
서버는 복합테이블 삭제의 첫 번째 부분을 실행한다. 그것은 반드시 첫 번째 테이블부터 삭제하고, 다른 (레퍼런스) 테이
블로부터 삭제를 실행할 필드와 오프셋을 절약한다.
● Flushing tables
● FULLTEXT initialization
● Killed
누군가 KILL 문을 스레드에 보내면 kill 플래그를 체크하여 다음에 중단해야 한다. 플래그는 MySQL의 각각의 메이저 루
프에서 점검된다. 그러나 몇몇의 경우, 스레드가 멈추는데 짧은 시간이 걸리곤 한다. 만약 스레드가 몇몇 다른 스레드에 의
해 잠겨있다면, kill은 다른 스레드가 잠금을 해제하자마자 효력을 나타낸다.
● Locked
● Sending data
● Opening tables
스레드는 테이블을 열려고 한다. 무언가 오픈을 방해하지 않는다면, 이것은 매우 빠른 프로시져이다. 예를 들어, ALTER
TABLE 또는 LOCK TABLE 문은 문이 끝날 때까지 테이블 오픈을 방해할 수 있다.
● Removing duplicates
● Reopen table
스레드는 테이블을 잠갔다. 그러나 잠근 이후에 뒤에 숨은 테이블 구성이 변경되었다는 것을 인지한다. 잠금을 해제하고
테이블을 종료하며 그것을 다시 오픈하려 한다.
● Repair by sorting
스레드는 로우를 업데이트 하기 전에 모든 부합하는 로우를 찾기 위해 첫번째 단계를 행한다. 만약 UPDATE가 관련된 로
우를 찾는데 사용된 인덱스를 변경시킨다면, 이것을 실행해야 한다.
● Sleeping
● statistics
● System lock
스레드는 테이블의 외부 시스템 잠금을 기다린다. 같은 테이블에 액세스하는복합 mysqld 서버를 사용하지 않는다면, --
skip-external-locking 옵션을 이용해 시스템 잠금 기능을 억제할 수 있다.
● unauthenticated user
● Upgrading lock
● Updating
서버는 복합-테이블 업데이트의 첫 번째 부분을 실행한다. 그것은 오로지첫번째 테이블만 업데이트 하며, 다른 (레퍼런
스) 테이블을 업데이트하는데 사용될 필드와 오프셋을 절약한다.
서버는 복합-테이블 업데이트의 두 번째 부분을 실행하고, 다른 테이블로부터 부합하는 로우를 업데이트 한다.
● User Lock
스레드는 테이블의 기초가 되는 체계가 변경되었다는 통보를 받았고, 새로운체계를 만들기 위해 테이블을 다시 오픈할 필
요가 있다. 그러나 테이블을 다시 열기 위해서, 모든 다른 스레드가 본 건에 대해 테이블을 종료할 때까지 기다려야 한다.
● Writing to net
대부분은 상태는 빠른 실행에 부합한다. 만약 한 스레드가 이런 상태로 오래 대기 중이라면, 조사할 필요가 있는 문제가 있을 수 있
다.
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern']
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW STATUS 는 서버 상태에 관한 정보를 제공한다. 이 정보로 mysqladmin extended-status 명령을 사용할 수 있다.
| Open_tables |1 |
| Open_files |2 |
| Open_streams |0 |
| Opened_tables | 44600 |
| Questions | 2026873 |
...
| Table_locks_immediate | 1920382 |
| Table_locks_waited |0 |
| Threads_cached |0 |
| Threads_created | 30022 |
| Threads_connected |1 |
| Threads_running |1 |
| Uptime | 80380 |
+--------------------------+------------+
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| Key_blocks_used | 14955 |
| Key_read_requests | 96854827 |
| Key_reads | 162040 |
| Key_write_requests | 7589728 |
| Key_writes | 3813196 |
+--------------------+----------+
GLOBAL 과 SESSION 옵션은 MySQL 5.0.2에서 새로워졌다. GLOBAL 변경자로 , SHOW STATU는 MySQL에 연결된 모든
것의 상태 값을 보여준다. SESSION으로. 현재 연결의 상태 값을 보여준다. 만약 현재 변경자가 없다면, SESSION 이 디폴트이
다. LOCAL은 SESSION의 동의어이다.
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW TABLE STATUS 는SHOW TABLE와 같이 작동하지만, 각 테이블에 대한 많은 정보를 제공한다. mysqlshow --
status db_name 명령을 사용하는 이 리스트를 얻을 수 있다.
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
MySQL 5.0.1에서, 이 문은 뷰의 정보를 보여준다.
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE SHOW TABLE STATUS 는 다음 필드를 리턴한다:
13.5.4.5 SHOW CREATE PROCEDURE 와 SHOW
CREATE FUNCTION ● Name
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW 테이블 이름
● Avg_row_length
평균 로우 길이.
● Data_length
● Max_data_length
● Index_length
● Data_free
● Auto_increment
그 다음 AUTO_INCREMENT 값.
● Create_time
테이블이 생성되었을 때.
● Update_time
데이터 파일이 마지막으로 업데이트된 때. 몇몇 스토리지 엔진의 경우, 이 값은 NULL이다. 예를 들어, InnoDB는 테
이블스페이스에 있는 복합 테이블을 저장하고 데이터 파일 타임스탬프는 적용되지 않는다.
● Check_time
● Collation
● Checksum
유요한 검사 합계 값.
● Create_options
● Comment
테이블을 생성할 때 사용하는 코멘트(또는 MySQL이 테이블 정보에 엑세스할 수 없는 이유에 관한 정보)
MEMORY 테이블의 경우, Data_length, Max_data_length, Index_length 값은 할당된 메모리의 실제 합계에 근접한다. 할당
알고리즘은 할당 연산 수를 줄이기 위해 다량으로 메모리를 확보한다.
MySQL 5.0.3부터, NDB Cluster 테이블의 경우, 이 문의 아웃풋은 BLOB 컬럼이 고려되었다는 것을 제외하고는
Avg_row_length 와 Data_length 컬럼에 적당한 값을 보여준다. 덧붙여, 복제 수는 이제 Comment 컬럼에서 볼 수 있다.
(number_of_replicas로써)
뷰의 경우, Name이 뷰 이름을 나타내고, Comment가 view를 말한다는 것을 제외하고 SHOW TABLE STATUS 에 의해 보
여지는 모든 필드는 NULL이다.
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern']
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW TABLES는 주어진 데이터베이스에 non-TEMPORARY 테이블을 기록한다. mysqlshow db_name 명령어를 사용해
서 이 리스트를 얻을 수 있다.
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE MySQL 5.0.1 이전에는, SHOW TABLES의 아웃풋은 테이블 이름의 싱글 컬럼을 포함한다. MySQL 5.0.1부터, 이 문은 데
13.5.4.5 SHOW CREATE PROCEDURE 와 SHOW 이터베이스에 어떤 뷰들을 기록한다. MySQL 5.0.2에서 SHOW FULL TABLES가 두번째 아웃풋 컬럼을 보여주듯이 FULL
CREATE FUNCTION
조정자가 지원된다. 두 번째 컬럼 값은 테이블의 경우 BASE TABLE이고, 뷰의 경우 VIEW이다.
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW
13.5.4.8 SHOW DATABASES
주의: 테이블에 대한 권한이 없다면, 테이블은 SHOW TABLES 또는 mysqlshow db_name 의 아웃풋을 보여주지 않는다.
13.5.4.9 SHOW ENGINE
13.5.4.10 SHOW ENGINES
13.5.4.11 SHOW ERRORS
13.5.4.12 SHOW GRANTS
13.5.4.13 SHOW INDEX
13.5.4.14 SHOW INNODB STATUS
13.5.4.15 SHOW LOGS
13.5.4.16 SHOW OPEN TABLES
13.5.4.17 SHOW PRIVILEGES
13.5.4.18 SHOW PROCEDURE STATUS 과
SHOW FUNCTION STATUS
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW TRIGGERS [FROM db_name] [LIKE expr]
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW TRIGGERS는 현재 MySQL 서버에 한정된 트리거를 기록한다. 이 문은 SUPER 권한을 요구한다. 이것은 MySQL
5.0.10에서 실행된다.
13.5.4.1 SHOW CHARACTER SET
13.5.4.2 SHOW COLLATION
13.5.4.3 SHOW COLUMNS
13.5.4.4 SHOW CREATE DATABASE 18.3.”트리거 사용” 장에 정의된 ins_sum 트리거의 경우, 이 문의 아웃풋은 아래와 같이 보여준다:
13.5.4.5 SHOW CREATE PROCEDURE 와
SHOW CREATE FUNCTION mysql> SHOW TRIGGERS LIKE 'acc%'₩G
13.5.4.6 SHOW CREATE TABLE
13.5.4.7 SHOW CREATE VIEW *************************** 1. row ***************************
● Trigger
트리거 이름.
● Event
● Table
● Statement
● Timing
'BEFORE' 또는 'AFTER' 두 값 중 하나
● Created
● sql_mode
● Definer
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern']
13.5. 데이터베이스 관리문
13.5.4 SHOW SHOW VARIABLES MySQL 시스템 변수 값을 보여준다. mysqladmin variables 명령문을 사용하여 이 정보를 얻을 수 있다.
13.5.4.8 SHOW DATABASES 시간에 변경된다. 5.2.3, “시스템 변수 사용” 장과13.5.3, “SET 신텍스”장을 참조하라.
| basedir |/ |
| bdb_cache_size | 8388600 |
| bdb_home | /var/lib/mysql/ |
| bdb_log_buffer_size | 32768 |
...
| max_connections | 100 |
| max_connect_errors | 10 |
| max_delayed_threads | 20 |
| max_error_count | 64 |
| max_heap_table_size | 16777216 |
| max_join_size | 4294967295 |
| max_relay_log_size |0 |
| max_sort_length | 1024 |
...
| time_zone | SYSTEM |
| timed_mutexes | OFF |
| tmp_table_size | 33554432 |
| tmpdir | |
| transaction_alloc_block_size | 8192 |
| transaction_prealloc_size | 4096 |
| tx_isolation | REPEATABLE-READ |
| updatable_views_with_limit | YES |
| version | 5.0.19-Max |
| version_compile_machine | i686 |
| version_compile_os | pc-linux-gnu |
| wait_timeout | 28800 |
+---------------------------------+-------------------------------------+
LIKE 절로, 문은 패턴에 맞는 변수들만을 보여준다. 명확한 변수 이름을 얻기 위해서, 아래와 같이 LIKE 절을 이용하라.:
와일드카드 문자(캐릭터)는 부합하는 패턴 내에서 어떤 포지션에서든지 사용될 수 있다. 엄격하게 말해서, ‘_’은 싱글 문자(캐릭터)
에 적합한 와일드카드이기 때문에, 글자 그대로 적합한 ‘₩_’로써 그것을 피해야한다. 실제로 이것은 그다지 필요하지 않다.
제목검색
13. SQL 문법(SQL Statement Syntax) SHOW WARNINGS [LIMIT [offset,] row_count]
13.5. 데이터베이스 관리문
13.5.4.6 SHOW CREATE TABLE 메시지 리스트는 테이블을 사용한 각각 새로운 문으로 리셋된다.
13.5.4.7 SHOW CREATE VIEW
13.5.4.8 SHOW DATABASES
13.5.4.9 SHOW ENGINE
SHOW COUNT(*) WARNINGS 문은 에러, 경고, 주의의 총 수를 보여준다. warning_count 변수로 이 숫자를 검색할 수 있다:
13.5.4.10 SHOW ENGINES
13.5.4.11 SHOW ERRORS
SHOW COUNT(*) WARNINGS;
13.5.4.12 SHOW GRANTS
13.5.4.13 SHOW INDEX SELECT @@warning_count;
13.5.4.14 SHOW INNODB STATUS
13.5.4.15 SHOW LOGS 만약 max_error_count 시스템 변수가 낮게 셋팅되어 모든 메시지를 저장할 수 없다면, warning_count 값은 SHOW
13.5.4.16 SHOW OPEN TABLES WARNINGS 에 의해 보여지는 메시지 숫자보다 클 수 있다. 이 섹션에서 보여주는 예는 이것이 어떻게 발생할 수 있는지를 증명한
경고는 LOAD DATA INFILE 와 같은 문과 INSERT, UPDATE, CREATE TABLE, ALTER TABLE과 같은 DML 문에 의해
발생된다.
+-------+------+-------------------------------+
+-------+------+-------------------------------+
+-------+------+-------------------------------+
Level: Warning
Code: 1287
'ENGINE=storage_engine' instead
Level: Warning
Code: 1265
Level: Warning
Code: 1263
Message: Data truncated, NULL supplied to NOT NULL column 'a' at row 2
Level: Warning
Code: 1264
Level: Warning
Code: 1265
저장된 에러, 경고, 주의 메시지 최대 수는 max_error_count 시스템 변수로 컨트롤된다. 디폴트로 이 값은 64이다. 저장하려는 메
시지 숫자를 변경하기 위해서, max_error_count 값을 변경한다. 다음의 예에서, ALTER TABLE 문은 세 개의 경고 메시지를 만
든다. 그러나 max_error_count 가 1로 설정되어 있어, 오직 1개만 저장된다:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_error_count | 64 |
+-----------------+-------+
+-----------------+
| @@warning_count |
+-----------------+
| 3|
+-----------------+
+---------+------+----------------------------------------+
+---------+------+----------------------------------------+
+---------+------+----------------------------------------+
MySQL 5.0.3에서, 기록되지 않은 Note-단계 경고를 일으키기 위해, SQL_NOTES 세션 변수를 0으로 설정할 수 있다.
제목검색
상위메뉴리스트 ◆ 13.5.5. 기타 관리 문
13.5.5.3 KILL
13.5.5.4 LOAD INDEX INTO CACHE
13.5.5.5 RESET
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=5&scate=5&idx=18052006-08-08 오후 6:21:56
:::MySQL Korea:::
제목검색
+---------+--------------------+----------+----------+
+---------+--------------------+----------+----------+
+---------+--------------------+----------+----------+
CACHE INDEX 신텍스는 테이블로부터 특별한 인덱스들만 캐쉬로 할당되게 지정할 수 있도록 한다. 현재 실행되는 것은 모든 테
이블 인덱스를 캐쉬로 지정하기 대문에 테이블 이름 이외에 다른 것을 지정할 이유가 없다.
키 캐쉬(key cache)는 파라미터 셋팅 문으로 크기를 설정하거나 서버에 파라미터를 셋팅함으로써 생성될 수 있는 CACHE
INDEX 문에서 언급된다. 예를 들면:
키 캐쉬(Key cache) 파라미터는 구성된 시스템 변수의 숫자로 엑세스될 수 있다. 5.2.3.1, “구조(Structured) 시스템 변수”장
을 참조하라
디폴트로, 테이블 인덱스는 서버 스타스업(startup)에 생성된 메인(디폴트) 키 캐쉬로 할당된다. 키 캐쉬가 파괴될 때, 할당된 모
든 인덱스는 다시 디폴트 키 캐쉬로 할당된다.
인덱스 할당은 서버에 영향을 미친다; 만약 하나의 클라이언트가 인덱스를 주어진 캐쉬에 할당하면, 클라이언트가 쿼리를 사용한
다 할지라도 이 캐쉬는 인덱스를 포함하는 모든 쿼리에 사용된다.
제목검색
13. SQL 문법(SQL Statement Syntax) FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [, flush_option] ...
13.5. 데이터베이스 관리문
13.5.5 기타 관리 문 FLUSH 문은 MySQL이 사용한 다양한 내부 캐쉬를 제거하거나 다시 로드한다. FLUSH를 실행하기 위해서 RELOAD 권한이 반
드시 있어야 한다.
13.5.5.1 CACHE INDEX
13.5.5.2 FLUSH
13.5.5.3 KILL
13.5.5.4 LOAD INDEX INTO CACHE RESET 문은 FLUSH와 비슷하다. 13.5.5.5, “RESET 신텍스”장을 참조하라.
13.5.5.5 RESET
flush_option 은 다음 중 하나가 될 수 있다:
● HOSTS
호스트 캐쉬 테이블을 비운다. 호스트 중 일부의 IP를 변경하거나 Host 'host_name' is blocked 이라는 에러 메시지를 받
는다면, 호스트 테이블을 비워야 한다. MySQL 서버에 접속하는 동안 주어진 호스트에 연속적으로
max_connect_errors 에러가 발생하면, MySQL은 무언가 잘못되었다고 판단하고, 더 이상의 접속요구로부터 호스트를
블록한다. 호스트 테이블을 비우면, 호스트를 다시 연결할 수 있게 된다. A.2.5, “Host 'host_name' is blocked”장을 참
조하라. --max_connect_errors=999999999 이 에러 메시지를 피하기 위해 --max_connect_errors=999999999
로 mysqld 를 시작할 수 있다.
● DES_KEY_FILE
● LOGS
서버가 --log-error 옵션으로 시작되었다면, FLUSH LOGS 는 -old 첨자로 다시 명명된 에러 로그를 야기하고,
mysqld는 새로 빈 로그 파일을 생성한다. 만약 --log-error 옵션이 주어지지 않았다면, 새로 이름을 정해주는 일은 발
생하지 않는다.
● PRIVILEGES
● QUERY CACHE
메모리를 더 잘 이용하기 위해서, 쿼리 캐쉬를 조각처리한다. FLUSH QUERY CACHE 는 RESET QUERY CACHE 와
달리 캐쉬로부터 어떤 쿼리도 옮기지 않는다.
● STATUS
대부분의 상태 변수를 제로(0)로 재설정한다. 이것은 쿼리를 디버깅할 때에만 사용할 수 있는 것이다. 1.8, “버그나 문제
를 리포트하는 방법”장을 참조하라
테이블 이름이 정해지지 않았으면, 열려있는 모든 테이블을 닫고, 사용 중인모든 테이블을 강제로 닫도록 한다. 이것은 또
한 쿼리 캐쉬를 비운다. 하나 또는 그 이상의 테이블 이름들로 주어진 테이블만을 비운다. FLUSH TABLES 는 RESET
QUERY CACHE 문처럼 쿼리 캐쉬로부터 온 모든 쿼리 결과를 삭제한다.
열려있는 모든 테이블을 닫고 UNLOCK TABLES 를 실행할 때 까지, 리드록(read lock:읽기 잠금) 으로 모든 데이터베
● USER_RESOURCES
모든 시간 당 사용자 리소스를 제로(0)으로 재설정한다. 이것은 시간 당 접속에 도달한 클라이언트, 쿼리, 또는 업데이트
제한이 즉시 활성화되게 한다. FLUSH USER_RESOURCES 는 최대 동시 접속에 제한을 적용하지 않는다. 13.5.1.3,
“GRANT ”장을 참조하라.
임의의 NO_WRITE_TO_BINLOG 키워드(또는 그 알리아스 LOCAL)를 사용하지 않는다면, FLUSH 문은 바이너리 로그로 쓰여
진다. MySQL 서버에서 리플리케이션 마스터로 사용된 FLUSH 문은 리플리케이션 슬레이브(slave)로 디폴트로 리플리케이션되
기 위해 그렇게 한다.
주의: FLUSH LOGS, FLUSH MASTER, FLUSH SLAVE, 그리고 FLUSH TABLES WITH READ LOCK 은 슬레이브로 리플
리케이션되면 문제를 야기시키기 때문에 어떤 경우에도 로그 인 되지 않는다.
저장된 기능 또는 트리거 내에서 FLUSH 문을 이용하는 것은 MySQL 5.0에서 지원되지 않는다. 그러나 저장된 기능 또는 트리거
로부터 호출이 없는 한, 스토어드 프로시져에서 FLUSH를 사용해도 된다. I.1, “스토어드 루틴과 트리거에서의 제한”장을 참조하
라.
제목검색
13.5.5 기타 관리 문 mysqld 로의 연결은 하나의 분리된 스레드에서 실행된다. SHOW PROCESSLIST 문으로 실행되는 스레드를 볼 수 있으며,
KILL thread_id 문으로 스레드를 죽일 수 있다.
13.5.5.1 CACHE INDEX
13.5.5.2 FLUSH
13.5.5.3 KILL
13.5.5.4 LOAD INDEX INTO CACHE IMySQL 5.0.0에서, KILL 은 임의의 CONNECTION 또는 QUERY 를 변경자로 한다:
13.5.5.5 RESET
● KILL CONNECTION 은 변경자가 없는 KILL 과 같다: 그것은 주어진 thread_id와 관련된 연결을 종결시킨다.
● KILL QUERY는 연결이 현재 실행 중인 문을 종결시킨다. 그러나 연결 그 자체는 그대로 둔다.
PROCESS 권한을 가지고 있다면, 모든 스레드를 볼 수 있다. SUPER 권한이 있다면, 모든 스레드와 문을 중단시킬 수 있다. 그렇
지 않으면, 오로지 자신의 스레드와 문 만을 보거나 죽일 수 있다.
스레드를 검토하고 죽이기 위해서 mysqladmin processlist 그리고 mysqladmin kill 명령을 사용할 수 있다.
주의: 임베디드 서버는 거의 호스트 어플리케이션 스레드 안에서 실행되기 때문에, 임베디드 MySQL 서버 라이브러리와 함께
KILL 을 사용할 수 있다. 그것은 그 자신의 연결 스레드를 생성하지 않는다.
KILL을 사용할 때, 스레드-지정 킬 플래그는 스레드 용으로 설정된다. 대부분의 경우에, 스레드를 죽이는데 다소간 시간이 걸린
다. 왜냐하면 킬 플래그가 일정 간격으로 체크되기 때문이다:
● In SELECT, ORDER BY, GROUP BY 루프들에 있어, 플래그는 로우 블록을 읽은 후에 체크된다. 킬 플래그가 설정되어
있다면, 문은 실행을 중단한다.
● ALTER TABLE동안에, 각 로우 블록이 오리지날 테이블로부터 읽혀지기 전에, 킬 플래그는 체크된다. 킬 플래그가 설정
되어 있다면, 문은 실행을 중단하고, 임시 테이블을 삭제된다.
● During UPDATE 또는 DELETE 실행 중에, 각 블록이 읽고, 각각 업데이트되거나 로우가 삭제된 이후에, 킬 플래그는 체
크된다. 킬 플래그가 설정되어 있다면, 문은 실행을 중단한다. 트랜잭션을 사용하지 않고 있다면, 변경이 롤백되지 않는다
는 점을 주의하라.
● GET_LOCK() 는 실행을 중단하고 NULL로 리턴한다.
● An INSERT DELAYED 스레드는 메모리에 있는 모든 로우를 빨리 비운다(입력한다) 그리고 나서 종료한다.
● 스레드가 테이블 록 조정자(명령: Locked)에 있다면, 테이블 록은 빨리 실행을 중단한다.
● 스레드가 쓰기 호출 안에서 여유 디스크 공간을 기다리고 있으면, 그 쓰기는 “disk full”이라는 에러 메시지와 함께 취소
된다.
● 경고: MyISAM 테이블에서 REPAIR TABLE 또는 OPTIMIZE TABLE 실행을 죽이면, 오류를 일으키고 쓸모없는 테이블
로 끝난다. 그것을 다시 최적화하거나 복구하기 전에는, 그런 테이블에 읽기나 쓰기는 실패한다. (중단 없이).
제목검색
[IGNORE LEAVES]
LOAD INDEX INTO CACHE 문은 테이블 인덱스를 CACHE INDEX 문에 의해 명시적으로 할당하기 위해, 키 캐쉬에 미리 로드
해 놓거나 기본 키 캐쉬에 로드한다. LOAD INDEX INTO CACHE 는 MyISAM 테이블들에서 사용된다.
+---------+--------------+----------+----------+
+---------+--------------+----------+----------+
+---------+--------------+----------+----------+
LOAD INDEX INTO CACHE 신텍스로 테이블로부터 특별한 인덱스만을 미리 로드할 수 있도록 지정할 수 있다. 현재의 방법은
테이블 인덱스를 모두 캐쉬로 미리 로드한다. 그래서 테이블 이름과 다른 어떤 것을 지정할 필요가 없다.
제목검색
13.5.5 기타 관리 문 RESET 문은 여러 서버 오퍼레이션 상태를 지울 때 사용된다. RESET 을 실행하기 위해서 RELOAD 권한이 있어야 한다.
● MASTER
인덱스 파일에 열거된 모든 바이너리 로그를 삭제하고, 빈 바이너리 로그인덱스 파일을 재설정한다. 그리고 새로운 바이너
리 로그 파일을 생성한다. (MySQL 3.23.26 버전에서 FLUSH MASTER 로 알려졌다) 13.6.1, “마스터 서버를 제어하
기 위한 SQL문”장을 참조하라.
● QUERY CACHE
● SLAVE
제목검색
13.6 리플리케이션(Replication) 문
13.6.1 마스터 서버 컨트롤을 위한 SQL 문 이 장은 replication 과 관련된 SQL문들에 대해 설명한다. SQL문들의 한 그룹은 master 서버를 제어하기 위해 사용한
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=0&idx=17732006-08-08 오후 6:22:25
:::MySQL Korea:::
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=1&idx=17742006-08-08 오후 6:22:31
:::MySQL Korea:::
제목검색
13. SQL 문법(SQL Statement Syntax) PURGE {MASTER | BINARY} LOGS TO 'log_name'
13.6. 리플리케이션(Replication) 문
13.6.1 마스터 서버 컨트롤을 위한 SQL 문 PURGE {MASTER | BINARY} LOGS BEFORE 'date'
BEFORE 변수의 date 인자는 'YYYY-MM-DD hh:mm:ss' 형식이된다. MASTER 와 BINARY 는 동의어 이다.
이 문장은 slave들이 복제(replication)하는 동안 안전하게 실행 된다. 여러분은 이들을 중지할 필요가 없다. 여러분이 삭제 하려
는 로그들 중 하나를 동시에 읽도록 한 활성화된 slave가 있다면, 이 문장은 아무것도 하지 않고 error와 함께 실패 한다. 그러나
slave가 비 활성 상태이고 아직 읽고 있는 로그들의 하나를 삭제 하는 경우, slave는 복제 할 수 없게 된다.
제목검색
13.6.1 마스터 서버 컨트롤을 위한 SQL 문 인덱스 파일에 있는 모든 바이너리 로그들을 삭제한다. 바이너리 로그 파일을 empty상태로 하고 새로운 바이너리 로그 파일을 생
성한다.
13.6.1.1 PURGE MASTER LOGS
13.6.1.2 RESET MASTER
13.6.1.3 SET SQL_LOG_BIN
13.6.1.4 SHOW BINLOG EVENTS
13.6.1.5 SHOW MASTER LOGS
13.6.1.6 SHOW MASTER STATUS
13.6.1.7 SHOW SLAVE HOSTS
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=1&idx=17762006-08-08 오후 6:22:34
:::MySQL Korea:::
제목검색
13.6.1 마스터 서버 컨트롤을 위한 SQL 문 Client가 SUPER권한을 가진 경우 현재 연결(SQL_LOG_BIN이 세션 변수이다)에 대한 로깅을 활성화 혹은 비 활성화 할 수 있
다. 이 문장은 client가 그 권한이 없는 경우에 에러와 함께 거부 된다.
13.6.1.1 PURGE MASTER LOGS
13.6.1.2 RESET MASTER
13.6.1.3 SET SQL_LOG_BIN
13.6.1.4 SHOW BINLOG EVENTS
13.6.1.5 SHOW MASTER LOGS
13.6.1.6 SHOW MASTER STATUS
13.6.1.7 SHOW SLAVE HOSTS
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=1&idx=17772006-08-08 오후 6:22:35
:::MySQL Korea:::
제목검색
13.6.1 마스터 서버 컨트롤을 위한 SQL 문 [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
Note: LIMIT절이 없이 SHOW BINLOG EVENTS 을 사용하는 경우 서버가 완전한 바이너리 로그의 내용을 클라이언트에게 주
기 위해 많은 시간과 자원 소비를 가져 올 수 있다(이것은 데이터를 변경하는 서버에 의해 실행되는 모든 SQL문을 포함한다).
SHOW BINLOG EVENTS에 대한 대안으로 추후 검사와 분석을 위해 text파일로 바이너리 로그를 저장하기 위해 mysqlbinlog
유틸리티를 사용하도록 한다. 8.9장 “mysqlbinlog-바이너리 로그파일 처리를 위한 유틸리티”부분을 참조하라.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=1&idx=17782006-08-08 오후 6:22:37
:::MySQL Korea:::
제목검색
+---------------+-----------+
| binlog.000015 | 724935 |
| binlog.000016 | 733481 |
+---------------+-----------+
SHOW BINARY LOGS 는 SHOW MASTER LOGS과 같다. File_Size 컬럼은 MySQL 5.0.7로 display된다.
예:
+---------------+----------+--------------+------------------+
+---------------+----------+--------------+------------------+
+---------------+----------+--------------+------------------+
제목검색
+---------------+----------+--------------+------------------+
+---------------+----------+--------------+------------------+
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=1&idx=17802006-08-08 오후 6:22:40
:::MySQL Korea:::
제목검색
13.6.1 마스터 서버 컨트롤을 위한 SQL 문 현재 master로 등록된 복제 slave의 리스트를 display한다. --report-host=slave_name 옵션으로 시작하지 않는 slave는 이
리스트에서 보기가 불가능 하다.
13.6.1.1 PURGE MASTER LOGS
13.6.1.2 RESET MASTER
13.6.1.3 SET SQL_LOG_BIN
13.6.1.4 SHOW BINLOG EVENTS
13.6.1.5 SHOW MASTER LOGS
13.6.1.6 SHOW MASTER STATUS
13.6.1.7 SHOW SLAVE HOSTS
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=1&idx=17812006-08-08 오후 6:22:41
:::MySQL Korea:::
제목검색
13.6.2 슬레이브 서버 컨트롤을 위한 SQL 문 13.6.2.3. LOAD TABLE tbl_name FROM MASTER
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=2&idx=17822006-08-08 오후 6:22:42
:::MySQL Korea:::
제목검색
13. SQL 문법(SQL Statement Syntax) CHANGE MASTER TO master_def [, master_def] ...
13.6. 리플리케이션(Replication) 문
| MASTER_CONNECT_RETRY = count
| MASTER_LOG_FILE = 'master_log_name'
| MASTER_LOG_POS = master_log_pos
| RELAY_LOG_FILE = 'relay_log_name'
| RELAY_LOG_POS = relay_log_pos
| MASTER_SSL = {0|1}
| MASTER_SSL_CA = 'ca_file_name'
| MASTER_SSL_CAPATH = 'ca_directory_name'
| MASTER_SSL_CERT = 'cert_file_name'
| MASTER_SSL_KEY = 'key_file_name'
| MASTER_SSL_CIPHER = 'cipher_list'
CHANGE MASTER TO 는 master 서버와 연결 및 통신을 위해 slave 서버가 사용하는 파라미터들을 변경한다. 이것은
master.info와 relay-log.inf 파일들의 내용을 업데이트 하기도 한다.
MASTER_HOST 나MASTER_PORT를 명시 하면 slave는 master 서버가 이전과 다르다고 여긴다.( 심지어 여러분이
현재 값과 같은 호스트나 포트 값을 명시한다면) 이 경우 master 바이너리 로그 이름과 위치에 대한 이전 값들이 더 이상
적용 불가능 하다고 간주되어 여러분이 SQL문에서 MASTER_LOG_FILE과 MASTER_LOG_POS를 명시하지 않으면
Master_LOG_FILE=’’ 와 MASTER_LOG_POS=4로 암시적으로 적용된다.
된다.
CHANGE MASTER 는 master의 스냅샷(snapshot)을 가지며 로그와 그것에 부합하는 옵셋(offset)을 기록할 때 하나
의 slave를 설정하는데 유용하다. 스냅샷을 slave에 로딩한 후, slave에서 CHANGE MASTER TO
MASTER_LOG_FILE='log_name_on_master', MASTER_LOG_POS=log_offset_on_master 를 실행 시킬 수 있다.
CHANGE MASTER TO
MASTER_HOST='master2.mycompany.com',
MASTER_USER='replication',
MASTER_PASSWORD='bigs3cret',
MASTER_PORT=3306,
MASTER_LOG_FILE='master2-bin.001',
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10;
다음 예는 드물게 사용되는 연산을 보여준다. 이것은 여러분이 어떤 이유로 다시 실행되기 원하는 릴레이(relay)로그를
slave가 가진 경우에 사용된다. 여러분은 단지 CHANGE MASTER TO를 사용하고 SQL 쓰레드(START SLAVE
SQL_THREAD)를 시작 시키면 된다:
CHANGE MASTER TO
RELAY_LOG_FILE='slave-relay-bin.006',
RELAY_LOG_POS=4025;
여러분은 standalone를 가지고 비 복제 설정이나 다음 crash의 회복을 위해 비 slave 서버안에서 두번째 연산을 사용할
수 있다. 여러분의 서버가 손상을 입고 백업을 복원했다고 가정하자. 여러분은 myhost-bin.*의 이름으로 된 서버의 바이
너리 로그(relay 로그가 아닌 정규 바이너리 로그)를 재생하기 원한다. 맨 처음 여러분이 정확히 아래 프로시저를 따르지
않고 서버가 바이너리 로그를 삭제한 경우를 대비하기 위해 , 안전한 공간에 바이너리 로그들의 복사본을 백업한다. 추가
적인 안전을 위해 SET GLOBAL relay_log_purge=0을 사용하라. 그다음 –log-binary옵션 대신 –replicate-same-
server-id, --relay-log=myhost-bin(서버가 이 정규 바이너리 로그가 relay 로그라고 믿게 하기 위해)와 –skip-
slave-start 옵션을 사용하여 서버를 시작하라. 서버가 시작 후 다음 이 문장을 실행 하라.
CHANGE MASTER TO
RELAY_LOG_FILE='myhost-bin.153',
RELAY_LOG_POS=410,
MASTER_HOST='some_dummy_string';
서버는 자신의 바이너리 로그를 읽고 실행하여 crash 회복을 한다. 일단 회복(recovery)가 끝나면, STOP SLAVE를 실
행하여, 서버를 중지 시키고 master.info와 relay-log.info파일들을 삭제 한 다음 이 옵션들을 이용하여 서버를 재 시작한
다.
제목검색
13.6.2 슬레이브 서버 컨트롤을 위한 SQL 문 이 SQL문은 master의 스냅샷(snapshot)을 slave에 복사한다. 이것은 MASTER_LOG_FILE과 MASTER_LOG_POS
의 값들을 업데이트 하여 slave가 정확한 위치로부터 복제를 시작하도록 한다. –replicate-*-do-* 와 –replicate-*-
13.6.2.1 CHANGE MASTER TO
ignore-*옵션들로 명시된 테이블과 데이터베이스의 실행 규칙들이 지켜진다. 한 사용자가 --replicate-rewrite-
13.6.2.2 LOAD DATA FROM MASTER
db="db1->db3" and --replicate-rewrite-db="db2->db3"와 같이 유일하지 않은 매핑을 설정하기 위해 이
13.6.2.3 LOAD TABLE tbl_name FROM MASTER
옵션을 사용할 수 있기 때문에 , -–replicate-rewrite-db 이 고려되지 않는데 이는 master로부터 테이블들을 로딩할
13.6.2.4 MASTER_POS_WAIT()
때에 slave를 혼란하게 할 것이다.
13.6.2.5 RESET SLAVE
13.6.2.6 SET GLOBAL SQL_SLAVE_SKIP_COUNTER
13.6.2.7 SHOW SLAVE STATUS
13.6.2.8 START SLAVE 이 문의 사용은 다음 조건들에 의해 좌우 된다:
LOAD DATA FROM MASTER를 사용하기 위해 master에 연결하기 위해 사용되는 복제 계정이 master에 대해
RELOAD와 SUPER권한을 가져야 하고 여러분이 로드 하려는 모든 master 테이블들에 대해 SELECT 권한을 가져야 한
다. 사용자가 SELECT 권한을 갖지 않으면 모든 master 테이블들은LOAD DATA FROM MASTER에 의해 무시된다.
이는 master가 사용자로부터 그들을 숨기기 때문이다. LOAD DATA FROM MASTER는 로드하려는 master 데이터베
이스를 알기 위해 SHOW DATABASES를 호출한다. 그러나 SHOW DATABASES는 사용자가 같은 권한을 가진 데이터
베이스만 리턴한다. 13.5.4.8장 “SHOW DATABASES”를 참조 하라. slave측에서 LOAD DATA FROM MASTER
를 실행하는 사용자는 복사된 데이터베이스와 테이블들을 삭제 및 생성하는 권한을 가져야 한다.
제목검색
13. SQL 문법(SQL Statement Syntax) LOAD TABLE tbl_name FROM MASTER
13.6. 리플리케이션(Replication) 문
13.6.2 슬레이브 서버 컨트롤을 위한 SQL 문 master에서 테이블의 복사본을 slave로 이전한다. 이문은 디버깅 LOAD DATA FROM MASTER 연산들로 구현되어 있
다. LOAD TABE를 사용하기 위해 master서버에 연결하기 위해 사용되는 계정은 master에 대해 RELAD 와 SUPER 권
13.6.2.1 CHANGE MASTER TO
한과 load하려는 master 테이블에 대한 SELECT권한을 가져야 한다. Slave 측에서 LOAD TABLE FROM MASTER를
13.6.2.2 LOAD DATA FROM MASTER
실행 시키는 사용자는 그 테이블을 삭제 생성할 수 있는 권한들을 가져야 한다.
13.6.2.3 LOAD TABLE tbl_name FROM MASTER
13.6.2.4 MASTER_POS_WAIT()
13.6.2.5 RESET SLAVE
13.6.2.6 SET GLOBAL SQL_SLAVE_SKIP_COUNTER LOAD DATA FROM MASTER 을 위한 조건들은 여기서도 적용한다. 예를 들면 LOAD TABLE FROM MASTER는
13.6.2.7 SHOW SLAVE STATUS MyISAM테이블들에 대해서만 작용한다. LOAD DATA FROM MASTER에 대한 타임아웃 값도 적용된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=2&idx=18082006-08-08 오후 6:22:50
:::MySQL Korea:::
제목검색
13.6.2 슬레이브 서버 컨트롤을 위한 SQL 문 이것은 실제로는 SQL문이 아닌 하나의 함수이다. 이것은 slave가 master 의 바이너리 로그에서 주어진 위치에까지
event를 읽고 실행하도록 하기 위해 사용된다. 12.9.4장 “Miscellaneous 함수들”을 참조하라.
13.6.2.1 CHANGE MASTER TO
13.6.2.2 LOAD DATA FROM MASTER
13.6.2.3 LOAD TABLE tbl_name FROM MASTER
13.6.2.4 MASTER_POS_WAIT()
13.6.2.5 RESET SLAVE
13.6.2.6 SET GLOBAL SQL_SLAVE_SKIP_COUNTER
13.6.2.7 SHOW SLAVE STATUS
13.6.2.8 START SLAVE
13.6.2.9 STOP SLAVE
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=2&idx=18092006-08-08 오후 6:22:51
:::MySQL Korea:::
제목검색
13.6.2 슬레이브 서버 컨트롤을 위한 SQL 문 RESET SLAVE 는 slave로 하여금 master의 바이너리 로그 안에서 복제 위치를 잊도록 한다. 이 문은 깔끔한 시작을 위
해 사용 되는 것을 의미한다. 모든 relay로그와 master.info와 relay-log.info파일들을 삭제하고 새로운 relay 로그를 시
13.6.2.1 CHANGE MASTER TO
작한다.
13.6.2.2 LOAD DATA FROM MASTER
13.6.2.3 LOAD TABLE tbl_name FROM MASTER
13.6.2.4 MASTER_POS_WAIT()
13.6.2.5 RESET SLAVE Note: 모든 relay로그들은 slave SQL 쓰레드에 의해 완전히 실행되지 않았다 해도 삭제된다. (이것은 여러분이 STOP
13.6.2.6 SET GLOBAL SQL_SLAVE_SKIP_COUNTER SLAVE문을 실행 하거나 slave가 높게 load된 경우 복제 slave에 존재하기 쉬운 조건이다)
13.6.2.7 SHOW SLAVE STATUS
13.6.2.8 START SLAVE
13.6.2.9 STOP SLAVE
Master.info파일에 저장되는 연결 정보는 시동 옵션들에 명시된 값들을 이용하여 즉시 리셋된다. 이 정보는 master 호스
트, master 포트, master 사용자 그리고 master 비밀번호와 같은 값들을 포함한다. Slave SQL쓰레드가 slave가 중지
될 때 임시 테이블의 복제 도중에 있고 RESET SLAVE가 실행 되었다면 이들 복제된 임시 테이블들은 slave에서 삭제된
다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=2&idx=18102006-08-08 오후 6:22:53
:::MySQL Korea:::
제목검색
13.6.2 슬레이브 서버 컨트롤을 위한 SQL 문 이 문은 master로부터 다음 N event를 skip한다. 이것은 하나의 SQL문에 의해 유발된 복제 중지로부터 회복하는데 유용
하다.
13.6.2.1 CHANGE MASTER TO
13.6.2.2 LOAD DATA FROM MASTER
13.6.2.3 LOAD TABLE tbl_name FROM MASTER
13.6.2.4 MASTER_POS_WAIT() 이 문은 slave쓰레드가 실행 중이 아닐 때에만 유효하다. 그렇지 않으면 이것은 에러를 발생시킨다.
13.6.2.5 RESET SLAVE
13.6.2.6 SET GLOBAL SQL_SLAVE_SKIP_COUNTER
13.6.2.7 SHOW SLAVE STATUS
13.6.2.8 START SLAVE
13.6.2.9 STOP SLAVE
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=2&idx=18112006-08-08 오후 6:22:54
:::MySQL Korea:::
제목검색
13.6.2 슬레이브 서버 컨트롤을 위한 SQL 문 이 문은 slave 쓰레드들의 주요 인자들에 대한 상태 정보를 제공한다. 여러분이 mysql 클라이언트를 이용하여 이 문장을
실행하면 세미콜론을 사용하는 것보다 값들이 아래와 같이 수직으로 일관되게 위치하게 하여 읽기를 돕는 ₩G문장 종결자
13.6.2.1 CHANGE MASTER TO
를 사용할 수 있다:
13.6.2.2 LOAD DATA FROM MASTER
13.6.2.3 LOAD TABLE tbl_name FROM MASTER
mysql> SHOW SLAVE STATUS₩G
13.6.2.4 MASTER_POS_WAIT()
13.6.2.5 RESET SLAVE *************************** 1. row ***************************
13.6.2.6 SET GLOBAL SQL_SLAVE_SKIP_COUNTER
13.6.2.7 SHOW SLAVE STATUS Slave_IO_State: Waiting for master to send event
Master_User: root
Master_Port: 3306
Connect_Retry: 3
Master_Log_File: gbichot-bin.005
Read_Master_Log_Pos: 79
Relay_Log_File: gbichot-relay-bin.005
Relay_Log_Pos: 548
Relay_Master_Log_File: gbichot-bin.005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 79
Relay_Log_Space: 552
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 8
• Slave_IO_State
Slave의 I/O쓰레드를 위한 SHOW PROCESSLIST의 결과에서 State 필드의복사. 이것은 어떤 쓰레드가 master에 연결
을 시도하고 master로부터 event를 기다리며 master에 재 연결을 하는 지에 대해 알려준다. 가능한 상태에 대한 내용은
6.3장 “Replication implementation Details”을 참조하라. 이것은 MySQL의 이전 버전(5.0.12 이전버전)에서 이 값
을 체크하는 것이 필요한데 이들 버전들에서 비 성공적으로 master에 연결을 시도하는 동안 쓰레드가 실행 될 수 있기 때
문이다. 이 필드는 여러분이 연결의 문제를 알도록 한다. SQL 쓰레드의 상태는 매우 간단하므로 복제 되지 않는다. 이것
이 실행 중인 경우, 문제가 없다. 그렇지 않다면 여러분은 Last_Error필드에서 에러를 찾을 수 있다.
• Master_Host
현재 master 호스트.
• Master_User
Master에 연결 하는데 사용되는 현재 사용자.
• Master_Port
현재 master 포트.
• Connect_Retry
--master-connect-retry 옵션의 현재 값.
• Master_Log_File
I/O쓰레드가 현재 읽고 있는 바이너리 로그 파일의 이름.
• Read_Master_Log_Pos
I/O쓰레드가 현재 master 바이너리 로그에서 읽은 곳까지의 위치.
• Relay_Log_File
SQL쓰레드가 현재 읽고 실행 하고 있는 relay 로그 파일의 이름.
• Relay_Log_Pos
SQL 쓰레드가 현재 relay 로그 에서 읽고 실행한 곳까지의 위치.
• Relay_Master_Log_File
SQL 쓰레드에 의해 실행된 최근의 event를 포함하고 있는 master 바이너리 로그 파일의 이름.
• Slave_IO_Running
I/O쓰레드가 시작되어 master에 성공적으로 연결되었는지의 여부. MySQL의이전 버전(4.1.14와 5.0.12이전)에서는,
slave가 master에 아직 연결 되지 않았을 지라도, I/O쓰레드가 시작되면 Slave_IO_Running이 YES이다.
• Slave_SQL_Running
SQL 쓰레드가 시작되었는지의 여부.
• Replicate_Do_DB, Replicate_Ignore_DB
--replicate-do-db 과 --replicate-ignore-db 옵션으로 명시된 데이터베이스 리스트.
• Last_Errno, Last_Error
가장 최근에 사용된 쿼리에 의해 리턴된 에러 메시지와 번호. 에러 번호가 0 이거나 에러 메시지가 빈 문자열인 경우 “no
error”를 의미한다. 만약 Last_Error값이 empty가 아닌 경우, slave의 에러 로그에 하나의 메시지로 나타난다. 예를 들
면:
Last_Errno: 1051
메시지는 테이블 z가 master에 존재하여 삭제 된 것을 지시한다. 그러나그것은 slave에는 존재하지 않고 DROP TABLE
은 slave에서 실패하였다. (이것은 여러분이 복제를 설정할 때 slave에 table의 복사를 잊어버릴 경우 발생 할 수 있다.)
• Skip_Counter
SQL_SLAVE_SKIP_COUNTER를 위해 가장 최근 사용된 값.
• Exec_Master_Log_Pos
Master의 바이너리 로그(Relay_Master_Log_File)로부터 SQL쓰레드에 의해 수행된 마지막 event의 위치. Master 바
이너리 로그 안의 (Relay_Master_Log_File, Exec_Master_Log_Pos)는 relay 로그 안의 (Relay_Log_File,
Relay_Log_Pos)와 일치 한다.
• Relay_Log_Space
존재하는 모든 relay 로그의 전체 사이즈
Until_Log_File 와 Until_Log_Pos 은 SQL 쓰레드가 실행을 멈추는 위치를 정의하는 위치 값과 로그 파일 이름을 지정한
다.
• Seconds_Behind_Master
이 필드는 얼마나 slave가 “late”한지에 대한 지정이다:
본질적으로 이 필드는 slave SQL 쓰레드와 slave I/O 쓰레드 사이의 시간 차(초 단위)를 측정한다.
Master와 slave사이의 네트웍 연결이 빠르다면, slave I/O쓰레드는 master와 매우 가깝고 이 필드는 SQL 쓰레드가
master에 비해 얼마나 느린지에 대한 좋은 추정이 된다. 네트웍이 느린 경우 이것은 좋은 것이 되지 못한다. Slave SQL
쓰레드가 느린 읽기 slave I/O 쓰레드에 의해 따라 잡히기 때문에 I/O 쓰레드가 master에 비해 느린 경우라도,
Seconds_Behind_Master는 자주 0의 값을 보여준다. 다시 말하면 이 컬럼은 빠른 네트웍에서만 유용하다.
이 시간 차이 계산은 master와 slave가 구별하는 clock(clock 차이는 slave I/O쓰레드가 시작할 때 계산되고 on상태로
항상 유지 되도록 한다)이 없을지라도 작동 한다. Slave SQL쓰레드가 실행중이 아니거나 master에 연결되지 않은 경우
이 필드는 하나의 제약을 갖는다. Timestamp가 복제를 통해 보존되는데 이는 ,master M1이 M0의 slave라면, M0의
binlog로부터 event를 복제하는데서 발생하는 M1의 binlog의 어떤 event도 그 evnet의 timestamp를 갖는다는 것을 의
미한다. 이것은 MySQL이 TIMESTAMP를 성공적으로 복제 하도록 한다. 그러나 This enables MySQL to replicate
TIMESTAMP successfully. However, the drawback for Seconds_Behind_Master 의 결점은 M1이 클라이언트로부
터 직접 update를 받은 경우, 때때로 M1의 event가 M0로부터 나오고 직접 update로부터 가장 최근의 timestamp이기
때문에, 그 값이 무작위로 벗어난다.
제목검색
13. SQL 문법(SQL Statement Syntax) START SLAVE [thread_type [, thread_type] ... ]
13.6. 리플리케이션(Replication) 문
thread_type 옵션을 갖지 않는 START SLAVE 는 slave 쓰레드의 양쪽에서 시작한다. I/O쓰레드는 master 서버에서 쿼
리들을 읽고 그것들을 relay 로그에 저장한다. SQL 쓰레드 relay 로그를 읽고 그 쿼리들을 실행한다. START SLAVE
는 SUPER 권한을 필요로 한다.
START SLAVE 가 slave 쓰레드들의 시작이 성공하면 어떤 에러없이 리턴한다. 그러나 이 경우에도 slave쓰레드가 시작
하고 뒤에 정지 할수 있다(예를 들면, master에 연결, 바이너리 로그 혹은 어떤 다른 문제들을 읽지 못하기 때문이다).
START SLAVE 는 여러분에게 이것에 대해 경고 하지 않는다. 여러분은 slave 쓰레드들에 의해 생성된 에러 메시지를 위
해 slave의 에러 로그를 체크하거나 그것들이 SHOW SLAVE STATUS로써 만족할만하게 실행되는 것을 체크해야 한
다.
UNTIL 절은 SQL 쓰레드가 master 바이너리 로그나 slave relay로그들 안에서 주어진 위치에 이를 때까지 slave가 시작
하고 실행 되어야 함을 명시하기 위해 사용될 수 있다. SQL 쓰레드가 그 지점에 이르면 그것은 정지한다. 만약
SQL_THREAD옵션이 그 문장에서 명시되면 SQL 쓰레드만을 시작한다. SQL 쓰레드가 실행 중인 경우, UNTIL절은 무
시되고 경고가 발생한다.
하나의 UNTIL 절에 대해 여러분은 로그 파일이름과 위치를 지정해야 한다. Mater와 relay log옵션을 뒤섞지 말라.
UNTIL 절은 복제를 디버깅하기 위해, 여러분이 slave가 한 문장을 복제하는 것을 피하기 원하는 지점 이전까지 복제를
진행하도록 하는데 유용할 수 있다. 예를 들면, 한 DROP TABLE문이 master에서 실행되었다면 여러분은 slave가 그 지
점 이상 실행되지 못하게 하기 위해 UNTIL을 사용할 수 있다. 어떤 event인지 찾기 위해, master 로그나 slave relay로
그와 함께 mysqlbinlog이나 SHOW BINLOG EVENTS문을 사용하라.
여러분이 slave가 섹션들에서 복제된 쿼리들을 실행하도록 하기 위해 UNTIL을 이용하고 있다면, SQL 쓰레드가 slaver
서버가 시작할 때 실행되는 것을 막기 위해 –skip-slave-start옵션과 함께 slave를 시작할 것을 권장한다. Command
라인에서 보다 option 파일에서 이 옵션을 사용하는 것이 아마도 최선 이며 이로 인해 예기치 못한 서버가 잊혀지지 않도
록 한다.
제목검색
13. SQL 문법(SQL Statement Syntax) STOP SLAVE [thread_type [, thread_type] ... ]
13.6. 리플리케이션(Replication) 문
http://www.mysqlkorea.com/develop/sub_07.html?lcate=13&mcate=6&scate=2&idx=18142006-08-08 오후 6:23:03
:::MySQL Korea:::
제목검색
13.7. Prepared 문을 위한 SQL 신텍스 MySQL 5.0은 서버 측에서 준비된 SQL문들을 제공한다. 이 제공은 MySQL4.1에서 구현된 효과적인 client/server 바이너리 프
13.7 Prepared 문을 위한 SQL 신텍스 로토콜의 이점을 이용하여 적절한 client 프로그래밍 인터페이스를 사용한다. 인터페이스는 MySQL C API client 라이브러리(C
프로그램용), MySQL Connector/J (Java 프로그램용) , MySQL Connector/Net.을 포함한다. 예를 들면 C API는 그 준비된 문
장 API 만든 함수 호출 집합을 제공한다. 22.2.4장 “C API Prepared Statements”부분을 참조하라. 다른 언어 인터페이스는 C
클라이언트 라이브러리 안에 링크(link)하여 바이너리 프로토콜을 사용하는 준비된 문장들에 대한 제공을 지원할 수 있다.
준비된 문들(prepared statements)에 대한 다른 대안적인 SQL 인터페이스가 가능하다. 이 인터페이스는 하나의 prepared
statement API를 통해 바이너리 프로토콜을 사용하는 것만큼 효과적 이지만 그것이 SQL 레벨에서 직접 가능한 것이기 때문에 프
로그래밍을 필요로 하지 않는다.:
• 여러분은 mysql 클라이언트 프로그램과 같이 server로 하여금 실행 되도록 하는 SQL 문들을 보낼 수 있도록 하는 어떤 프로
그램으로부터도 이것을 사용할 수 있다.
• 여러분은 이것을 코딩하기 전에 여러분의 응용 프로그램에서 prepared statement가 어떻게 작용하는지를 테스트하길 원한
다.
• 한 응용프로그램은 prepared statement를 실행 하는데 문제를 가지고 있고 여러분은 문제가 무엇인지 상호작용으로 결정하
기 원한다.
• Prepared statement를 가진 문제를 기술하는 테스트 경우를 생성하기 위해 여러분은 bug 리포트를 정리할 수 있다.
• 여러분은 prepared statements를 사용하길 필요로 하지만 그들을 지원하기 위해 프로그래밍 API에 대해 접근을 갖지 않는
다.
주어진 이름과 함께 prepared 문이 존재하면, 새로운 문장이 준비되기 전에할당이 해제 된다. 이것은 만약 새로운 문장이 하나의
에러를 포함하고 준비될 수 없다면 에러가 리턴되고 주어진 이름으로 문장은 존재하지 않는다.
한 문장을 준비한 후, 여러분은 그 준비된 문장 이름을 참조하는 EXECUTE 문과 함께 그것을 실행한다. 만일 준비된 문이 파라미
터 표시자를 가진다면 여러분은 파라미터들에 종속된 값들을 포함하는 사용자 변수들을 나열한 USING절을 제공해야 한다. 파라미
터 값들은 사용자 변수들에 의해 제공될 수 있으며, USING절은 그 문에서 파라미터 표시자들의 수만큼 많은 변수들을 정확하게 명
명해야만 한다.
여러분은 여러 차례에 걸쳐 주어진 준비된 문장을 실행 할 수 있으며 그것에 다른 변수들을 전달하거나 각각의 실행 이전에 다른 값
들을 변수들에 설정한다.
여러분이 이전에 준비된 문장을 해제하지 않은채 client 세션을 종료한다면 서버는 그것을 자동으로 해제 한다.
다음 SQL문들은 준비된 문들에서 사용될 수 있다: CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET,
UPDATE, 그리고 대부분의 SHOW 문장들. ANALYZE TABLE, OPTIMIZE TABLE, 그리고REPAIR TABLE 문은 MySQL
5.0.22에서부터 제공된다. 다른 문들은 아직 제공되지 않는다.
다음 예문들은 삼각형의 두 길이를 이용하여 빗변의 길이를 계산하는 한 문을 준비하기 위한 두개의 동일한 방법을 보여준다.
mysql> SET @a = 3;
mysql> SET @b = 4;
+------------+
| hypotenuse |
+------------+
| 5|
+------------+
mysql> SET @a = 6;
mysql> SET @b = 8;
+------------+
| hypotenuse |
+------------+
| 10 |
+------------+
MySQL 5.0.7에서부터, placeholder들은 준비된 문을 사용할 때 LIMIT절의 인자로 사용될 수 있다. 13.2.7장 “SELECT”을 참
조하라.
준비된 문을 위한SQL 문법은 중첩 방식(nested fashion)안에서 사용될수 없다. 즉, PREPARE에 전달된 문은 PREPARE,
EXCUTE 혹은 DEALOCATE PREPARE 문이 될 수 없다.
준비된 문들을 위한 SQL문법은 준비된 문 API 호출의 사용과는 다르다. 예를 들면 여러분은 PREPARE,EXCUTE,혹은
DEALLOCATE PRPARE문을 준비하기 위해 mysql_stmt_prepare() C API 함수를 사용할 수 없다.
준비된 문장들을 위한 SQL문법은 저장된 루틴 안이나 트리거들에서 사용될 수 없다. 이 제약은 저장 프로시져를 위해 MySQL
5.0.13에서도 유지되지만 저장 함수나 트리거에서는 적용되지 않는다.
제목검색
17.1 스토어드 루틴과 그랜트 테이블 17.2.2. ALTER PROCEDURE 및 ALTER FUNCTION 신텍스
17.2 스토어드 프로시저 신텍스 17.2.3. DROP PROCEDURE 및 DROP FUNCTION 신텍스
17.2.1 CREATE PROCEDURE 와 CREATE FUNCTION 신텍스 17.2.4. SHOW CREATE PROCEDURE 및 SHOW CREATE FUNCTION 신텍스
17.2.5. SHOW PROCEDURE STATUS 및 SHOW FUNCTION STATUS 신텍스
17.2.2 ALTER PROCEDURE 및 ALTER FUNCTION 신텍스
17.2.6. CALL 명령문 신텍스
17.2.3 DROP PROCEDURE 및 DROP FUNCTION 신텍스
17.2.7. BEGIN ... END 복합 명령문 신텍스
17.2.4 CALL 명령문 신텍스
17.2.8. DECLARE 명령문 신텍스
17.2.5 BEGIN ..
17.2.9. 스토어드 루틴내의 변수
17.2.6 DECLARE 명령문 신텍스
17.2.10. 조건문 및 핸들러
17.2.7 스토어드 루틴내의 변수
17.2.11. 커서
17.2.7.1 DECLARE 로컬 변수 17.2.12. 제어 구성 요소 흐름
17.2.7.2 변수 SET 명령문 17.3. 스토어드 프로시저, 함수, 트리거, 및 리플리케이션: FAQ
17.2.7.3 SELECT .. 17.4. 스토어드 루틴 및 트리거의 바이너리 로깅
17.2.8 조건문 및 핸들러
17.2.8.1 DECLARE 조건문 MySQL 5.0은 루틴 (프로시저 및 함수)을 지원한다. 스토어드 프로시저란 서버 내에 저장할 수 있는 SQL 명령문
17.2.8.2 DECLARE 핸들러 의 조합을 의미한다. 일단 이것을 실행하면, 클라이언트는 개별 명령문을 다시 불러들이는 대신에 이 스토어드 프
17.2.10 플로우 컨트롤(Flow Control) 구성 할 수 있다. 이를 통해 은행은 업무의 일관성 및 안전한 데이터 베이스 환경을 보장 받게 되며, 또한 루틴
17.2.10.1 IF 명령문 은 각 기능이 적절하게 등록되어짐을 보장하게 된다. 이러한 설정 내에서, 애플리케이션 및 사용자는 데이
17.2.10.2 CASE 명령문 터 베이스 테이블에 직접 접근하는 대신에 특정 스토어드 루틴만을 실행할 수 있게 된다.
MySQL은 스토어드 루틴에 대해 SQL:2003 신텍스를 준수하며, IBM의 DB2도 위의 신텍스를 동일하게 준수하
고 있다.
MySQL은 스토어드 루틴에 대해 계속 완성도를 높여가는 중이다. 이 장에서 언급하는 모든 신텍스는 계속 보완될
것이며, 어떠한 제약 사항 및 확장되는 내용은 적정한 곳에 문서화를 할 예정이다. 스토어드 루틴의 사용에 대한 보
다 자세한 제약 사항은 Section I.1, “스토어드 루틴 및 트리거상의 제약 사항” 에서 다루기로 한다.
스토어드 루틴에 대한 바이너리 로깅은 Section 17.4, “스토어드 루틴 및 트리거의 바이너리 로깅” 에서 다루기
로 한다.
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=1&scate=0&idx=3822006-08-08 오후 6:23:43
:::MySQL Korea:::
제목검색
17.2.1 CREATE PROCEDURE 와 CREATE FUNCTION 신텍스 17.2.5. SHOW PROCEDURE STATUS 와 SHOW FUNCTION STATUS 신텍스
17.2.2 ALTER PROCEDURE 및 ALTER FUNCTION 신텍스 17.2.6. CALL 명령문 신텍스
17.2.3 DROP PROCEDURE 및 DROP FUNCTION 신텍스 17.2.7. BEGIN ... END 복합 명령문 신텍스
17.2.8. DECLARE 명령문 신텍스
17.2.4 CALL 명령문 신텍스
17.2.9. 스토어드 루틴내의 변수
17.2.5 BEGIN ..
17.2.10. 조건문과 핸들러
17.2.6 DECLARE 명령문 신텍스
17.2.11. 커서
17.2.7 스토어드 루틴내의 변수
17.2.12. 플로우 컨트롤(Flow Control) 구성
17.2.7.1 DECLARE 로컬 변수
17.2.7.2 변수 SET 명령문
하나의 스토어드 루틴은 프로시저거나 함수다. 스토어드 루틴은 CREATE PROCEDURE 와 CREATE
17.2.7.3 SELECT ..
FUNCTION 명령문을 가지고 생성된다. 하나의 프로시저는 하나의CALL 명령문으로 호출 되어지며, 결과 변수
17.2.8 조건문 및 핸들러 를 통해서만 외부로 값을 전달하게 된다. 함수는 다른 함수들과 마찬가지로(즉, 함수 이름을 호출 함으로서) 내부
17.2.8.1 DECLARE 조건문 명령문이 호출할 수 있으며, 스칼라 값을 돌려줄 수 있다. 스토어드 루틴은 다른 스토어드 루틴을 호출할 수도 있
17.2.8.2 DECLARE 핸들러 다. MySQL 5.0.1 이후에는, 스토어드 루틴 또는 함수는 특정 데이터 베이스와 연관 되어 지는데, 여기에 몇 가지
17.2.9 커서(Cursors) 임플리시트(implicit) 요소를 설명한다:
17.2.9.1 Cursors 선언하기
17.2.9.2 Cursor OPEN 명령문 ● 루틴이 호출되면, 하나의 임플리시트(implicit) USE db_name 이 실행된다(그리고 루틴이 종료되면 마
침). 스토어드 루틴내의 USE 명령문은 허용되지 않음.
17.2.9.3 Cursor FETCH 명령문
● 데이터 베이스 이름으로 루틴 이름을 검증할 수 있다. 이것은 현재의 데이터 베이스 내에는 없는 루틴을 언
17.2.9.4 Cursor CLOSE 명령문
급하기 위해 사용될 수도 있다. 예를 들면, test 데이터 베이스와 관련된 스토어드 프로시저 p 또는 함수 f
17.2.10 플로우 컨트롤(Flow Control) 구성
를 호출하기 위해서는, CALL test.p() or test.f() 를 입력하면 된다 .
17.2.10.1 IF 명령문 ● 데이터 베이스가 드롭되는 경우에는, 이에 연관된 모든 스토어드 루틴도 같이 드롭된다.
제목검색
FUNCTION 신텍스
CREATE FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
proc_parameter:
func_parameter:
param_name type
type:
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| COMMENT 'string'
routine_body:
이 명령문들은 스토어드 루틴을 생성한다. MySQL 5.0.3에서 보면, 이러한 명령문을 사용하기 위해서는, CREATE ROUTINE 에
대한 권한이 필요하게 된다. 만일 바이너리 로깅이 가능하다면, 이러한 명령문들은 SUPER 권한을 요청할 수도 있게 되는데, 이점
에 대해서는 Section 17.4, “스토어드 루틴 및 트리거에 바이너리로 로깅” 에서 언급하였다. MySQL은 자동으로 ALTER
ROUTINE 과 EXECUTE 권한을 루틴 생성자에게 부여한다.
베이스와 루틴을 연결하기 위해서는, 루틴을 생성할 때 db_name.sp_name 과 같이 이름을 명확히 지정해야 한다.
만일 루틴의 이름이 SQL 함수 내부에 있는 이름과 일치하게 되면, 루틴을 정의할 때 이름과 따라오는 괄호 사이에 스페이스를 사
용해야 신텍스 에러를 피할 수 있다. 이것은 또한 나중에 루틴을 호출할 때에도 적용된다. 이러한 이유로 인해, 작성하는 스토어드
루틴에 대해서는 SQL내부의 함수 이름을 사용하지 말 것을 권장한다.
IGNORE_SPACE SQL 모드는 내부에 탑재된 함수에 적용되며, 스토어드 루틴에는 적용되지 않는다. IGNORE_SPACE의 활성화
에 상관 없이 루틴의 이름 후에 스페이스를 사용하는 것은 언제든지 가능하다.
괄호 안에는 파라미터 리스트가 반드시 항상 존재해야 한다. 만일 파라이터가 없으면, ()의 빈 파라미터가 쓰이게 된다. 각 파라미
터는 디폴트로 IN 파라미터가 된다. 파라미터에 다른 것을 지정하고자 할 경우에는, 파라미터 이름 앞에 키워드 OUT 또는 INOUT
를 사용하면 된다.
노트 : Specifying a parameter as IN, OUT, 또는 INOUT으로 파라미터를 지정할 경우는 PROCEDURE에 대해서만 가능하다.
(FUNCTION 파라미터는 항상 IN 파라미터로 간주된다.)
각 파라미터는 모든 가능한 데이터 타입을 사용하기 위해 선언될 수 있으나, COLLATE 속성은 사용할 수 없다.
RETURNS 구문은 FUNCTION 에 대해서만 명기할 수도 있는데, 이것이 필수적인 경우에만 해당된다. 이러한 경우, RETURN 구
문은 함수의 리턴 타입을 지정하며, 함수에는 반드시 RETURN value 명령문이 있어야 한다.
routine_body 는 유용한 SQL 프로시저 명령문으로 구성된다. 이것은 단순히 SELECT 또는 INSERT가 될 수도 있으며, 또는
BEGIN 과 END로 구성된 복합 명령문이 될 수도 있다. 복합 명령문 신텍스는 Section 17.2.7, “BEGIN ... END 복합 명령문 신
텍스”.에서 다루기로 한다. 복합 명령문은 선언문, 루프 및 다른 제어 구조 명령문을 포함할 수 있다. 이러한 명령문에 대한 신텍스
는 나중에 다루기로 다루기로 한다. 예를 들어, Section 17.2.8, “DECLARE 명령문 신텍스”, 및 Section 17.2.12, “Flow
Control Constructs”를 참조 하면 된다.
MySQL의 이전 버전에서 UDF(user-defined functions)를 지원하기 위해서 CREATE FUNCTION 명령문을 사용했다.
Section 24.2, “MySQL에 새로운 함수 추가”를 참조. UDF는 스토어드 함수가 지원되는 현 버전에도 계속 사용 가능하며, 이때
UDF는 외부 스토어드 함수로 간주된다. 하지만, 스토어드 함수는 UDF와 함께 자신의 이름 공간(namespace)를 공유한다는 점을
유의한다.
리플리케이션을 위해서는, 비확정적 루틴을 만들기 위해서NOW() 함수 (또는 동의어) 또는 RAND() 함수를 사용할 필요는 없
다. NOW() 함수를 위해서는, 바이너리 로그가 타임 스탬프(timestamp) 및 복사본을 정확히 포함한다. RAND() 함수 또한 루틴
내에서 한번 호출 되어지면 정확히 복사본을 포함하게 된다. (루틴 실행 타임스탬프 및 랜덤 숫자 시드(random number seed)를
마스터 및 슬레이브에서 동일하게 여겨지는 임플리시트(implicit) 입력치로 생각할 수 있다)
현재의 버전에서는, DETERMINISTIC 특성은 사용 가능하지만, 옵티마이져에 의한 사용은 아직 불가능하다. 하지만, 바이너리 로
깅이 가능할 경우에는, 이러한 특성은 MySQL이 수용하는 루틴 정의에 영향을 미치게 된다. Section 17.4, “스토어드 루틴 및 트
리거에 대한 바이너리 로깅” 참조.
몇몇 특성들은 루틴이 사용하는 데이터의 속성에 대한 정보를 제공한다. CONTAINS SQL 은 데이터를 읽거나 쓰는 명령문을 갖
지 않는 루틴을 의미 한다. NO SQL 은 아무런 SQL명령문이 없는 루틴을 나타낸다. READS SQL DATA 은 데이터를 읽기는 하
지만 쓰지는 않는 명령문을 갖는 루틴을 표시하며, MODIFIES SQL DATA 는 데이터를 쓸 수도 있는 명령문을 갖는 루틴을 나타
낸다. CONTAINS SQL 은 확정적으로 이러한 특성이 주어지지 않았을 경우 디폴트가 된다. 이런 특성들은 단지 권고 사항일 뿐이
다. 데이터 베이스 서버는 이러한 명령문들을 루틴이 실행될 수 있는 명령문의 종류를 한정하는데 시용하지는 않는다.
SQL SECURITY 특성은 루틴을 실행하는 권한이 있는 사용자가 루틴의 생성자인지 아니면 루틴을 호출한 사용자인지를 명기할
때 사용될 수 있다. 디폴트 값은 DEFINER이다. 이러한 특성은 SQL:2003에 새롭게 추가된 것이다. 생성자 또는 호출자는 반드시
해당 루틴과 연관되어 있는 데이터 베이스에 접근할 수 있는 권한이 있어야 한다. MySQL 5.0.3버전에서는, 루틴을 실행하기 위해
서는 EXECUTE 권한이 필요하다. 이 권한을 가져야만 하는 사용자는 루틴 정의자 또는 호출자중 하나이어야 하고, 이것은 SQL
SECURITY특성이 어떻게 셋팅 되어지는지에 따라서 결정된다.
MySQL은 루틴이 생성될 때, 그리고 이 셋팅 값을 갖는 루틴이 제대로 실행될 때에는 언제나 유효한 sql_mode 시스템 변수 셋팅
값을 저장한다.
루틴이 호출되면, 임플리시트(implicit) USE db_name 이 실행된다(그리고 루틴이 종료되면 이것도 종료됨). 스토어드 루틴 안에
있는 USE 명령문은 사용할 수 없다.
MySQL 5.0.18 이전에는, 파라미터, 리턴값, 그리고 로컬 변수는 프로그래밍 식(expression)에 있는 아이템으로 간주되었고, 또
한 자동(silent)변환 및 자동 잘림(truncation)의 대상으로 간주되었다. 스토어드 함수는 sql_mode 셋팅을 무시한다.
COMMENT 구문은 MySQL의 확장자이며, 스토어드 루틴을 설명할 때 사용할 수 있다. 이러한 정보는 SHOW CREATE
PROCEDURE 및 SHOW CREATE FUNCTION 명령문으로 볼 수 있다.
MySQL 은 루틴이 CREATE 및 DROP과 같은 DDL명령문을 포함할 수 있도록 한다. 또한, MySQL은 스토어드 프로시저(스토어
드 함수가 아님) 가 COMMIT과 같은 SQL 트랜젝션을 갖는 것을 허용한다. 스토어드 함수는 익스플리시트(explicit) 또는 임플리
시트(implicit) 커밋(commit) 또는 롤백(rollback)을 수행하는 명령문을 포함할 수 없다. 이런 명령문을 지원하는 것은 SQL표준
안의 요구 사항이 아니며, 각 DBMS업체의 선택에 달려 있다.
결과 셋을 리턴하는 명령문은 스토어드 함수 내에서는 사용할 수 없다. 이러한 것에는 컬럼 값을 변수 안으로 인출(fetch)하기 위
한 INTO를 사용하지 않는 SELECT 명령문, SHOW명령문, 그리고 EXPLAIN과 같은 명령문 등이 해당된다. 결과 셋을 리턴하는
함수 정의 시점을 결정할 수 있는 명령문에 대해서는, ‘ Not allowed to return a result set from a function
error’ (ER_SP_NO_RETSET_IN_FUNC)가 발생한다. 결과 셋을 리턴하기 위해 런타임만을 결정하는 명령문에 대해서는, ‘
PROCEDURE %s can't return a result set in the given context error’ (ER_SP_BADSELECT)가 발생한다.
Note: MySQL 5.0.10이전에는, CREATE FUNCTION 과 함께 생성된 스토어드 프로시저는 제한적인 예외 사항이 있기는 하지
만 테이블에 대한 참조를 가질 수 없었다. 이러한 스토어드 프로시저는 테이블 참조를 갖는 SET과 같은 명령문을 포함할 수 있는
데, 예를 들면 SET a:= (SELECT MAX(id) FROM t) 이며, 또한 값을 직접 변수 안으로 집어 넣는 SELECT 명령문, 예를 들면
SELECT i INTO var1 FROM t이 될 수 있다.
아래의 것은OUT 파라미터를 갖고 있는 단순한 스토어드 프로시저의 경우에 해당하는 예문이다. 이 예문은 mysql 클라이언트
delimiter 명령어를 사용해서 프로시저가 정의되는 동안 구분자를 ; 로부터 //로 변경하는 것을 나타낸다. 이것은 프로시저 몸체에
서 사용되어진 ; 구분 문자가 mysql 자체에서 해석되지 않고 서버로 전달될 수 있도록 하게 해준다.
mysql> delimiter //
-> BEGIN
-> END;
-> //
mysql> delimiter ;
+------+
| @a |
+------+
|3 |
+------+
delimiter 명령어를 사용할 때에는, 백슬레쉬(‘₩’)를 사용하면 안 되는데, 이 문자는 MySQL에서는 escape문자로 사용되기 때
문이다
아래의 문장은 파라미터를 가져오고, SQL함수를 사용해서 동작을 하고, 결과치를 리턴하는 함수의 예문이다. 이 경우, delimiter
를 사용할 필요가 없는데, 함수 정의는 내부 ; 명령문 구분 문자를 갖고 있지 않기 때문이다:
+----------------+
| hello('world') |
+----------------+
| Hello, world! |
+----------------+
스토어드 함수는 RETURNS 구문에서 명기한 데이터의 타입 값을 리턴한다. 만일, RETURN 명령문이 다른 타입의 값을 리턴할
경우에는, 올바른 타입으로 치환된다. 예를 들면, 함수가 ENUM 또는 SET 값을 리턴한다 하더라도, RETURN 명령문은 정수 값
을 리턴하게 되며, 함수로부터 리턴된 값은 SET 멤버의 셋의 ENUM멤버에 상응하는 스트링이 된다.
제목검색
FUNCTION 신텍스
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| COMMENT 'string'
이 명령문은 스토어드 프로지서 또는 함수의 특성을 변경하고자 할 때 사용할 수 있다. MySQL 5.0.3의 경우, 루틴에 대해서
ALTER ROUTINE 권한이 있어야 한다. (이 권한은 루틴 생성자에게 자동으로 제공된다.) 만일, 바이너리 로깅이 활성화 되어지
면, 이 명령문은 SUPER권한도 동시에 요청하게 되는데, 이 사항에 대해서는Section 17.4, “스토어드 루틴 과 트리거에 대한 바
이너리 로깅”을 참조하면 된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=2&idx=3992006-08-08 오후 6:24:05
:::MySQL Korea:::
제목검색
17.2.3 DROP PROCEDURE 및 DROP 이 명령문은 스토어드 프로시저 또는 함수를 드롭 하기 위해 사용된다. 즉, 명기된 루틴이 서버로부터 제거된다. MySQL 5.0.3의
FUNCTION 신텍스 경우, 루틴에 대한 ALTER ROUTINE 권한이 있어야 한다. (이 권한은 루틴 생성자에게 자동으로 제공된다.) IF EXISTS 구문은
MySQL의 확장자며, 만일 프로시저 또는 함수가 존재하지 않을 경우 발생하는 에러를 방지해 주는 역할을 한다. 경고문은 SHOW
WARNINGS를 통해 볼 수 있다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=3&idx=4012006-08-08 오후 6:24:06
:::MySQL Korea:::
제목검색
17.2.4 CALL 명령문 신텍스 CALL 명령문은 CREATE PROCEDURE으로 정의된 프로시저를 호출한다.
CALL 명령문은 OUT 또는 INOUT파라미터로 선언한 파라미터를 사용해서 그것을 호출한 곳에 값을 되돌려 줄 수 있다. 또한, 이
것은 해당되는 열의 수를 “returns” 해 주는데, 이 열의 수는 ROW_COUNT()함수를 호출 함으로서 SQL 레벨에서 클라이언트
프로그램이 확보할 수 있는 수 이며, mysql_affected_rows() C API 함수를 호출해서 C로부터 확보할 수 있는 값이기도 하다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=4&idx=4032006-08-08 오후 6:24:09
:::MySQL Korea:::
제목검색
END [end_label]
BEGIN ... END 신텍스는 복합 명령문을 작성하기 위해 사용되는데, 이것은 스토어드 루틴 및 트리거 내에서도 나타날 수 있다 복
합 명령문은 BEGIN과 END키워드로 둘러싸인 다중 명령문을 포함할 수 있다. statement_list 는 하나 또는 그 이상의 명령문 리스
트를 나타낸다. statement_list 안에 있는 각 명령문은 반드시 세미콜론(;)명령문 구분 문자로 종료 되어야 한다. Note that
statement_list 는 옵션 사항임의 고려해야 하는데, 이것은 (BEGIN END)와 같은 빈 복합 명령문도 유효한 문장임을 의미하는 것
이다.
다중 명령문의 사용은 클라이언트가 ; 명령문 구분 문자를 갖는 명령문 스트링을 보낼 수 있음을 요구한다. 이것은 delimiter 명령
어를 갖는 mysql 커맨드-라인 클라이언트에서 다루어진다. Changing end-of-statement 구분자인 ; 를 변경 함으로서 (예를 들
면, // 로), ; 가 루틴 안에서도 사용될 수 있도록 할 수 있다. Section 17.2.1, “CREATE PROCEDURE 및 CREATE
FUNCTION 신텍스”에서 예시를 참조하기 바람.
복합 명령문은 레이블화 될 수 있다. end_label 은 begin_label 이 표시되지 않으면 사용할 수 없다. 만일 두 개 모두 표시되면, 이
들은 동일한 것이 되어야 한다.
옵션 [NOT] ATOMIC 구문은 아직은 지원하지 않는다. 이것은 어떠한 트랜잭셔널 세이브포인트(transactional savepoint)도 명
령문의 시작에서 설정되지 않으며 이 문장에서 사용되는 BEGIN 구문이 현재의 트랜잭션에 영향을 주지 않는다는 것을 의미한다.
제목검색
17. 스토어드 프로시저와 함수 DECLARE 명령문은 다양한 로컬 아이템을 루틴에서 정의하는데 사용된다:
17.2. 스토어드 프로시저 신텍스
17.2.6 DECLARE 명령문 신텍스 ● 로컬 변수. Section 17.2.7, “스토어드 루틴내의 변수” 참조.
● Conditions 및 handlers. Section 17.2.8, “Conditions 및 Handlers” 참조.
● Cursors. Section 17.2.9, “Cursors” 참조.
DECLARE 는 오로지 BEGIN ... END 복합 명령문 내에서만 사용할 수 있으며 다른 어떤 명령문보다 먼저 시작을 해야 한다.
선언문은 반드시 특정 순서를 따라야 한다. 커서(Cursors)는 핸들러를 선언하기 전에 선언되어야 하며, 또한 변수와 컨디션은 커
서 또는 핸들러가 선언되기 전에 선언되어야 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=6&idx=4112006-08-08 오후 6:24:12
:::MySQL Korea:::
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=7&idx=4142006-08-08 오후 6:24:13
:::MySQL Korea:::
제목검색
17.2.7.1. DECLARE 로컬 변수
상위메뉴리스트 ◆
17.2.7 스토어드 루틴내의 변수 이 명령문은 로컬 변수를 선언하는데 사용된다. 변수에 디폴트 값을 제공하기 위해서는, DEFAULT 구문을 포함시킨다. 하나의 수
식으로 값을 명기할 수 있다; 이 값이 상수(constant)일 필요는 없다. 만일DEFAULT 구문을 빠트리게 되면, 초기 값은 NULL이
17.2.7.1 DECLARE 로컬 변수
된다.
17.2.7.2 변수 SET 명령문
17.2.7.3 SELECT ..
로컬 변수는 데이터 타입과 오버 플로우 체킹에 관련하여 루틴의 파라미터처럼 취급된다. Section 17.2.1, “CREATE
PROCEDURE 및 CREATE FUNCTION 신텍스” 참조.
로컬 변수의 범위는 변수가 선언되는 곳의 BEGIN ... END 블록으로 제한된다. 변수는 선언된 블록 내에서 네스티드(nested)된 블
록 안에서도 참조될 수 있는데, 이러한 블록들이 동일한 이름을 갖는 변수를 선언할 경우는 제외된다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=7&idx=4172006-08-08 오후 6:24:14
:::MySQL Korea:::
제목검색
17.2.7 스토어드 루틴내의 변수 스토어드 루틴내의 SET 명령문은 일반적인 SET 명령문의 확장된 버전이다. 참조된 변수는 루틴 내에서 선언된 것이거나, 또는 글
로벌 시스템 변수가 선언한 것이 될 수도 있다.
17.2.7.1 DECLARE 로컬 변수
17.2.7.2 변수 SET 명령문
스토어드 루틴내의SET 명령문은 이미 존재하는(the pre-existing) SET 신텍스의 일부분처럼 실행된다. 이것은 서로 다른 변수
17.2.7.3 SELECT ..
의 타입(로컬로 선언된 변수 및 글로벌 및 세션 서버의 변수)이 서로 섞이는 곳에서 SET a=x, b=y, ... 의 확장된 신텍스를 허용한
다. 이것은 또한 로컬 변수와 시스템 변수에만 해당하는 몇몇 옵션들을 조합하는 것을 허용한다; 이럴 경우, 옵션들은 인식은 되지
만 무시되어 버린다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=7&idx=4192006-08-08 오후 6:24:15
:::MySQL Korea:::
제목검색
17.2.7 스토어드 루틴내의 변수 이와 같은 SELECT 신텍스는 선택한 컬럼을 변수에 직접 저장한다. 따라서, 오로지 단일 열(single row)만이 복구될 수도 있다.
17.2.7.1 DECLARE 로컬 변수
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
17.2.7.2 변수 SET 명령문
17.2.7.3 SELECT ..
사용자 변수 이름은 대소문자 구분을 하지 않는다. Section 9.3, “사용자 지정 변수” 참조.
Important : SQL 변수 이름은 컬럼 이름과 서로 달라야 한다. 만일, SELECT ... INTO 명령문과 같은 SQL 명령문이, 선언된 로
컬 변수와 컬럼의 이름이 동일한 참조를 하게 되면, MySQL은 참조를 변수의 이름으로 해석하게 된다. 예를 들어, 아래의 명령문에
서 보면, xname 은 xname column 이 아니라 xname 변수로 해석하게 된다 :
BEGIN
SELECT newname;
END;
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=8&idx=4232006-08-08 오후 6:24:18
:::MySQL Korea:::
제목검색
| mysql_error_code
이 명령문은 특정 핸들링을 필요로 하는 컨디션을 표시한다. 이것은 명기된 에러 컨디션이 있는 이름과 관련을 갖는다. 그 이름은
DECLARE HANDLER 명령문에서 순차적으로 사용될 수 있다. Section 17.2.8.2, “DECLARE Handlers” 참조.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=8&idx=4252006-08-08 오후 6:24:19
:::MySQL Korea:::
제목검색
CONTINUE
| EXIT
| UNDO
condition_value:
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code
DECLARE ... HANDLER 명령문은 핸들러를 지정하는데, 각 핸들러는 하나 또는 여러 개의 컨디션을 다루게 할 수 있다. 만일 이
러한 컨디션 중에서 하나가 발생하면, 지정된 statement 가 실행된다. statement 는 단순 명령문이 될 수도 있고(예를 들어, SET
var_name = value), 또는 BEGIN 과 END로 쓰여진 복합 명령문이 될 수도 있다. ( Section 17.2.5, “BEGIN ... END 복합 명령
문 신텍스” 참조).
CONTINUE 핸들러의 경우, 현 루틴의 실행은 핸들러 명령문의 실행 이후에 진행된다. EXIT 핸들러의 경우는, 핸들러가 선언된
곳의 BEGIN ... END 복합 명령문을 종료시킨다. (이것은 컨디션이 내부의 블록에서 발생될 경우에도 해당된다.) UNDO 핸들러
타입 명령문은 아직 지원되지 않는다.
만일 어떠한 핸들러도 선언되지 않은 상태에서 컨디션이 발생하면, 디폴트로 EXIT 핸들러가 실행된다.
예제:
mysql> delimiter //
-> BEGIN
-> SET @x = 1;
-> SET @x = 2;
-> SET @x = 3;
-> END;
-> //
+------+
| @x |
+------+
|3 |
+------+
위의 예제는 SQLSTATE 23000과 관련된 핸들러이며, 이것은 이중(double) 키 에러를 발생시킨다. @x 는 3이 되며, 이것은
MySQL이 프로시저의 마지막에 실행됨을 보여주는 것이다. 만일DECLARE CONTINUE HANDLER FOR SQLSTATE
'23000' SET @x2 = 1; 이 표시되지 않으면, MySQL은 두 번째 INSERT가 PRIMARY KEY 의 제한으로 인해 실패한 후에 디폴
트 경로(EXIT)을 실행하게 되며, SELECT @x는 2를 리턴하게 된다.
만일 컨디션을 무시하고자 하면, CONTINUE 핸들러를 빈 블록과 연결해서 선언하면 된다. 예를 들면:
제목검색
예제:
BEGIN
DECLARE a CHAR(16);
OPEN cur1;
OPEN cur2;
REPEAT
IF b < c THEN
ELSE
END IF;
END IF;
CLOSE cur1;
CLOSE cur2;
END
제목검색
17.2.9 커서(Cursors) 이 명령문은 커서를 선언하는 것이다. 다중 커서는 루틴 내에서 선언될 수도 있으나, 주어진 블록내의 각 커서는 반드시 서로 다른
이름을 가져야 한다 . SELECT 명령문은 INTO 구문을 가질 수 없다.
17.2.9.1 Cursors 선언하기
17.2.9.2 Cursor OPEN 명령문
17.2.9.3 Cursor FETCH 명령문
17.2.9.4 Cursor CLOSE 명령문
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=9&idx=4362006-08-08 오후 6:24:25
:::MySQL Korea:::
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=9&idx=4392006-08-08 오후 6:24:26
:::MySQL Korea:::
제목검색
17.2.9 커서(Cursors) 이 명령문은 지정한 오픈 커서를 이용해서 바로 다음 열(만일 열이 존재한다면)을 가져온 다음, 커서 포인터를 전진 시킨
다.
17.2.9.1 Cursors 선언하기
17.2.9.2 Cursor OPEN 명령문
17.2.9.3 Cursor FETCH 명령문
17.2.9.4 Cursor CLOSE 명령문
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=9&idx=4422006-08-08 오후 6:24:26
:::MySQL Korea:::
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=9&idx=4432006-08-08 오후 6:24:27
:::MySQL Korea:::
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=10&idx=4452006-08-08 오후 6:24:29
:::MySQL Korea:::
제목검색
17.2.10.1. IF 명령문
상위메뉴리스트 ◆
17.2.10.1 IF 명령문
[ELSE statement_list]
17.2.10.2 CASE 명령문
17.2.10.3 LOOP 명령문
END IF
17.2.10.4 LEAVE 명령문
17.2.10.5 ITERATE 명령문 IF 문장은 기본적인 조건문을 제공한다. 만일search_condition 의 조건에 맞으면, 이에 대응하는 SQL명령문 리스트가 실행된다.
17.2.10.6 REPEAT 명령문 만일 search_condition 의 조건이 일치하지 않으면, ELSE 구문에 있는 명령문 리스트가 실행된다. 각 statement_list 는 한 개 또
17.2.10.7 WHILE 명령문 는 그 이상의 명령문으로 구성된다.
Note: 또한, IF() 함수가 있는데, 여기에서 기술한 IF 명령문과 다른 형태로서, Section 12.2, “Control Flow Functions”를 참
조하기 바람.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=10&idx=4482006-08-08 오후 6:24:35
:::MySQL Korea:::
제목검색
17.2.10.1 IF 명령문
[WHEN when_value THEN statement_list] ...
17.2.10.2 CASE 명령문
17.2.10.3 LOOP 명령문
[ELSE statement_list]
17.2.10.4 LEAVE 명령문
17.2.10.5 ITERATE 명령문 END CASE
17.2.10.6 REPEAT 명령문
17.2.10.7 WHILE 명령문 Or:
CASE
[ELSE statement_list]
END CASE
스토어드 루틴에 대한CASE 명령문은 복합 조건문 구성을 실행한다. 만일 search_condition 의 조건이 일치하면, 이에 대응하는
SQL 명령문 리스트가 실행된다. 만일 일치하는 조건이 없는 경우에는, ELSE구문에 있는 명령문 리스트가 실행된다. 각
statement_list 는 한 개 또는 그 이상의 명령문으로 구성된다.
Note: 스토어드 루틴 내에서 사용하기 위한 CASE statement 의 신텍스는 Section 12.2, “Control Flow Functions”에서 다루
는 SQL CASE expression과는 약간 다른 형태이다. CASE 명령문은 ELSE NULL 구문을 가질 수 없으며, 또한 END 대신에
END CASE로 종료를 시킨다.
제목검색
17.2.10.1 IF 명령문
END LOOP [end_label]
17.2.10.2 CASE 명령문
17.2.10.3 LOOP 명령문
LOOP 는 단일 루프 구성을 형성하고, 명령문의 반복 실행을 가능하게 해주며, 한 개 또는 그 이상의 명령문으로 구성 되어진다. 루
17.2.10.4 LEAVE 명령문
프안에 있는 명령문은 루프가 종료되기 전까지 계속 반복 실행을 한다; 일반적으로 이 명령문은 LEAVE 명령문과 함께 실행된다.
17.2.10.5 ITERATE 명령문
17.2.10.6 REPEAT 명령문 LOOP 명령문은 레이블화 시킬 수 있고, end_label 는 begin_label 을 표시한 후에 작성해야 한다. 양쪽 모두 표시할 때에는 동일
17.2.10.7 WHILE 명령문 한 이름을 사용해야 한다.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=10&idx=4532006-08-08 오후 6:24:38
:::MySQL Korea:::
제목검색
17.2.10 플로우 컨트롤(Flow Control) 구성 이 명령문은 모든 레이블화된 플로우 제어 구성문을 빠져 나올 때 사용하는 명령문이다. 이것은 BEGIN ... END , 또는 루프 구성문
(LOOP, REPEAT, WHILE)안에서도 사용 가능하다.
17.2.10.1 IF 명령문
17.2.10.2 CASE 명령문
17.2.10.3 LOOP 명령문
17.2.10.4 LEAVE 명령문
17.2.10.5 ITERATE 명령문
17.2.10.6 REPEAT 명령문
17.2.10.7 WHILE 명령문
http://www.mysqlkorea.com/develop/sub_07.html?lcate=17&mcate=2&scate=10&idx=4562006-08-08 오후 6:24:39
:::MySQL Korea:::
제목검색
17.2.10 플로우 컨트롤(Flow Control) 구성 ITERATE 는 LOOP, REPEAT, 및 WHILE 명령문안에서만 사용할 수 있다. ITERATE 는 “루프를 다시 실행(do the loop
again)”의 의미이다.
17.2.10.1 IF 명령문
17.2.10.2 CASE 명령문
예제:
17.2.10.3 LOOP 명령문
17.2.10.4 LEAVE 명령문
CREATE PROCEDURE doiterate(p1 INT)
17.2.10.5 ITERATE 명령문
17.2.10.6 REPEAT 명령문 BEGIN
17.2.10.7 WHILE 명령문
label1: LOOP
SET p1 = p1 + 1;
LEAVE label1;
SET @x = p1;
END
제목검색
17.2.10.1 IF 명령문
UNTIL search_condition
17.2.10.2 CASE 명령문
17.2.10.3 LOOP 명령문
END REPEAT [end_label]
17.2.10.4 LEAVE 명령문
17.2.10.5 ITERATE 명령문 REPEAT 명령문 내에 있는 명령문 리스트는 search_condition 의 조건이 일치하는 동안 반복적으로 실행된다. 따라서,
17.2.10.6 REPEAT 명령문 REPEAT 는 항상 적어도 한번은 루프 안에 표현되어야 한다. statement_list 는 한 개 또는 그 이상의 명령문으로 구성된다.
17.2.10.7 WHILE 명령문
REPEAT명령문은 레이블화 될 수 있다. end_label 는 begin_label 과 함께 표시되어야 한다. 양쪽 모두는 동일한 이름으로 표시되
어야 한다.
예제:
mysql> delimiter //
-> BEGIN
-> SET @x = 0;
-> END
-> //
+------+
| @x |
+------+
| 1001 |
+------+
제목검색
17.2.10.1 IF 명령문
END WHILE [end_label]
17.2.10.2 CASE 명령문
17.2.10.3 LOOP 명령문
The statement list within a WHILE 명령문 내에 있는 명령문 리스트는 search_condition 조건이 일치하는 동안 반복적으로 실
17.2.10.4 LEAVE 명령문
행된다. statement_list 는 한 개 또는 그 이상의 명령문으로 구성된다.
17.2.10.5 ITERATE 명령문
17.2.10.6 REPEAT 명령문 WHILE 명령문은 레이블화할 수 있다. end_label 은 begin_label 과 함께 표시되어야 하고, 양쪽은 모두 동일한 이름을 사용하여
17.2.10.7 WHILE 명령문 야 한다.
예제:
BEGIN
WHILE v1 > 0 DO
...
SET v1 = v1 - 1;
END WHILE;
END
제목검색
예, 마스터 서버상에서 정상적인 DDL명령문의 수행으로 생성된 스토어드 프로시저 와 함수는 슬레이브
서버로 복사본이 전달되며, 따라서 오브젝트는 양쪽 서버에 존재하게 됩니다. 스토어드 프로시저 및 함수
에 대한ALTER 및 DROP 명령문 역시 복사 되어 집니다.
예. 슬레이브 서버가 마스터 서버의 바이너리 로그로부터 명령문을 읽기 위해서는 권한이 있어야 하기 때
문에, 리플리케이션이 있는 스토어드 함수를 사용하기 위한 특정 보안 제약 사항이 있습니다. 만일 일반적
인 상황(특정 시점 복구를 위해)에서 리플리케이션 또는 바이너리 로깅이 실행되면, MySQL DBA는 이것
을 열기 위해 두 가지 보안 옵션을 가져야 합니다:
Note: MySQL 5.0.16 이전에는, 이러한 제한 사항이 스토어드 프로시저에도 적용되었고 시스템 변수의
이름은log_bin_trust_routine_creators 입니다.
Triggers and replication in MySQL 5.0에서 트리거와 리플리케이션은 다른 데이터 베이스 엔진에서와
똑같이 동작을 합니다: 마스터 서버상에서 트리거를 통해 수행되는 동작은 슬레이브에 복사되지 않습니
다. 대신에, MySQL마스터 서버상에 있는 테이블에 존재하는 트리거는 MySQL슬레이브 서버위에 이에
대응하는 테이블을 생성할 필요가 있는데, 이렇게 하면 트리거는 서버뿐만 아니라 슬레이브에서도 동작을
하게 됩니다.
첫 번째, 마스터에 존재하는 트리거는 슬레이브상에서 재생성 되어야 합니다. 일단 이것이 수행되면, 레프
리케이션 플로우는 리플리케이션에 참여하는 다른 어떤 표준 DLM명령문처럼 동작을 합니다. 예를 들면,
AFTER삽입 트리거를 갖고 있는 EMP 테이블이 있고, 이것이 MySQL 마스터 서버에 존재한다고 가정합
니다. 동일한 EMP 테이블 및 AFTER 삽입 트리거는 슬레이브에도 역시 존재합니다. 리플리케이션 플로
우는 다음과 같습니다:
제목검색
이 섹션에서는 MySQL 5.0에 있는 스토어드 루틴(프로시저 및 함수)와 트리거에 관련된 바이너리 로깅의 개발을 설명하도록 하겠
다. 첫 번째로는 로깅 실행에서 발생하는 변경 사항에 대해 정리를 할 것이고, 그 다음에는 스토어드 루틴의 사용에서 있게 되는 실
행의 현재 조건문(current condition)에 대해 언급하기로 한다. 마지막으로, 언제 그리고 어떻게 다앵한 변경이 만들어 지는지에
대한 정보를 제공하는 실행에 대한 자세한 내용을 설명하겠다. 이러한 상세 내용들은 현재의 로깅 행위에 관련된 몇몇 사항이 이전
버전과는 어떻게 달리 실행되는지를 보여 준다.
일반적으로, 여기에서 설명하는 논제들은 바이너리 로깅이 SQL명령문 레벨에서 생긴다는 사실에서부터 출발한다. 향후의 MySQL
버전은 로우-레벨(row-level) 바이너리 로깅을 실행할 예정이며, SQL명령문의 실행으로 인해 각 개별 열(row)을 변경시키는
것을 열거할 것이다.
다른 것들은 고려하지 말고, --log-bin옵션으로 서버를 구동해서 바이너리 로깅을 활성화 시켰다고 가정하자.
( Section 5.12.3, “The Binary Log” 참조.) 만일 바이너리 로그가 활성화 되지 않는다면, 리플리케이션은 불가능하게 되거나,
또는 데이터 복구를 위한 바이너리 로그가 불가능하게 된다.
MySQL 5.0 에서 스토어드 루틴 로깅의 개발은 아래와 같이 요약할 수 있다 :
● MySQL 5.0.6 이전 버전 : 스토어드 루틴 로깅의 초기 실행에서, 스토어드 루틴과 CALL 명령문을 생성하는 명령문은 로
그 되지 않음. 이러한 누락은 리플리케이션과 데이터 복구에 문제를 야기할 수 있다.
● MySQL 5.0.6 : 스토어드 루틴과 CALL 명령문을 생성하는 명령문은 로그 되어짐. 스토어드 함수 호출은 데이터를 업데
이트 하도록 하는 명령문이 실행될 때 로그 되어 진다 (이러한 명령문들이 로그 되어졌기 때문에). 하지만, 비록 함수 자체
에서 데이터의 변경이 이루어 진다 하더라도, 데이터를 변경시키지 않는 SELECT와 같은 명령문이 실행될 때에는 로그 되
어지지 않는다; 이것은 문제를 일으키게 된다. 어떤 환경에서는, 서로 다른 시간 또는 서로 다른(서버 및 슬레이브)기계에
서 함수 및 프로시저가 실행된다면 서로 다른 영향을 받을 수 있기 때문에 데이터 복구 또는 리플리케이션 자체가 불안정
할 수 있다. 이런 문제를 처리하기 위해, 안정적인 루틴의 동일성을 제공하고, 충분한 권한을 갖고 있는 사용자에 의한 행위
를 제외한, 일반적으로 불안정한 루틴을 방지하기 위한 조치가 실행된다.
● MySQL 5.0.12: 스토어드 함수에 대해서는, 데이터를 변경시키는 함수 호출이 SELECT와 같이 로그 되지 않는(non-
logged)명령어 내에서 발생할 때, 서버는 그 함수를 호출하는 DO 명령문을 로그 시킴으로써 데이터가 복구되거나 슬레이
브 서버에 리플리케이션되는 동안 함수가 실행되도록 한다. 스토어드 프로시저에 대해서는, 서버는 CALL 명령문을 로그
시키지 못한다. 대신에, 서버는 CALL명령문의 결과로 실행되는 프로시저에 포함되어 있는 개별 명령문은 로그 시킨다. 이
것은 프로시저가 마스터 서버가 아닌 슬레이브 서버상에서 서로 다른 실행 경로를 따라 실행될 때 발생할 수 있는 문제들
을 제거한다.
● MySQL 5.0.16: MySQL 5.0.12에서 제공하는 프로시저 로깅 변경을 통해 불안정한 루틴상의 조건문이 스토어드 프로시
저에 대해 안정적으로 동작하도록 해 준다. 따라서, 이러한 조건문을 제어하는 사용자 인터페이스를 함수에 적용 되도록 수
정한다. 프로시저 생성자를 더 이상 제한 할 수 없게 되는 것이다.
● 앞에서 설명한 변경의 결과로, 바이너리 로깅이 활성화될 때에 다음에서 설명하는 조건문을 스토어드 함수에 적용할 수 있
게 된다. 이러한 조건문은 스토어드 프로시저 생성에는 적용되지 않는다.
● 스토어드 함수를 생성 또는 변경하기 위해서는, 일반적으로 CREATE ROUTINE 또는 ALTER ROUTINE 권한을 요구하
는 것에 더불어. 반드시 SUPER 권한을 가져야 한다.
● 스토어드 함수를 생성할 때에는, 그것이 확정적(deterministic)인지 또는 그것이 데이터를 수정하는 않는다는 것을 선언해
야 한다. 그렇지 않으면, 그 함수는 데이터 복구 또는 리플리케이션에 대해 덜 안정한 상태가 되어 버린다. 함수의 특성 중
에 두 가지가 여기에 적용된다 :
❍ DETERMINISTIC and NOT DETERMINISTIC 특성은 함수가 주어진 입력 값에 대해 항상 동일한 결과를 만드
는지 아닌지를 나타낸다. 어떤 특성도 주어지지 않으면, 디폴트는NOT DETERMINISTIC 이며, 따라서 함수를 확
정적인 것으로 선언하기 위해서는 DETERMINISTIC를 확실하게 지정해 주어야 한다.
❍ NOW() 함수(또는 동일 기능 함수) 또는 RAND()의 사용은 함수를 반드시 non-deterministic하게 만들어 주는
것은 아니다. NOW()의 경우, 바이너리 로그는 타임스탬프와 복사본은 올바르게 포함한다. 또한, RAND()도 함수
내에서 일단 한번 호출 되어 지면 정확하게 복사본을 만들게 된다. (함수 실행 타임스탬프 및 무작위 수는 마스터
서버 및 슬레이브 상에 있는 동일한 암시적 입력(implicit input)으로 간주할 수 있다.)
❍ CONTAINS SQL, NO SQL, READS SQL DATA, 및 MODIFIES SQL DATA 특성은 함수가 데이터를 읽거나
또는 쓰는 정보를 제공한다. NO SQL 또는 READS SQL DATA 는 함수가 데이터를 변경하지 않는다는 것을 나타
내는 것이다. 하지만 어떠한 특성도 주어지지 않으면 디폴트가 CONTAIN SQL이 되기 때문에 반드시 이러한 것
중에 하나를 명확히 지정해 주어야 한다.
MySQL 5.0.6 이전 버전에서 루틴 로깅: 스토어드 루틴을 생성하고 사용하는 명령문이 바이너리 로그되는 것이 아니라, 스토어드
루틴내에서 선언된 명령문이 로그되어 진다. 아래의 명령문을 작성 하였다고 가정하자:
CREATE PROCEDURE mysp INSERT INTO t VALUES(1);
CALL mysp;
이 예에서 보면, INSERT 명령문만이 바이너리 로그에서 나타난다. CREATE PROCEDURE 와 CALL 명령문은 나타나지 않는
다. 바이너리 로그에서 루틴 관련(routine-related) 명령문이 없다는 것은 스토어드 루틴이 올바르게 복사되지 않았다는 것을 의
미한다. 이것은 또한 데이터 복구 동작에 대해, 바이너리 로그에 있는 이벤트의 재실행은 스토어드 루틴를 복구시키지 않는다는 것
을 의미하기도 한다.
MySQL 5.0.6에서 루틴 로깅 변경: 스토어드 루틴 생성과 CALL 명령문(그리고 관련된 리플리케이션 및 데이터 복구 문제)에 대
한 로깅 부재를 연결(address)하기 위해, 스토어드 루틴에 대한 바이너리 로깅의 특성은 여기에서 설명하였듯이 변경되었다. (아
래의 리스트중에 몇 가지 항목은 다음 버전에서 다루어지기 때문에 제외한다.)
비록 사용자가 루틴을 생성하기 위해서는 반드시 CREATE ROUTINE권한을 가져야 함을 의미 하지만, 전체 권한을 갖
는 SQL 쓰레드가 실행하는 명령문이 있는 슬레이브 위에서만 실행될 위험한 명령문을 작성할 수 있다. 예를 들면, 마스터
와 슬레이브 서버가 서버 ID 1과 2를 갖고 있다면, 마스터 서버의 사용자는 아래와 같이 불안정한 프로시저 unsafe_sp()
를 생성해서 호출할 수 있다:
mysql> delimiter //
mysql> CREATE PROCEDURE unsafe_sp ()
-> BEGIN
-> IF @@server_id=2 THEN DROP DATABASE accounting; END IF;
-> END;
-> //
mysql> delimiter ;
mysql> CALL unsafe_sp();
CREATE PROCEDURE 와 CALL 명령문은 바이너리 로그를 작성할 수 있고, 따라서 슬레이브는 이것을 실행할 수 있
다. 슬레이브 SQL 쓰레드는 전체 권한이 있기 때문에, accounting 데이터 베이스를 끝내는(drop) DROP DATABASE
명령문을 실행한다. 따라서, CALL 명령문은 마스터와 슬레이브에서 서로 다른 영향을 받게 되고, 이것은 리플리케이션이
안전하게 이루어 지지 않게 된다.
앞선 예문은 스토어드 프로시저를 사용하고 있으나, 바이너리 로그를 작성하는 명령문 내에서 호출되는 스토어드 함수에
대해서도 비슷한 문제가 발생한다: 함수 호출은 마스터와 슬레이브에 서로 다른 효과를 나타낸다.
바이너리 로깅을 갖는 서버에 대해 이러한 위험을 피하도록 하기 위해, MySQL 5.0.6은 스토어드 프로시저와 함수는 반드
시 일반적인 CREATE ROUTINE 권한을 요구하는 것과 아울러 SUPER권한을 갖도록 한다. 비슷하게, ALTER
PROCEDURE 또는 ALTER FUNCTION을 사용하기 위해서는, ALTER ROUTINE
제목검색
18.3 트리거 사용하기 object )로서, 테이블과 연관되어 있으며, 특정 이벤트가 테이블에 대해 발생하면 동작을 하게 된다. 예를 들면, 아래의 명령문은 하
나의 테이블과 하나의 INSERT 트리거를 생성한다. 트리거는 테이블의 컬럼에 삽입된 값들을 더하게 한다.:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
http://www.mysqlkorea.com/develop/sub_07.html?lcate=18&mcate=0&scate=0&idx=4762006-08-08 오후 6:25:30
:::MySQL Korea:::
제목검색
이 명령문은 새로운 트리거를 생성한다. 트리거는 테이블과 연관된 이름이 있는 데이터 베이스 오브젝트이며, 특정 이벤트가 테이
블에 대해 발생할 경우 동작을 하게 된다. CREATE TRIGGER 는 MySQL 5.0.2에 추가된 기능이다. 현재까지는, 이것을 사용하
기 위해서는 SUPER 권한이 필요하다.
트리거는 tbl_name 로 명기된 테이블과 연결되어 있는데, 이것은 영구(Permanent)테이블을 참조하여야 한다. 트리거를
TEMPORARY테이블 또는 하나의 뷰(view)에 연결할 수는 없다.
트리거가 활성화되면, DEFINER 구문은 이 섹션의 후반부에 설명하는 적용 가능한 권한을 판단하게 된다.
trigger_time 는 트리거의 동작 시간이다. 이는 트리거를 명령문 실행 전에 활성화 시킬지 또는 후에 활성화 시킬지를 나타내는
BEFORE 또는 AFTER 가 될 수 있다.
trigger_event 는 트리거를 활성화 시키는 명령문의 종류를 나타낸다. trigger_event 는 아래의 것 중에 하나가 될 수 있다:
● INSERT: 트리거는 새로운 줄(row)이 테이블 속으로 삽입될 때마다 활성화 된다; 예를 들면, INSERT, LOAD DATA,
및 REPLACE 명령문을 통해서.
● UPDATE: 트리거는 하나의 줄이 수정될 때마다 활성화된다; 예를 들면, UPDATE 명령문을 통해.
● DELETE: 트리거는 하나의 줄이 테이블에서 삭제될 때마다 활성화 된다; 예를 들면, DELETE 및 REPLACE 명령문을 통
해.
trigger_event 는 트리거를 활성화 시킬 때 테이블 동작의 형태를 표현하는 것과 같이 SQL명령문의 문자 타입을 표현하지 않는다
는 점을 이해하는 것이 중요하다. 예를 들면, INSERT 트리거는 INSERT명령문 뿐만 아니라 LOAD DATA명령문에 의해서도 활
성화 되어지는데, 이것은 두 가지 명령문 모두 테이블에 줄을 삽입하기 때문이다.
INSERT INTO ... ON DUPLICATE KEY UPDATE ... 는 혼란스러움을 줄 수 있는 예문이다: BEFORE INSERT 트리거는 모
든 중에 대해 활성화가 되는데, AFTER INSERT 또는 BEFORE UPDATE 와 AFTER UPDATE 가 모두 따라오게 되는데, 줄이
이중화 되어 있는지에 따라 쓸 수 있다.
동일한 트리거 동작 시간 및 이벤트를 갖는 테이블에 대해서는 두 개의 트리거를 가질 수 없다. 예를 들면, 한 테이블에 대해 두 개
의 BEFORE UPDATE 트리거를 가질 수 없다. 하지만, 한 개의 BEFORE UPDATE 와 한 개의 BEFORE INSERT 트리거는 가
질 수 있거나, 또는 한 개의 BEFORE UPDATE 와 한 개의 AFTER UPDATE 트리거는 가질 수 있다.
trigger_stmt 는 트리거가 활성화될 때 실행할 수 있는 명령문이다. 만일, 다중 명령문을 실행하고자 한다면, BEGIN ... END 복합
명령문 구성을 사용하면 된다. 이것은 스토어드 루틴내에서 사용 가능한 동일한 명령문에서도 적용할 수 있다 Section 17.2.5,
“BEGIN ... END 복합 명령문 신텍스” 참조.
Note: 현재의 버전에서는, 연속적인 외국어 키 동작(cascaded foreign key actions )으로 트리거를 활성화 시킬 수는 없다. 이 제
약 사항은 가능한 한 빠른 시간 내에 수정될 예정이다.
Note: MySQL 5.0.10 이전에는, 이름을 가지고 직접 테이블을 참조할 수는 없었다. MySQL 5.0.10이후에는, 이 예문에서 보듯
이, testref 로 명기된 것과 같은 트리거를 사용할 수 있게 된다:
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);
DELIMITER |
DELIMITER ;
제목검색
상위메뉴리스트 ◆
18.2. DROP TRIGGER 신텍스
18. 트리거
DROP TRIGGER [schema_name.]trigger_name
18.2. DROP TRIGGER 신텍스
18.2 DROP TRIGGER 신텍스 이 명령문은 트리거를 드롭(drop) 시킨다. 스키마(데이터베이스)이름은 옵션 사항이다. 만일 스키마가 생략되면, 트리거는 디폴트
스키마로부터 드롭 된다. DROP TRIGGER은 MySQL 5.0.2에서 추가 되었다. 이것을 사용하기 위해서는 SUPER권한이 요구된
다.
Note: MySQL 5.0.10 이전에서는, 스키마 이름(table_name.trigger_name ) 대신에 테이블 이름이 필요하였다. MySQL 5의 이
전 버전에서 MySQL 5.0.10 또는 그 이상의 버전으로 업그레이드할 때에는, you must drop all triggers 업그레이드를 하기 전에
반드시 모든 트리거를 드롭 시키고 나중에 다시 재생성 시켜야 하며, 그렇게 하지 않으면 DROP TRIGGER 는 업그레이드 후에 동
작을 하지 않게 된다. 업그레이드 과정에 대한 제안에 대해서는 Section 2.10.2, “MySQL 4.1에서5.0으로 업그레이드 하기”를
참조하기 바람.
http://www.mysqlkorea.com/develop/sub_07.html?lcate=18&mcate=2&scate=0&idx=4782006-08-08 오후 6:25:39
:::MySQL Korea:::
제목검색
● 키워드 BEFORE는 트리거 실행 시간을 가리킨다. 이와 같은 경우, 트리거는 각 줄이 테이블에 삽입되기 전에 실행되어야
한다. 다른 사용 가능한 키워드는 AFTER이다.
● 키워드 INSERT는 트리거를 실행시키는 이벤트를 가리킨다. 예를 들면, INSERT 명령문은 트리거 실행을 일으킨다. 여러
분은 또한 DELETE 와 UPDATE 명령문을 위한 트리거도 생성할 수가 있다.
● FOR EACH ROW에 따라오는 명령문은 트리거 실행을 일으키는 명령문을 정의하는데, 트리거를 하는 명령문에 의해 영향
을 받는 각 줄에 한번씩 발생하게 된다. 예문에서 보면, 트리거가 된 명령문은 amount 컬럼 안으로 삽입되는 값을 합하는
단순한 SET이 된다. 그 명령문은 “새로운 줄 속으로 삽입되어지는 amount 컬럼의 값”을 의미하는 NEW.amount 의 형
태로 컬럼을 참조하고 있다.
트리거를 사용하기 위해서는, 누산기 변수를 0으로 설정하고, INSERT 명령문을 실행하고, 그 다음에는 변수의 값이 어떻게 나오
는지 보자:
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
이와 같은 경우, INSERT명령문이 실행된 다음에 나오는 @sum 의 값은 14.98 + 1937.50 - 100, or 1852.48이 된다.
트리거를 없애기 위해서는, DROP TRIGGER 명령문을 사용한다. 만일 트리거가 디폴트 스키마에 있지 않으면, 스키마의 이름을
정확히 지정해야 한다.:
mysql> DROP TRIGGER test.ins_sum;
트리거의 이름은 스키마 이름란에 존재해야 하고, 이것은 하나의 스키마에 있는 트리거들은 서로 다른 이름을 가져야 함을 의미한
다. 서로 다른 스키마에 있는 트리거들은 같은 이름을 가져도 된다..
트리거가 하나의 스키마에 대해 중복되지 않는 이름을 가져야 한다는 조건에 이외에도, 트리거를 생성하는데 있어서 몇 가지 다른
제약 사항도 있다. 특히, 하나의 테이블에는 동일한 활성화 시간 및 이벤트를 갖는 두 개의 트리거를 가질 수 없다. 예를 들면, 하나
의 테이블에 대해 두 개의 BEFORE INSERT 트리거 또는 두 개의 AFTER UPDATE 트리거를 가질 수 없다. 이것은 그다지 중요
하지 않은 제약 사항인데, 그 이유는 FOR EACH ROW 다음에BEGIN ... END 복합 명령문 구성을 사용해서 다중 명령문을 실행하
는 트리거를 정의할 수 있기 때문이다. (하나의 예문이 이 섹션 후반부에 있다.)
OLD 와 NEW 키워드를 사용해서 트리거에 의해 영향을 받는 줄에 있는 컬럼을 활성화 시킬 수 있다. (OLD 와 NEW 는 대소문자
구분을 하지 않음.) INSERT 트리거에는, NEW.col_name 만을 사용할 수 있다; 여기에는 이전 줄(old row)이 없다. DELETE 트
리거에는, OLD.col_name 만을 사용할 수 있다; 여기에는 새로운 줄(new row)이 없다. UPDATE 트리거에는, 줄(row)이 업데이
트되기 전에 그 줄에 있는 컬럼을 참조하도록 OLD.col_name 을 사용할 수 있으며, 줄이 업데이트된 후에 그 줄에 있는 컬럼을 참
조하도록 NEW.col_name 을 사용할 수 있다.
OLD 로 표시된 컬럼은 읽기 전용(read-only)이다. 만일 SELECT권한이 있다면 이것을 참조할 수는 있으나, 수정할 수는 없다.
NEW로 표시된 컬럼은, SELECT권한이 있다면, 참조될 수 있다. BEFORE 트리거에 있어서는, 이것에 대한 UPDATE권한이 있
는 경우에는 SET NEW.col_name = value 을 가지고 그 값을 변경할 수 있다. 이것은 트리거를 사용해서 새로운 줄에 삽입될 값
을 수정할 수 있거나 또는 줄을 업데이트할 수 있다는 것을 의미한다.
BEFORE 트리거에 있어서는, AUTO_INCREMENT 컬럼에 대한 NEW의 값은 0이 되며, 이 값은 실제로 새로운 기록이 삽입될
때 나오게 되는 자동 생성 시퀀스 숫자는 아니다.
OLD 와 NEW 는 트리거에 대한 MySQL의 확장 기능이다.
BEGIN ... END 명령문 구성을 사용해서, 다중 명령문을 실행하는 트리거를 정의할 수 있다. BEGIN 블록 안에서는, 조건문과 루
프 같은 스토어드 루틴 안에서 사용 가능한 다른 신텍스를 사용할 수도 있다. 하지만, 스토어드 루틴에 대한 것과 마찬가지로,
mysql 프로그램을 사용해서 다중 명령문을 실행하는 트리거를 정의하고자 한다면, 트리거 정의에서 ; 명령문 구획 문자를 사용하
기 위해서는MYSQL명령문 구획 문자(delimiter)를 재 정의하는 것이 필요하다. 다음의 예문은 이런 점을 표현하는 것이다. 여기에
서 UPDATE 트리거는 각 줄의 업데이트에 사용되는 새로운 값을 검사하도록 정의되며, 그리고 그 값이 0에서부터 100의 범위 내
에 있도록 수정한다. 이것은 값이 줄을 업데이트 하기 전에 검사되어야 하기 때문에 BEFORE 트리거가 되어야 한다:
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
-> FOR EACH ROW
-> BEGIN
-> IF NEW.amount < 0 THEN
-> SET NEW.amount = 0;
-> ELSEIF NEW.amount > 100 THEN
-> SET NEW.amount = 100;
-> END IF;
-> END;//
mysql> delimiter ;
이렇게 하면 스토어드 프로시저를 개별적으로 정의하고 그 다음에 간단한 CALL명령문을 사용하는 트리거로부터 호출하는 것을
더 쉽게 할 수 있다. 이것은 또한 몇몇 트리거 내에서부터 동일한 루틴을 호출하고자 할 경우에 장점을 가지게 된다.
트리거가 활성화 될 때 실행하는 명령문에는 몇 가지 제약 사항이 존재한다:
제목검색
http://www.mysqlkorea.com/develop/sub_07.html?lcate=19&mcate=0&scate=0&idx=4852006-08-08 오후 6:25:52
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
19.1. ALTER VIEW 신텍스
19. 뷰(Views)
ALTER
19.1. ALTER VIEW 신텍스
AS select_statement
이 명령문은 현재 존재하는 뷰의 정의를 변경하는 것이다. 신텍스는 CREATE VIEW에서와 비슷하다. Section 19.2,
“CREATE VIEW 신텍스”를 참조. 이 명령문은 뷰에 대해 CREATE VIEW 및 DROP 권한을 요구하고, 그리고 각 컬럼에 대한
몇 가지 권한은 SELECT명령문에 있는 것을 참조하였다..
이 명령문은 MySQL 5.0.1에서 추가 되었다. DEFINER 및 SQL SECURITY 구문은 MySQL 5.0.16에서 사용될 것인데, 뷰 호출
시점에 접속 권한을 검사할 때 사용되는 보안 문장을 지정하는데 사용된다.자세한 내용은 Section 19.2, “CREATE VIEW 신텍
스”를 참조 한다.
제목검색
검증되지 않은 테이블 또는 SELECT명령문에 있는 뷰 이름은 디폴트 데이터 베이스에 관련해서 해석된다. 뷰는 적절한 데이터 베
이스 이름을 가진 테이블 또는 뷰의 검증을 통해 다른 데이터 베이스에 있는 테이블 또는 뷰를 참조할 수 있다.
뷰는 많은 종류의 SELECT명령문을 가지고 생성할 수 있다. 뷰는 베이스 테이블 또는 다른 뷰를 참조할 수 있다. 뷰는 결합
(join), UNION, 및 서브쿼리(subqueries)를 사용할 수 있다. SELECT명령문은 다른 테이블을 참조할 필요는 없다. 아래의 예문
은 다른 테이블로부터 두 개의 컬럼을 선택하는 뷰를 정의하는 것인데, 이것은 또한 이렇게 선택한 컬럼으로부터 계산된 수식을 정
의하기도 한다:
mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3| 50 | 150 |
+------+-------+-------+
뷰의 정의에는 아래와 같은 제약 사항이 있다:
뷰 정의문에 ORDER BY를 사용할 수 있으나, 명령문 자체에 ORDER BY가 있는 명령문을 사용하는 뷰로부터 선택하는 것은 무시
된다.
정의문안에 있는 다른 옵션 또는 구문에 대해서는, 뷰를 참조하는 명령문의 옵션 또는 구문에 추가될 수는 있으나, 그 효과는 정의
되지 않는다. 예를 들면, 뷰 정의문이LIMIT구문을 포함한다면, 그리고 자체에 LIMIT구문을 갖는 명령문을 사용해서 뷰에서 선택
을 한다면, 그것이 어떤 제한을 적용하는지 정의되지 않는다. 이와 동일한 원칙이 SELECT키워드 뒤에 나오는 ALL, DISTINCT,
또는 SQL_SMALL_RESULT와 같은 옵션에도 적용되며, 또한INTO, FOR UPDATE, LOCK IN SHARE MODE, 및
PROCEDURE구문에도 적용된다.
만일 뷰를 생성한 후, 변경한 시스템 변수를 가지고 쿼리 프로세싱 환경을 변경시키면, 뷰로부터 얻게 되는 결과는 영향을 받는다:
mysql> CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));
Query OK, 0 rows affected (0.00 sec)
● SUPER권한이 없다면, 유일한 리걸(legal) user값은 여러분 자신의 계정만 된다. 다른 계정에 디파이너(definer)를 설정
할 수가 없다.
● SUPER권한이 있다면, 모든 리걸 계정 이름을 지정할 수 있다. 만약에 계정이 실제로 존재하지 않으면, 경고문이 나오게 된
다.
● 뷰 정의 시점에는, 뷰 생성기(creator)는 반드시 뷰가 접근하는 최상위 레벨의 오브젝트를 사용할 수 있는 권한이 있어야
한다. 예를 들면, 뷰 정의문이 스토어드 함수를 참조한다면, 함수를 호출하는데 필요한 권한만을 검사한다. 함수가 구동될
때에 필요한 권한은 함수가 실행될 때에만 검사된다: 함수에 대한 여러 가지 호출에 대해서는, 함수내의 서로 다른 실행 플
랜이 선택 된다.
● 뷰 실행 시점에는, 뷰가 접근하는 오브젝트에 대한 권한은 뷰 생성시 또는 호출기가 가지고 있는 권한에 대응해서 검사되는
MySQL 5.0.16 (DEFINER와 SQL SECURITY구문이 구현 되기 전에) 이전에는, 뷰에서 사용되는 오브젝트에 대한 요구 권한은
뷰 생성 시점에 검사 되었다.
예제: 뷰는 스토어드 함수에 의존 하며, 다른 스토어드 루틴을 호출하는 함수에도 의존하기도 한다. 예를 들면, 아래의 뷰는 스토어
드 함수 f()를 호출한다:
CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);
f()가 아래와 같은 명령문을 가지고 있다고 가정하자:
IF name IS NULL then
CALL p1();
ELSE
CALL p2();
END IF;
f()안에 있는 명령문 실행을 위해 필요한 권한은 need to be checked when f()이 실행될 때 검사할 필요가 있다. 이것은 f()안에
있는 실행 경로에 따라, p1()또는 p2()에 필요한 권한이 요구 된다는 것을 의미한다. 이러한 권한들은 런타임 시에 검사될 필요가
있고, 이러한 권한을 가지고 있어야 하는 사용자는 함수 f()와 뷰 v의 SQL SECURITY값을 가지고 결정된다.
뷰에 대한DEFINER와 SQL SECURITY구문은 표준 SQL에 대한 확장이다. 표준 SQL에서, 뷰는 SQL SECURITY INVOKER에
대한 규칙을 사용해서 다루어 진다.
MySQL 5.0.13 이전에 생성된 뷰를 호출 한다면, 그러한 뷰는 마치 SQL SECURITY INVOKER구문과 여러분 계정과 동일한
DEFINER값을 가지고 생성된 것처럼 취급된다. 하지만, 실제의 디파이너(definer)는 알려져 있지 않기 때문에, MySQL은 경고문
을 발생 시키게 된다. 경고문을 없애기 위해서는, 뷰를 재 생성해서 뷰 정의문이 DEFINER구문을 포함하도록 하는 것 만으로도 충
분하다.
선택 사항인 ALGORITHM구문은 표준 SQL에 대한 MySQL 확장이다. ALGORITHM은 세가지 값을 가진다: MERGE,
TEMPTABLE, or UNDEFINED. 디폴트 알고리즘은 ALGORITHM구문이 존재하지 않는다면, UNDEFINED이 된다. 알고리즘
은 MySQL이 뷰를 처리하는 방법에 영향을 준다.
MERGE의 경우, 뷰와 뷰 정의문을 참조하는 명령문의 문장은 명령문의 부분과 상응되는 뷰 대체 정의문 부분과 병합된다.
TEMPTABLE의 경우, 뷰에서 나온 결과는 임시 테이블 속으로 들어가게 되는데, 이것은 명령문을 실행하기 위해 사용된다.
UNDEFINED의 경우, MySQL은 사용할 알고리즘을 선택한다. 가능하다면 MySQL은 MERGE를 선호하게 되는데, 왜냐하면
MERGE는 일반적으로 보다 효율적이며 또한 뷰는 임시 테이블이 사용되는 경우에는 업데이트를 할 수 없기 때문이다.
확실하게 TEMPTABLE가 선택되는 경우는 임시 테이블이 생성되고 임시 테이블이 명령문 수행을 마치기 위해 사용되기 전에 잠
금이 언더라잉(underlying) 테이블에서 릴리즈될 수 있을 경우만 해당된다. 이것의 결과로 잠금 릴리즈가 MERGE알고리즘 보다
빨리 구현되며, 따라서 뷰를 사용하는 다른 클라이언트가 더 이상 갇히지 않게 된다.
뷰 알고리즘은 세 가지 이유로 UNDEFINED될 수 있다:
앞에서 언급을 했듯이, MERGE는 뷰를 참조하는 명령문 속으로 뷰 정의문을 병합 시키는 방식으로 처리된다. 아래의 예제에서는
MERGE알고리즘이 어떻게 동작되는지에 대해 간단하게 설명을 하고 있다. 이 예제는 뷰 v_merge가 다음과 같은 정의를 가지고
있다고 가정한다:
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3 > 100;
Example 1: 다음의 명령문을 입력한다고 가정한다:
SELECT * FROM v_merge;
MySQL은 명령문을 아래와 같이 처리한다:
● v_merge은 t이 된다.
● *은 vc1, vc2가 되고, 이것은 c1, c2에 대응된다.
● 뷰 WHERE구문이 추가된다.
● DISTINCT
● GROUP BY
● HAVING
● UNION or UNION ALL
● 문자 값만을 참조 (이와 같은 경우, 언더라잉(underlying) 테이블에 없게 된다)
어떤 뷰들은 업데이트가 가능하다. 즉, 여러분은you can use them in statements such as UPDATE, DELETE, 또는 INSERT
와 같은 명령문에 있는 뷰들을 사용해서 언더라인 테이블의 내용을 업데이트 할 수가 있다. 또한, 업데이트가 되지 않도록 뷰를 구
성할 수도 있다. 보다 특징적으로 하기 위해서, 뷰는 아래의 것 중에 하나를 가지고 있으면 업데이트가 되지 않는다:
● DISTINCT
● GROUP BY
● HAVING
● UNION또는 UNION ALL
● 선택한 리스트에 있는 서브 쿼리
● 조인(Join)
• 3.14159
• col1 + 3
• UPPER(col2)
• col3 / col4
• (subquery)
단순 컬럼 참조와 획득 컬럼을 모두 갖고 있는 뷰는 삽입이 불가능 하지만, 획득되지 않은 컬럼만을 업데이트 하는 것은 가능하다.
아래의 뷰를 고려해 보자:
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
이 뷰는 col2가 수식에서 얻어진 것이기 때문에 삽입 불가능한 것이 된다. 하지만 업데이트가 col2를 업데이트 하고자 시도하지 않
는다면 업데이트 가능하다. 이러한 업데이트는 허용된다:
UPDATE v SET col1 = 0;
이러한 업데이트는 허용되지 않는데, 그 이유는 획득한 컬럼을 업데이트 하려는 시도를 하기 때문이다:
UPDATE v SET col2 = 0;
때로는 다중-테이블 뷰가 MERGE를 가지고 처리될 수 있다는 가정하에서는 업데이트 가능한 것으로 만드는 것이 가능하다. 이렇
게 동작 시키기 위해서는, 뷰는 반드시 내부 조인(inner join)(외부 조인(outer join 또는 UNION이 아님)을 사용해야 한다. 또한,
뷰 정의문에 있는 단일 테이블만이 업데이트 될 수 있는데, 따라서 SET구문은 뷰 안에 있는 테이블 중의 하나로부터 컬럼 만을 지
명해야 한다. UNION ALL을 사용하는 뷰는 비록 이론적으로는 업데이트 가능한 것이지만 업데이트가 될 수가 없다. 그 이유는 이
런 뷰를 처리하기 위해서 서버는 임시 테이블을 사용하기 때문이다.
다중-테이블 업데이트 가능 뷰에 대해서는, INSERT가 단일 테이블 안으로 삽입 동작을 하는 것은 가능하다. DELETE는 지원되
지 않는다.
select_statement에 있는 WHERE구문이 트루(true)인 경우를 제외하고, 업데이트 뷰가 줄을 업데이트 또는 삽입하지 못하도록
WITH CHECK OPTION구문을 제공할 수 있다.
업데이트 뷰에 대한 WITH CHECK OPTION구문에서, LOCAL과 CASCADED키워드는 뷰가 다른 뷰의 형태로 정의 될 때 검사
테스트의 범위를 결정한다. LOCAL키워드는 정의 되는 뷰에만 CHECK OPTION을 제한한다. CASCADED구문은 언더라잉
(underlying)뷰의 값도 함께 검사를 하도록 만든다. 아무런 키워드도 주어지지 않는다면, 디폴트는 CASCADED가 된다. 아래의
테이블 정의문과 뷰 셋을 검토해 보자:
mysql> CREATE TABLE t1 (a INT);
mysql> CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
-> WITH CHECK OPTION;
제목검색
상위메뉴리스트 ◆
Chapter 20. INFORMATION_SCHEMA 데이터 베이스
20. INFORMATION_SCHEMA 데이터 베이스 20.1. INFORMATION_SCHEMA SCHEMATA 테이블
+------------+------------+--------+
+------------+------------+--------+
| v3 | VIEW | NULL |
| v2 | VIEW | NULL |
|v | VIEW | NULL |
+------------+------------+--------+
설명: 명령문은 데이터 베이스 db5에 있는 모든 테이블의 리스트를 알파벳의 역순으로 요구하고, 세 가지로
정보를 보여준다: 테이블의 이름, 타입, 그리고 저장 엔진(storage engine).
각 MySQL 사용자는 이러한 테이블에 접근할 권한이 있는데, 사용자가 적당한 접근 권한을 갖고 있는 오브젝
하지만, SHOW가 MySQL 사용자에게 보다 일반적으로 사용되고 있기 때문에, 그리고 SHOW를 삭제하는
것이 보다 혼란을 야기할 수도 있기 때문에, 재래 방식의 신택스가 갖는 장점은 계속 지원되고 있다. 사실,
MySQL 5.0에는 SHOW의 기능이 보다 발전 되어 있으며, Section 20.18, “SHOW 명령문에 대한 확
장”에서 자세히 다루기로 한다.
SQL Server 2000 (이것도 표준을 따르고 있음)사용자는 매우 유사한 내용을 발견할 것이다. 하지만,
MySQL은 자체의 목적과는 관련이 없는 많은 컬럼을 포함시키지 않았고, MySQL 고유의 컬럼들을 포함시켰
다. 이러한 컬럼 중의 하나가 INFORMATION_SCHEMA.TABLES 테이블에 있는ENGINE 컬럼이다.
INFORMATION_SCHEMA이다.
표준SQL, DB2, SQL Server, 또는 Oracle에서 지정되어 있는 이름들의 사용을 피하기 위해, MySQL은
“MySQL 확장(extention)”이라고 표시해 놓은 변경 컬럼들을 사용한다. (예를 들면, MySQL은
TABLES 테이블에서 COLLATION 을 TABLE_COLLATION으로 변경해 놓았다) 사용이 지정되어 있는
단어의 리스트는 여기를 참조할 것: http://www.dbazine.com/gulutzan5.shtml.
Note: 현재의 버전까지는, 몇가지 누락된 컬럼 및 제대로 동작하지 않는 컬럼이 있는데, MySQL은 꾸준히 이러
한 문제를 해결할 예정이다
제목검색
20. INFORMATION_SCHEMA 데이터 베이스 하나의 스키마는 하나의 데이터 베이스이며, 따라서SCHEMATA 테이블은 데이터 베이스의 정보를 제공한
CATALOG_NAME - NULL
SCHEMA_NAME Database
DEFAULT_CHARACTER_SET_NAME
DEFAULT_COLLATION_NAME
SQL_PATH NULL
Notes:
FROM INFORMATION_SCHEMA.SCHEMATA
SHOW DATABASES
[LIKE 'wild']
제목검색
상위메뉴리스트 ◆
20.2. INFORMATION_SCHEMA TABLES 테이블
20. INFORMATION_SCHEMA 데이터 베이스
TABLES 은 데이터 베이스에 있는 테이블에 대한 정보를 제공한다.
20.2. INFORMATION_SCHEMA TABLES 테이블
TABLE_CATALOG NULL
TABLE_SCHEMA Table_...
TABLE_NAME Table_...
TABLE_TYPE
Notes:
SHOW TABLES
[FROM db_name]
[LIKE 'wild']
제목검색
상위메뉴리스트 ◆
20.3. INFORMATION_SCHEMA COLUMNS 테이블
20. INFORMATION_SCHEMA 데이터 베이스 COLUMNS 테이블은 테이블에 있는 컬럼이 정보를 제공한다.
TABLE_NAME
COLUMN_NAME Field
COLUMN_DEFAULT Default
IS_NULLABLE Null
DATA_TYPE Type
CHARACTER_MAXIMUM_LENGTH Type
CHARACTER_OCTET_LENGTH
NUMERIC_PRECISION Type
NUMERIC_SCALE Type
CHARACTER_SET_NAME
COLLATION_NAME Collation
Notes:
FROM INFORMATION_SCHEMA.COLUMNS
SHOW COLUMNS
FROM tbl_name
[FROM db_name]
[LIKE 'wild']
제목검색
상위메뉴리스트 ◆
20.4. INFORMATION_SCHEMA STATISTICS 테이블
20. INFORMATION_SCHEMA 데이터 베이스
STATISTICS 테이블은 테이블 인덱스에 대한 정보를 제공한다.
20.4. INFORMATION_SCHEMA STATISTICS 테이
블
Standard Name SHOW name Remarks
20.4 INFORMATION_SCHEMA STATISTICS 테이블
TABLE_CATALOG NULL
TABLE_SCHEMA = Database
TABLE_NAME Table
NON_UNIQUE Non_unique
INDEX_SCHEMA = Database
INDEX_NAME Key_name
SEQ_IN_INDEX Seq_in_index
COLUMN_NAME Column_name
COLLATION Collation
CARDINALITY Cardinality
Notes:
• 인덱스에 대한 표준 테이블은 없다. 이전의 리스트는 SQL Server 2000이 sp_statistics 에 대해 돌려주
는 값과 비슷한 것인데, MySQL이QUALIFIER 의 이름을 CATALOG로 변경한 것과, OWNER 의 이름을
SCHEMA로 변경한 것은 예외이다.
SHOW INDEX
FROM tbl_name
[FROM db_name]
제목검색
상위메뉴리스트 ◆
20.5. INFORMATION_SCHEMA USER_PRIVILEGES 테이블
20. INFORMATION_SCHEMA 데이터 베이스
USER_PRIVILEGES 테이블은 글로벌 권한에 대한 정보를 제공한다. 이러한 정보는 mysql.user 그랜트 테이
20.5. INFORMATION_SCHEMA
블에서 얻어진다.
USER_PRIVILEGES 테이블
TABLE_CATALOG NULL
PRIVILEGE_TYPE
IS_GRANTABLE
Notes:
http://www.mysqlkorea.com/develop/sub_07.html?lcate=20&mcate=5&scate=0&idx=12502006-08-08 오후 6:26:53
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
20.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES 테이블
20.6 INFORMATION_SCHEMA
SCHEMA_PRIVILEGES 테이블 Standard Name SHOW name Remarks
TABLE_CATALOG NULL
TABLE_SCHEMA
PRIVILEGE_TYPE
IS_GRANTABLE
Notes:
http://www.mysqlkorea.com/develop/sub_07.html?lcate=20&mcate=6&scate=0&idx=12532006-08-08 오후 6:26:54
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
20.7. INFORMATION_SCHEMA TABLE_PRIVILEGES 테이블
20.7 INFORMATION_SCHEMA
TABLE_PRIVILEGES 테이블 Standard Name SHOW name Remarks
TABLE_CATALOG NULL
TABLE_SCHEMA
TABLE_NAME
PRIVILEGE_TYPE
IS_GRANTABLE
제목검색
상위메뉴리스트 ◆
20.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES 테이블
20.8 INFORMATION_SCHEMA
COLUMN_PRIVILEGES 테이블 Standard Name SHOW name Remarks
TABLE_CATALOG NULL
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME
PRIVILEGE_TYPE
IS_GRANTABLE
Notes:
제목검색
상위메뉴리스트 ◆
20.9. INFORMATION_SCHEMA CHARACTER_SETS 테이블
20. INFORMATION_SCHEMA 데이터 베이스
CHARACTER_SETS 테이블은 사용 가능한 문자열 셋에 대한 정보를 준다.
20.9. INFORMATION_SCHEMA
CHARACTER_SETS 테이블
Standard Name SHOW name Remarks
20.9 INFORMATION_SCHEMA CHARACTER_SETS
테이블 CHARACTER_SET_NAME Charset
Notes:
[LIKE 'wild']
제목검색
상위메뉴리스트 ◆
20.10. INFORMATION_SCHEMA COLLATIONS 테이블
20. INFORMATION_SCHEMA 데이터 베이스
COLLATIONS 테이블은 각 문자열 셋에 대한 조사(collation)에 대한 정보를 제공한다.
20.10. INFORMATION_SCHEMA
COLLATIONS 테이블
Standard Name SHOW name Remarks
20.10 INFORMATION_SCHEMA COLLATIONS
테이블 COLLATION_NAME Collation
Notes:
SHOW COLLATION
[LIKE 'wild']
http://www.mysqlkorea.com/develop/sub_07.html?lcate=20&mcate=10&scate=0&idx=12582006-08-08 오후 6:27:00
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
20.11. INFORMATION_SCHEMA
20.11. INFORMATION_SCHEMA
COLLATION_CHARACTER_SET_APPLICABILITY 테이블은 어떤 조사(collation)에 어떤 문자열 셋이
COLLATION_CHARACTER_SET_APPLICABILITY 테이블
적용되는지를 표시한다. 컬럼들은 SHOW COLLATION 로 얻어내는 첫 번째 두 표시 필드와 일치한다.
20.11 INFORMATION_SCHEMA
COLLATION_CHARACTER_SET_APPLICABILITY 테이블
Standard Name SHOW name Remarks
COLLATION_NAME Collation
CHARACTER_SET_NAME Charset
http://www.mysqlkorea.com/develop/sub_07.html?lcate=20&mcate=11&scate=0&idx=12592006-08-08 오후 6:27:01
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
20.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS 테이블
20. INFORMATION_SCHEMA 데이터 베이스
TABLE_CONSTRAINTS 테이블은 어떤 테이블이 제약 사항을 갖고 있는지 설명한다.
20.12. INFORMATION_SCHEMA
TABLE_CONSTRAINTS 테이블
Standard Name SHOW name Remarks
20.12 INFORMATION_SCHEMA TABLE_CONSTRAINTS 테
이블 CONSTRAINT_CATALOG NULL
CONSTRAINT_SCHEMA
CONSTRAINT_NAME
TABLE_SCHEMA
TABLE_NAME
CONSTRAINT_TYPE
Notes:
제목검색
상위메뉴리스트 ◆
20.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE 테이블
20. INFORMATION_SCHEMA 데이터 베이스
KEY_COLUMN_USAGE 테이블은 제약 사항을 갖고 있는 키 컬럼(key column)을 설명한다.
20.13. INFORMATION_SCHEMA
KEY_COLUMN_USAGE 테이블
Standard Name SHOW name Remarks
20.13 INFORMATION_SCHEMA
KEY_COLUMN_USAGE 테이블 CONSTRAINT_CATALOG NULL
CONSTRAINT_SCHEMA
CONSTRAINT_NAME
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME
ORDINAL_POSITION
POSITION_IN_UNIQUE_CONSTRAINT
REFERENCED_TABLE_SCHEMA
REFERENCED_TABLE_NAME
REFERENCED_COLUMN_NAME
Notes:
CREATE TABLE t1
s1 INT,
s2 INT,
s3 INT,
PRIMARY KEY(s3)
) ENGINE=InnoDB;
CREATE TABLE t3
s1 INT,
s2 INT,
s3 INT,
KEY(s1),
) ENGINE=InnoDB;
• REFERENCED_TABLE_SCHEMA, REFERENCED_TABLE_NAME, 및
REFERENCED_COLUMN_NAME 은 MySQL 5.0.6에서 추가 되었다.
제목검색
상위메뉴리스트 ◆
20.14. INFORMATION_SCHEMA ROUTINES 테이블
20. INFORMATION_SCHEMA 데이터 베이스
ROUTINES 테이블은 스토어드 루틴(프로시저 및 함수 모두)에 대한 정보를 제공한다. 현재의 버전까지는, ROUTINES
20.14. INFORMATION_SCHEMA ROUTINES 테이
테이블은 사용자 정의 함수(UDF)를 포함하지는 않는다.
블
SPECIFIC_NAME specific_name
ROUTINE_CATALOG NULL
ROUTINE_SCHEMA db
ROUTINE_NAME name
ROUTINE_BODY SQL
ROUTINE_DEFINITION body
EXTERNAL_NAME NULL
PARAMETER_STYLE SQL
IS_DETERMINISTIC is_deterministic
SQL_DATA_ACCESS sql_data_access
SQL_PATH NULL
SECURITY_TYPE security_type
CREATED created
LAST_ALTERED modified
Notes:
제목검색
상위메뉴리스트 ◆
20.15. INFORMATION_SCHEMA VIEWS 테이블
20. INFORMATION_SCHEMA 데이터 베이스
VIEWS 테이블은 데이터 베이스에 있는 뷰에 대한 정보를 제공한다. 이 테이블에 접근하기 위해서는 SHOW VIEW 권한을
20.15. INFORMATION_SCHEMA VIEWS 테이블
가져야 한다.
20.15 INFORMATION_SCHEMA VIEWS 테이블
TABLE_CATALOG NULL
TABLE_SCHEMA
TABLE_NAME
VIEW_DEFINITION
CHECK_OPTION
IS_UPDATABLE
DEFINER
SECURITY_TYPE
Notes:
• VIEW_DEFINITION 컬럼은 SHOW CREATE VIEW가 만들어내는 Create Table 필드에 있는 것들이다.
SELECT 이전에 있는 단어는 건너뛰고 WITH CHECK OPTION의 단어도 건너 뛰자. 원래의 명령문이 다음과 같
다고 가정하자:
• CREATE VIEW v AS
• WHERE s1 > 5
• ORDER BY s1
제목검색
상위메뉴리스트 ◆
20.16. INFORMATION_SCHEMA TRIGGERS 테이블
20. INFORMATION_SCHEMA 데이터 베이스
TRIGGERS 테이블은 트리거에 대한 정보를 제공한다. 이 테이블에 접근하기 위해서는 SUPER권한이 있어야 한다.
20.16. INFORMATION_SCHEMA TRIGGERS 테
이블
Standard Name SHOW name Remarks
20.16 INFORMATION_SCHEMA TRIGGERS 테이블
TRIGGER_CATALOG NULL
TRIGGER_SCHEMA
TRIGGER_NAME Trigger
EVENT_MANIPULATION Event
EVENT_OBJECT_CATALOG NULL
EVENT_OBJECT_SCHEMA
EVENT_OBJECT_TABLE Table
ACTION_ORDER 0
ACTION_CONDITION NULL
ACTION_STATEMENT Statement
ACTION_ORIENTATION ROW
ACTION_TIMING Timing
ACTION_REFERENCE_OLD_TABLE NULL
ACTION_REFERENCE_NEW_TABLE NULL
ACTION_REFERENCE_OLD_ROW OLD
ACTION_REFERENCE_NEW_ROW NEW
SQL_MODE
DEFINER
Notes:
• Chapter 18, Triggers에서 설명하였듯이, 모든 트리거는 정확히 하나의 테이블과 연결이 된다.
EVENT_OBJECT_SCHEMA 및 EVENT_OBJECT_TABLE 컬럼은 이 테이블이 발생하는 데이터 베이스의 이름
과 테이블의 이름을 갖는다.
• ACTION_STATEMENT 컬럼은 트리거가 호출될 때 실행되는 명령문을 갖는다. 이것은 SHOW TRIGGERS
로부터 나오는 결과값에 대해 Statement 컬럼에서 문장이 표시될 때에도 동일하다. 이 문장은UTF-8 엔코딩
(encoding)을 사용한다는 점을 주의하자.
• SQL_MODE 컬럼은 트리거가 생성되었을 때(따라서 현재의 서버 SQL모드가 무엇이든지 상관없이 트리거가
호출될 때마다 영향을 받는) 실제로 영향을 받는 서버 SQL모드를 보여준다. 이 컬럼에 대한 가능한 범위는
sql_mode 시스템 변수의 범위와 같다. Section 5.2.5, “서버 SQL 모드” 참조.
TRIGGER_CATALOG: NULL
TRIGGER_SCHEMA: test
TRIGGER_NAME: ins_sum
EVENT_MANIPULATION: INSERT
EVENT_OBJECT_CATALOG: NULL
EVENT_OBJECT_SCHEMA: test
EVENT_OBJECT_TABLE: account
ACTION_ORDER: 0
ACTION_CONDITION: NULL
ACTION_ORIENTATION: ROW
ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
ACTION_REFERENCE_OLD_ROW: OLD
ACTION_REFERENCE_NEW_ROW: NEW
CREATED: NULL
SQL_MODE:
DEFINER: me@localhost
제목검색
상위메뉴리스트 ◆
20.17. 이외의 INFORMATION_SCHEMA 테이블
20. INFORMATION_SCHEMA 데이터 베이스
MySQL은 부가적인 INFORMATION_SCHEMA 테이블을 사용하고자 한다. 특히, PARAMETERS 및
20.17. 이외의 INFORMATION_SCHEMA 테이블
REFERENTIAL_CONSTRAINTS 테이블에 대한 필요성을 알고 있다.
20.17 이외의 INFORMATION_SCHEMA 테이블
http://www.mysqlkorea.com/develop/sub_07.html?lcate=20&mcate=17&scate=0&idx=12652006-08-08 오후 6:27:13
:::MySQL Korea:::
제목검색
상위메뉴리스트 ◆
20.18. SHOW 명령문에 대한 확장
20. INFORMATION_SCHEMA 데이터
SHOW 명령문에 대한 몇 가지 확장이 INFORMATION_SCHEMA 의 실행과 관련되어 제공된다:
베이스
INFORMATION_SCHEMA 는 하나의 정보 테이블이며, 따라서 이 이름은 SHOW DATABASES 에서 얻어지는 결과에 포함된다. 비
슷하게, SHOW TABLES 은 테이블의 리스트를 얻기 위해 INFORMATION_SCHEMA 과 함께 사용될 수 있다:
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| KEY_COLUMN_USAGE |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| STATISTICS |
| TABLES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
+---------------------------------------+
SHOW COLLATION
SHOW COLUMNS
SHOW DATABASES
SHOW KEYS
SHOW STATUS
SHOW TABLES
SHOW VARIABLES
WHERE 구문은, 만약 있다면, SHOW 명령문으로 표시되는 컬럼 이름에 대비해서 평가된다. 예를 들면, SHOW CHARACTER SET 명
령문은 다음과 같은 컬럼을 만들어 낸다:
+----------+-----------------------------+---------------------+--------+
+----------+-----------------------------+---------------------+--------+
...
WHERE 구문을 SHOW CHARACTER SET과 함께 사용하기 위해서는, 컬럼의 이름들을 참조하여야 한다. 하나의 예로서, 아래의 명
령문은 디폴트 조사(collation)가 스트링 'japanese'를 갖는 문자열 셋의 정보를 나타낸다:
+---------+---------------------------+---------------------+--------+
+---------+---------------------------+---------------------+--------+
+---------+---------------------------+---------------------+--------+
+---------+---------------------------+---------------------+--------+
+---------+---------------------------+---------------------+--------+
+---------+---------------------------+---------------------+--------+