SQL메일과 SQLAgent메일 설치하고 사용하기

참고)

SQL 메일 구성방법

http://www.microsoft.com/Korea/support/xmlkb/KR263556.ASP

SQL Mail 2000에는 Microsoft Outlook 2000 클라이언트가 필요하다

    http://www.microsoft.com/Korea/support/xmlkb/KR281293.ASP

 

SQL서버가 메일을 주고 받을려면 메일 프로필과 MAPI를 지원하는 메일클라이언트 프로그램이 있어야 한다. 현재 이 두가지를 지원한는 메일 클라이언트는 Outlook과 Nt4.0에 포함되어 있는 Windows Messaging 클라이언트밖에 없다. SQL7.0에서는 Windows Messaging 클라이언트과 Outlook97-98을 이용해서도 프로필을 작성할수 있었으나 SQL서버 2000에서는 오로지 Ouotlook2000 만 지원을 한다

 

이 문서는 Outlook2000설치와 프로필추가, SQL Mail 설정, SQLAgent Mail 설정의 세단계에 대한 내용이 들어있다.

 

Outlook2000설치와 프로필추가

1. 해당 DB서버에 Outlook2000을 설치한다.

2. 메일 프로필을 추가해야 하는데 세가지 방법으로 프로필 추가 화면을 띄울수 있다.

    - 바탕화면에서 Outlook2000 아이콘 더블 클릭

    - 바탕화면에서 오른쪽 마우스 등록정보/메일창에서 추가버튼 클릭

    - 제어판/메일/메일창에서 추가버튼 클릭

3. 받은 설치함 설치 마법사 창에서 인터넷전자메일을 선택하고 다음 클릭.

 

note) 위와 같은 화면이 안 뜨고 아래와 같은 화면이 먼저 뜨는 경우도 있슴

다음 화면에서 꼭 회사 또는 작업 그룹 선택

    

    

 

4. 인터넷 전자메일 창에서 메일계정 설정 버튼 클릭. 아래와 같이 설정

    

    

    이때 비밀번호는

 

5. 메일 프로필이 사용할 개인 폴더 설정화면에서 기본값을 선택하고 다음 클릭.

    부득이 하게 변경하고 싶을땐 옆에 찾아보기 버튼을 선택해서 적절한 경로 설정

6. 메일 프로필 완료 화면 나옴. 마침을 클릭해 창을 닫는다.

7. Outlook2000을 실행시키면 매처음 경고창이 뜨면서 "Outlook이 메일,뉴스과(와) 연락처의 기본 관리자로 설정되어 있지 않습니다. Outlook을 기본 관리자로 설정하시겠습니까?" 라는 경고창이 뜨는데 꼭 를 눌러야 한다.

8. 이제 메일이 제대로 가고 오는지 테스트를 해본후 이상이 없으면 다음으로 넘어가고 이상있으면 고친다.

9. 한명이상의 관리자한테 메일을 보내야 할 필요가 있을 경우를 대비해서 sqlDBA라는 메일 그룹을 Outlook2000에 등록한다.
    A. 관리자 메일주소를 아웃룩/연락처에 등록한다.

    B. sqlDBA라는 메일 그룹을 추가하고 관리자 주소를 구성원선택버튼을 눌러 추가.

    

 

SQL Mail 설정하기

지금 우리는 administrator라는 계정으로 로그인해서 프로필을 등록시켰다. 그렇기 때문에 sql메일기능이 동작할려면 SQL서버와 SQLAgent가 administrator의 권한으로 시작이 되어 야 한다. 현재 SQL서버는 Windows 2000서버의 시스템계정으로 동작하고 있을 것이기 때문에 이것을 administrator로 바꿔야 한다. sql서버 역시 하나의 메일 클라인언트이기 때문이다.

  1. 서비스관리자를 연다. 시작/프로그램/관리도구/서비스
  2. MSSQLSERVER 를 선택 오른쪽 버튼/등록정보 클릭
  3. 로그온 탭을 선택하고 아래와같이 설정. administrator비번은 따로 문의


        

  4. Administrator계정에 서비스 로그온 권한을 승계했고 SQL서버 서비스를 다시 시작해야 새로그인 이름이 적용된다는 안내가 나온다. 확인 클릭
  5. 이제 EM(엔터프라이즈 관리자)를 열어 지원서비스/SQL 메일에서 오른쪽버튼/등록정보
  6. 드롭다운 버튼을 눌러 MS Exchange 설정 프로필을 선택하고 테스트 버튼 클릭

    이 프로필을 사용하여 MAPI세션을 시작(중지) 했다는 안내가 나온다. 이제 SQL메일 세션을 시작한것이다. 설정 끝

  7. 이제 쿼리 분석기를 열어서 xp_sendmail '내메일주소','테스트랑께' 라고 적고 실행시키면 메일이 자기한테 오는지 확인할수 있다.
  8. 예) xp_sendmail 'test@test.co.kr','테스트랑께'

    만약 에러가 나면 sql메일 세션이 정상적으로 시작하지 못한것이기 때문에 위의 그림에서처럼 다시 설정하거나 또는 xp_startmail 저장 프로시저를 실행한다.

  9. 메일세션을 중지시킬때는 위의 그림대로 또 한번하면 중지된다. 또는 xp_stopmail 저장프로시저를 실행한다.

 

 

SQLSERVERAgent Mail 설정하기

SQL서버에 딸린 작업이나 경고, 기타 등등의 작업을 할때는 SQLAgent메일이 더 많이 쓰이기도 한다. 모든 자동화 작업이나 서버 이상 등등의 결과를 메일로 받을 때 상당히 유용하며 자주 쓰이고 있다.

 

  1. Outlook2000설치와 프로필추가 단계를 먼저 끝내도록 한다.
  2. 시작/프로그램/관리도구/서비스 를 선택해 SQLAgent 서비스를 선택하고 SQLAgent서비스 시작 계정을 Administrator로 설정하고 확인 클릭. Administrator계정에 서비스 로그온 권한을 승계했고 SQLAgent 서비스를 다시 시작해야 새로그인 이름이 적용된다는 안내가 나온다. 확인 클릭
  3. EM(엔터프라이즈 매니저) 를실행하고 관리/SQL Server 에이전트에서 오른쪽버튼/등록정보 클릭
  4. 아래와 같이 메일 세션을 드롭다운 버튼을 눌러서 선택



    테스트 버튼을 누르면 메일 세션을 시작(중지)했다는 메시지가 나온다.

    설정끝

  5. 이제 SQLAgent 메일 서비스를 이용해 메일을 보내보도록 하자. EM(엔터프라이즈 매니저) 를실행하고 관리/SQL Server 에이전트/운영자/새운영자 를 추가
  6. 아래와 같이 설정을 한다. 메일주소는 … 버튼을 눌러서 프로필 추가할 때 아웃룩에서 추가한 메일그룹주소 sqlDBA를 선택하도록 한다.(테스트시 자기이메일주소를적어도됨)




옆의 테스트 버튼을 누르면 메일이 제대로 오는 것을 확인할수 있다.
이때 에러가 나면 SQLAgent 메일 세션을 제대로 시작하지 않은것이므로 4번의 단계를 다시 실행한다.

Posted by Finebe
,


인덱스 관리에 대한 지침 사항

이 곳에서는 인덱스를 관리할 때 수행하는 지침 사항을 설명하고 다음 내용을 다룹니다.

  • 테이블 데이터 삽입 후 인덱스 생성
  • 테이블당 인덱스 수 제한
  • 트랜젝션 입력 항목의 매개변수 지정
  • 인덱스 블록의 영역 사용 지정
  • 각 인덱스에 대한 테이블스페이스 지정
  • 인덱스 생성 병렬화
  • UNRECOVERABLE 인덱스 생성시 고려 사항
  • 인덱스 크기 측정 및 저장 영역 매개변수 설정


인덱스는 테이블과 클러스터에 관련된 선택적 구조이며 테이블에서 명시적으로 생성되어 SQL명령문 실행 속도를 증가시킬 수 있습니다.
이 설명서의 색인으로 정보를 더욱 빨리 찾을 수 있는 것과 같이 Oracle인덱스는 테이블 데이터를 훤씬 빠른 액세스 경로를 제공합니다.

인덱스의 존재 여부는 SQL명령문의 문법에는 변화를 주지 않습니다. 인덱스는 단지 데이터에 재한 빠른 액세스 경로를 제공하며 실행 속도에만 영향을 줍니다.
인덱스된 데이터 값이 부여되면 인덱스는 값을 포함하는 행의 위치를 가리킵니다.

인덱스는 관련된 테이블의 데이터에 논리적으로나 물리적으로 독립적입니다. 기본 테이블이나 다른 인덱스에 영향을 주지 않고 언제든 인덱스를 생성하거나 삭제할 수 있습니다.
인덱스를 삭제하면 모든 응용 프로그램은 계속 수행되지만 이전에 인덱스된 데이터로의 액세스는 더욱 느려집니다. 독립 구조로서 인덱스는 저장 영역이 필요합니다.

Oracle은 인덱스가 생성되면 유지 관리하고 사용합니다. 사용자가 더 이상 추가 작업을 수행하지 않아도 새 행 추가, 갱신, 삭제와 같은 데이터에 대한 변경 사항을 모든 인덱스에 자종으로 반영합니다.

1. 테이블 데이터 삽입 후 인덱스 생성

SQL*Loader 또는 Import를 통해 데이터를 테이블에 삽입하거나 로드한 후에 테이블에 대한 인덱스를 생성해야 합니다.
인덱스가 없는 테이블에 데이터 행을 삽입한 후 다음 액세스를 위해 인덱스를 생성하는 것이 더 효율적입니다.
테이블 데이터가 로드되기 전에 인덱스를 생성하면 모든 인덱스는 테이블에 행이 삽입될 때 마다 갱신되어야 합니다.
또한 클러스터에 데이터를 삽입하기 전에 클러스터에 대한 인덱스를 생성해야 합니다.
테이터를 가진 테이블에 인덱스가 생성되면 Oracle은 정렬 영역을 사용해야 합니다.
Oracle은 인덱스 생성자(SORT_AREA_SIZE 초기화 매개변수에 의해 결정되는 사용자당 사용량)에 할당된 메모리 정렬 영역을 사용하면서 인덱스 생성에 할당된 임시 세그먼트에서 정렬 정보를 교환해야 합니다.

인덱스가 너무 크면 다음 작업을 수행하고자 할 것입니다.
새 임시 세그먼트 테이블스페이스를 생성합니다.
인덱스 생성자의 임시 세그먼트 테이블스페이스를 변경합니다.
인덱스를 생성합니다.
원한다면 임시 세그먼트 테이블스페이스를 제거하고 생성자의 임시 세그먼트 테이블스페이스를 재 지정할 수 있습니다.


2. 테이블당 인덱스 수 제한

테이블은 인덱스를 무제한으로 가질 수 있습니다. 그러나 인덱스가 많을수록 테이블이 수정할 때 오버헤드도 늘어납니다.
특별히 행이 삽입되거나 삭제될 때 테이블의 모든 인덱스도 갱신되어야 합니다. 열이 갱신되면 열을 포함하는 모든 인덱스도 갱신되어야 합니다.

따라서 테이블에서 데이터를 읽어들이는 속도와 테이블을 갱신하는 속도 사이에는 차이점이 있습니다.
예를 들어 테이블이 주로 읽기 전용이라면 인덱스가 많은 것이 유용하지만 테이블이 주로 갱신 위주라면 인덱스가 적은 것이 좋습니다.

3. 트랜잭션 입력 항목의 매개변수 지정

각 인덱스 생성 중에 INITRANS 와 MAXTRANS매개변수를 지정하여 초기에 인덱스 세그먼트의 데이터 블록에 트랜잭션 입력 항목에 대한 영역 할당량과 최대 할당량을 결정합니다.
자세한 내용은 "스키마 게체 관리에 대한 지침 사항의 저장 영역 매개변수 설정을 참조 하세요.

4. 인덱스 블록의 영역 사용 지정

테이블에 인덱스가 생성되면 인덱스의 테이터 블록은 최대 PCTFREE까지 기존 테이블의 기존 값으로 채워집니다.
인덱스 블록을 위해 PCTFREE로 예약된 영역은 새 행이 테이블에 삽입될 경우에만 사용되며 해당 인덱스 입력 항목은 정확한 인덱스블록(즉 앞과 다음 인덱스 입력 항목사이)에 있어야 합니다.
해당 인덱스 블록에 더 이상 사용할 수 있는 영역이 없으면 인덱스된 값은 다른 인덱스 블록에 넣어집니다.
따라서 많은 행을 인덱스된 테이블에 삽입하려면 새 인덱스 값을 수용하는 PCTFREE값이 높아야 합니다.
테이블에 삽입된 사항이 별로 없다면 관련된 인덱스의 PCTFREE값을 낮게 하여 인덱스 데이터를 유지하는데 필요한 블록수를 줄일수 있습니다.

주 : PCTUSED는 인덱스에 대해 지정될 수 없습니다.

5. 각 인덱스에 대한 테이블스페이스 지정

인덱스는 테이블스페이스에서 생성될 수 있습니다. 인덱스는 인덱스하는 테이블과 동일한 테이블스페이스에서 생성될 수도 있고 다른 테이블스페이스에서 생성될 수도 있습니다.
테이블과 인덱스에 대해 동일한 테이블스페이스를 사용한다면 데이터베이스 유지 관리가 더욱 편해지며 모든 관련된 테이터가 온라인 상태로 됩니다.

테이블과 인덱스에 대해 다른 디스크에서 다른 테이블스페이스를 사용하면 동일한 테이블스페이스에 테이블과 인덱스를 저장할 때 보다 디스크 경합이 줄어들므로 성능이 좋아집니다.

테이블과 인덱스에 대한 다른 테이블스페이스를 사용하고(데이터나 인덱스를 포함하는) 한 테이블스페이스가 오프라인이면 이 테이블을 참조하는 명령문은 성능이 보장되지 않습니다.

6. 인덱스 생성 병렬화

병렬 질의 옵션을 설치하면 인덱스 생성을 병렬화할 수 있습니다. 여러 프로세스가 인덱스를 생성하므로 하나의 서버가 계속 인덱스를 생성할 때 보다 더 빠르게 인덱스를 생성할 수 있습니다.
인덱스를 병렬로 생성하면 각각의 질의 서버 프로세스는 저장 영역 매개변수를 제각기 사용합니다. 따라서 INITIAL 5M과 PARALLEL DEGREE 12로 생성된 인덱스는 인덱스가 생성되는 동안 적어도 60M의 저장 영역을 필요로 합니다.

7. UNRECOVERABLE 인덱스 생성 시 고려 사항

CREATE INDEX 명령문에서 UNRECOVERABLE을 지정하면 리두 로그 레코드를 만들지 않고도 인덱스를 생성할 수 있습니다.

주 : UNRECOVERABLE 을 사용하여 생성된 인덱스는 아카이브되지 않으므로 인덱스를 생성한 후에는 백업야 합니다.

복구할 수 없는 인덱스를 생성하려면 다음과 같은 이점이 있습니다.
리두 로그 파일의 영역이 절약됩니다.
인덱스 생성 시간이 줄어듭니다.
대규모 인덱스의 병렬 생성 성능이 향상 됩니다.

일반적으로 소규모 인덱스보다 대규모 복구할 수 없는 인덱스의 성능이 상대적으로 향상됩니다.
복구할 수 없는 소규모 인덱스를 생성하면 인덱스 생성 시간에 커다란 영향을 주지 않습니다.
그러나 대규모 인덱스에서는 특히 인덱스 생성을 병렬화할 때 성능 향상에 커다란 영향을 줍니다.


8. 인덱스 크기 측정 및 저장 영역 매개변수 설정

"스키마 개체에 대한 영역 예측"에는 인덱스 크기를 측정하는데 필요한 공식이 있습니다.

인덱스를 생성하기 전에 인덱스 크기를 측정하면 다음과 같은 이점이 있습니다.
원하는 데이터베이스를 유지하는데 필요한 디스크 영역을 결정하는 인덱스와 테이블, 롤백 세그먼트, 리두 로그 파일의 측정치를 합하여 사용할 수 있습니다. 이 측정치를 가지고 올바른 하드웨어를 구매하고 다른 사항을 결정합니다.
각 인덱스를 측정한 크기를 사용하여 인덱스가 사용할 디스크 영역을 관리할 수 있습니다. 인덱스가 생성되면 적합한 저장 영역 매개변수를 지정하거나 인덱스를 사용할 응용 프로그램의 입출력 성능을 향상 시킬 수 있습니다.
예를 들어 테이블을 생성하기 전에 테이블의 최대 크기를 측정한다고 합시다 테이블을 생성할 때 저장 영역 매개변수를 설정하면 테이블과 데이터 세그먼트에 대해 적은 확장정도 연속적인 디스크 영역에 저장됩니다. 이는 테이블을 포함하는 디스크 입출력 작업에 필요한 시간을 감소시켜 줍니다.

단일 인덱스 입력 항목의 최대 크기는 대략 데이터 블록 크기에서 오버헤드를 뺀 값의 1.5배입니다.
테이블에서 처럼 인덱스를 생성할 때 저장 영역 매개변수를 명시적으로 설정할 수 있습니다.
인덱스에 대해 저장 영역 매개변수를 명시적으로 설정한다면 적은 수의 대규모 확장 영역에 인덱스의 테이터를 저장할 수 있습니다.



--제약 조건 비활성화 또는 삭제 전의 고려 사항

고유 키와 기본 키는 인덱스와 관련이 있으므로 UNIQUE이나 PRIMARY KEY제약 조건을 삭제하려고 할때인덱스를 삭제하고 생성하는 비용은 고려해야 합니다.
UNIQUE난 PRIMARY KEY제약 조건에 관련된 인덱스가 아주 크면 큰 인덱스를 삭제하고 재생성하는 것보다 제약 조건을 남겨둠으로써 시간을 절약할 수 있습니다.

 

 


인덱스 생성

이 곳에서는 인덱스 생성 방법에 대해 설명하고 다음 내용을 다룹니다.

  1. 제약 조건과 관련된 인덱스 생성
  2. 명시적으로 인덱스 생성
  3. 기존 인덱스 재생성


관련된 인덱스를 생성하는 UNIQUE나 PRIMARY KEY를 활성화하려면 테이블의 소유자는 인덱스가 포함되어야 할 테이블스페이스에 대한 할당량 또는 UNLIMITED TABLESPACE시스템 권한이 있어야 합니다.

LONG과 LONG RAW열은 인덱스될 수 없습니다.

고유 키나 기본 키에서 고유 인덱스를 생성하면 UNIQUE 키나 PRIMARY KEY무결성 제약 조건이 강제로 시행됩니다.
이 인덱스는 제약 조건이 설정되면 자동으로 생성됩니다. 즉 인덱스 생성을 위해 CREATE TABLE이나 ALTERT TABLE명령문에 다른 추가 작업을 수행할 필요가 없습니다.
인덱스 제약 조건이 정의되고 활성화될 때 그리고 정의 되었지만 비활성화되었던 제약 조건이 활성화되었을 째도 자동으로 생성됩니다.

일반적으로 CREATE UNIQUE INDEX구문을 사용하는 것보다는 고유성을 강제로 시행하는 제약 조건을 생성하는 것이 더 좋습니다.
제약 조건에 관련된 인덱스는 항상 제약조건의 이름이 따르므로 제약 조건 인덱스에 특정 이름을 지정할 필요가 없습니다.

INITIAL과 NEXT같은 인덱스에 대한 저장 영역 옵션을 지정하지 않으면 자동으로 호스트 테이블스페이스의 기본 저장 영역 옵션이 사용됩니다.

1. 제약 조건과 관련된 인덱스 생성

USING INDEX옵션을 가진 ENABLE절을 사용하여 UNIQUE키와 PRIMARY KEY제약 조건과 인덱스에 저장 영역 옵션을 설정할 수 있습니다.
다음 명령문은 PRIMARY KEY제약 조건을 정의하고 관련된 인덱스의 저장 영역 옵션을 지정합니다.

CREATE TABLE EMP (
EMPNO NUMBER(5) PRIMARY KEY, ... )
ENABLE PRIMARY KEY USING INDEX
TABLESPACE USERS
PCTFREE 0;

2. 명시적으로 인덱스 생성

SQL 명령어 CREATE INDEX를 사용하여 무결성 제약 조건 밖에 명시적으로 인덱스를 생성할 수 있습니다.

다음 명령문은 EMP테이블의 ENAME열에 대해 명명된 EMP_ENAME인덱스를 생성합니다.

CREATE INDEX EMP_ENAME ON EMP ( ENAME )
TABLESPACE USERS
STORAGE ( INITIAL 20K
NEXT 20K
PCTINCREASE 75)
PCTFREE 0;

여러 저장 영역 설정이 인덱스에 대해 명시적으로 지정됩니다.

3. 기존 인덱스 재생성

데이터 원본으로 기존 인덱스를 사용하여 인덱스를 생성할 수 있습니다. 이러한 방법으로 인덱스를 생성하면 저장 영역 특성을 변경할 수 있고 새 테이블스페이스로 이동시킬 수도 있습니다.
기존 데이터 원본에 준하여 인덱스를 재 생성하면 블록 내부의 단편화를 제거하게 됩니다. 인덱스를 삭제하고 CREATE INDEX명령어를 사용하는 것보다는 기존 인덱스를 재생성하는 것이 더 나은 성능을 부여합니다.

기존 인덱스를 재생성하려면 다음 명령문을 실행합니다.

ALTER INDEX index_name REBUILD;

인덱스 이름 바로 뒤에 그리고 다른 옵션 앞에 REBULID절이 나와야 합니다. 또한 REBUILD절과 DEALLOCATE STORAFE절을 함께 사용하면 안됩니다.

 


인덱스 변경

인덱스를 변경하려면 인덱스가 스키마에 포함되어 있거나 ALTER ANY INDEX 시스템 권한이 있어야 합니다.
트랜잭션 입력 항목의 매개변수를 변경하거나 저장 영역 매개변수를 바꿀 때만 인덱스를 변경할 수 있으며 인덱스 열 구조는 바꿀수 없습니다.

SQL명령어 ALTER INDEX를 사용하면 기본 키와 고유 키 무결성 제약조건을 강제로 시행하는 매개변수를 포함하여 인덱스의 저장 영역 매개변수를 변경할 수 있습니다.
예를 들어 EMP_ENAME인덱스를 변경하는 명령문은 다음과 같습니다.

ALTER INDEX EMP_NAME
INITRANS 5
MAXTRANS 10
STORAGE ( PCTINCREASE 50 ) ;

인덱스의 트랜젝션 입력 항목 설정(INITRANS, MAXTRANS)을 변경할 때 INITRANS의 새로운 설정은 나중에 할강된 데이터 블록에만 적용되는 반면 MAXTRANS의 새로운 인덱스의 모든 블록(이미 할당되었거나 나중에 할당된 블록)에 적용됩니다.

INITIAL 과 MAXEXTENTS저장 영역 매개변수는 변경될 수 없습니다. 다른 저장 영역 매개변수의 새로운설정은 나중에 할당된 저장 영역에만 영향을 줍니다.

무결성 제약 조건을 구현하는 인덱스의 경우 USING INDEX옵션을 가진 ENABLE절을 포함하는 ALTER TABLE명령문을 실행하면 저장 영역 매개변수를 조정할 수 있습니다.
예를 들어 다음 명령문은 이전 단원에서 정의한 인덱스의 저장 영역 옵션을 변경합니다.

ALTER TABLE EMP
ENABLE PRIMARY KEY USING INDEX
PCTFREE 5;

 


인덱스 영역 사용 모니터링

인덱스에서 키 값이 자주 삽입, 갱신, 삭제되면 인덱스는 시간이 경과함에 따라 영역을 효율적으로 사용할 수도 있지만 사용하지 못할 수도 있습니다.
우선 인덱스의 구조를 분석한 다음 INDEX_STATS뷰를 질의하여 인덱스의 효율적인 영역 사용을 규칙적으로 모니터할 수 있습니다.

SELECT PCT_USED FROM SYS.INDEX_STATUS WHERE NAME = 'index_name';

인덱스 영역 사용 백분율은 인덱스 키 삽입, 갱신, 삭제 횟수에 따라 달라집니다.
인덱스 검증, PCT_USED검서 인덱스 삭제 및 재생성 등의 작업을 여러 번 수행하여 인덱스의 평균 영역 사용 효율성을 관리할 수 있습니다.
인덱스 영역 사용이 평균 이하로 떨어지면 인덱스를 삭제하고 재생성하여 인덱스 영역을 줄입니다.

 

인덱스 삭제

인덱스를 삭제하려면 인덱스가 스키마에 포함되어 있거나 DROP ANY INDEX시스템 권한이 있어야 합니다.

다음과 같은 경우에 인덱스를 삭제할 수 있습니다.
인덱스가 더 이상 필요하지 않을 경우
인덱스에 관련된 테이블에 질의를 수행했을 때 기대되는 성능향상을 제공하지 못한 경우
응용 프로그램이 데이터 질의에 인덱스를 사용하지 않을 경우
인덱스를 사용할 수 없게 되어 재구축 전에 삭제해야 할 경우
인덱스가 너무 단편화되어 재구축 전에 삭제해야 할 경우

인덱스를 삭제할 때 인덱스 세그먼트의 모든 확장 영역은 해당되는 테이블스페이스로 되돌려지며 테이블스페이스의 다른 개체에 사용할 수 있습니다.

인덱스를 삭제하는 방법은 CREATE INDEX명령문으로 인덱스를 명시적으로 생성했는지 또는 테이블에서 키제약 조건을 정의하여 암시적으로 생성했는지에 따라 다릅니다.

주 : 테이블이 삭제되면 관련된 모든 인덱스도 자동으로 삭제됩니다.

UNIQUE키나 PRIMARY KEY제약 조건이 설정된 인덱스만을 삭제할 수는 없습니다.
제약 조건과 관련된 인덱스를 삭제하려면 제약 조건 자체를 사용할 수 없게 하거나 삭제해야 합니다. 

DROP INDEX index_name; 

 

[출처] 인덱스 관리에 대한 지침 사항 |작성자 오라클

Posted by Finebe
,


금일 아침에 하나의 업무가 떨어졌습니다. 검색에서 대소문자 구분하지 않고 검색되는 것입니다.

테이블의 다른 컬럼은 영향을 주지 않고 한 컬럼에만 대하여 대소문자를 구분하지 않게끔 할려면 어떻게 해야 될까요??

한번 알아보도록 하겠습니다.

모든 "문자" 컬럼(즉, CHAR, VARCHAR,또는 TEXT 타입의 컬럼)은 컬럼 문자 셋과 컬럼 Collation을 가지고 있습니다.

▶옵션 구문

col_name {CHAR | VARCHAR | TEXT} ( col_length)

[CHARACTER SET charset_name] [COLLATE collation_name]




▶예문
create table test
(
       column1 VARCHAR(5) CHARACTER SET euckr COLLATE euckr_bin
);

※ MySQL은 아래와 같은 방식으로 컬럼 문자 셋과 콜레션을 선택합니다.

  1. 만일 CHARACTER SET X와 COLLATE Y를 모두 지정하면, 문자셋은 X가 되고, 콜레션은 Y가 됩니다.
  2. 만일 CHARACTER SET X는 지정을 하고 COLLATE는 지정하지 않으면, 문자셋은 X가 되고 콜레션은 디폴트를 사용하게 된다.
  3. 만일 COLLATE Y는 지정을 하되, CHARACTER SET는 지정하지 않으면, 문자셋은 Y와 관련된 것을 사용하고 콜레션은 Y를 사용하게 된다.
  4. 아무것도 지정하지 않는 경우에는 테이블 문자셋과 콜레션을 사용하게 된다.


 

UTF를 하던 euc-kr 을 하던 Collation의 종류가 크게 2가지로 나뉘게 됩니다.

bin이 붙는 경우와 붙지 않는 경우입니다.

  • bin이 붙는 경우 : 문자를 코드화하여 비교하게 된다. 즉 a와 A는 코드가 다르므로 다른 문자로 인식된다.(예: euckr_bin)
  • bin이 붙지 않는 경우 : 문자 그대로 비교하게 되는데, 대소문자를 가리지 않는다. 즉 a와 A는 동일한 문자이다. (예: euckr_korean_ci)

이 차이점은 매우 중요하며, 정렬과 검색에 바로 적용이 됩니다.


출처: http://blog.tinyfall.net/192

 

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

[mysql] date, time과 unix_timestamp  (0) 2009.03.10
mysql에서 데이터베이스 추가 및 권한 설정  (1) 2009.03.05
Mysql 사용자 계정 추가하기  (1) 2009.02.26
MySQL 삭제하기  (0) 2009.02.26
Mysql 백업 & 복원  (0) 2009.02.26
Posted by Finebe
,


소스 분석중에 unix_timestamp 이것이 나와 먼가 했다. 분명 어디서 본듯한...하지만..생각이 나질 않는..그런 존재 ㅎㄷㄷ

select UNIX_TIMESTAMP('1970-01-01') 이렇게 하면 0이 나온다. 1970년 01월 01일부터 1초마다 1씩 증가해 현재시간 2009년 03월 10일 9시 29분으로 타임스팸프 값은 1236709813이다. 올해 발렌타인 2월 14일 아침 8시반에는 1234567890이 되었다는 점ㅋㅋ

mysql에서 사용법은 아래 와 같습니다.

mysql> select date_format( now() , "%Y%m%d-%H%i%S");
+---------------------------------------+
| date_format( now() , "%Y%m%d-%H%i%S") |
+---------------------------------------+
| 20050108-114845                       |
+---------------------------------------+

 

mysql> select date_format( 34252524323432 , "%Y%m%d-%H%i%S");
+------------------------------------------------+
| date_format( 34252524323432 , "%Y%m%d-%H%i%S") |
+------------------------------------------------+
| NULL                                           |
+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

 

mysql> select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
|       1105152570 |
+------------------+

 


mysql> select date_format( unix_timestamp() , "%Y%m%d-%H%i%S");
+--------------------------------------------------+
| date_format( unix_timestamp() , "%Y%m%d-%H%i%S") |
+--------------------------------------------------+
| NULL                                             |
+--------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

mysql> select from_unixtime(now());
+----------------------+
| from_unixtime(now()) |
+----------------------+
| 2008-01-20 06:26:44  |
+----------------------+

 

mysql>  select from_unixtime(1103152232);
+---------------------------+
| from_unixtime(1103152232) |
+---------------------------+
| 2004-12-16 08:10:32       |
+---------------------------+

 


mysql> select from_unixtime(1103152232, "%Y%m%d-%H%i%S");
+--------------------------------------------+
| from_unixtime(1103152232, "%Y%m%d-%H%i%S") |
+--------------------------------------------+
| 20041216-081032                            |
+--------------------------------------------+

 

mysql>  select from_unixtime(1103152232, "%Y-%m-%d %H:%i:%S");
+------------------------------------------------+
| from_unixtime(1103152232, "%Y-%m-%d %H:%i:%S") |
+------------------------------------------------+
| 2004-12-16 08:10:32                            |
+------------------------------------------------+

mysql>

Posted by Finebe
,


Mysql 사용자 계정 생성

 

Mysql 처음 사용하는 초보자분들이 혼동하시는 부분이 사용자 계정 생성부분입니다.

 

우선 Mysql 설치하시게 되면 root 계정은 리눅스 계정과 같습니다.

 

1. Mysql 사용자계정 추가

 

우선 간단히 Mysql 계정 생성방법에 대해서 설명드리겠습니다.

 

Mysql DB서버에는 여러 Database가 존재할것이고 또 많은 User가 존재할겁니다.

 

예를 들자면

 

User에는  최상위 유저인  Root , 일반유저인 mis13, test   존재한다고 보고

 

Database에는 Mis13, Testdb, Database가 존재합니다.

 

아래 그림을 보시면 Root는 3개의 DB에 접속할 권한을 모두 가지고 있고

 

mis13 유저는 Mis13이란 DB만, test 유저는 TestDB, Databases 두 DB 접속할 권한이 있습니다.

 

자 그럼 mis13, test의 유저들의 권한을 줘보겠습니다.

 

우선 사용자를 생성하기 위해서 Root 권한으로 Mysql에 접속을 합니다.

 

#> Mysql  -u root -p

Enter Password : ######

 

mis13 이란 유저가 Mis13이란 DB의 권한을 가지게 해보겠습니다. (암호는 mis1313)

 

mysql> GRANT ALL PRIVILEGES ON Mis13.* to mis13@localhost IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

 

mysql> flush privileges;

 

작성해주시면 끝... mis13으로 접속을 하시면 Mis13이란 DB만 보이실겁니다.

 

2. 그 밖에 외부에서도 접속하기, 모든 DB권한 주기

 

어떤 DB도 접속 가능하게 권한을 주는것은

mysql> GRANT ALL PRIVILEGES on *.*  to mis13@localhost IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

mysql> flush privileges;

 

슈퍼유저로 (즉 root 권한으로) 권한을 주는것은

mysql> GRANT ALL PRIVILEGES on  *.*  to mis13@"%" IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

mysql > flush privileges;

 

GRANT 명령어 말고 Mysql DB 안에 User, DB 테이블에 넣는 법도 있지만 초보분이 사용하시기엔

이 방법이 편하실겁니다.

 

3. 모든 권한이 아닌 부분별 골라서 주기

 

예) mis13 이라는 계정이 전체 데이터베이스에 대해서 select, insert, delete, update 권한만 주고 싶을 경우

mysql>GRANT select, insert, delete, update on *.* to mis13@localhost IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

mysql> flush privileges;

 

예) mis13 이라는 계정이 Mis13 이라는 데이터베이스에 대해서 select, insert, update 권한만 주고 싶을 경우

mysql>GRANT select, insert, update on Mis13.* to mis13@localhost IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

mysql>flush privileges;

 

PS - 함부로 권한을 주진 맙시다.

 

 

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

[MySQL] 테이블 컬럼의 Collation 변경 및 종류  (0) 2009.05.04
[mysql] date, time과 unix_timestamp  (0) 2009.03.10
Mysql 사용자 계정 추가하기  (1) 2009.02.26
MySQL 삭제하기  (0) 2009.02.26
Mysql 백업 & 복원  (0) 2009.02.26
Posted by Finebe
,



[root@ubuntu ~]# mysql -u root -p

mysql> use mysql;

// 로컬호스트 사용자 등록 [ 컬럼 개수(desc user)만큼 'N' ]
mysql> insert into user values('localhost,'userid',password('userpasswd'),'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', 0, 0, 0, 0);

// 원격접속 사용자 등록 [ 컬럼 개수(desc user)만큼 'N' ]
mysql> insert into user values('해당IP,'userid',password('userpasswd'),'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', 0, 0, 0, 0);

// 사용자 등록 시 'Y' 이면 모든 db에 모든 권한을 다 주는 것임

mysql> insert into db values('localhost', 'dbname', 'userid','Y','Y','Y','Y','Y',...);

mysql> create database dbname;

mysql> flush privileges;

[root@ubuntu ~]# /etc/init.d/mysql restart

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

[mysql] date, time과 unix_timestamp  (0) 2009.03.10
mysql에서 데이터베이스 추가 및 권한 설정  (1) 2009.03.05
MySQL 삭제하기  (0) 2009.02.26
Mysql 백업 & 복원  (0) 2009.02.26
MySQL 외부 접근이 되지 않을 경우  (1) 2009.02.25
Posted by Finebe
,

MySQL 삭제하기

Database/MySQL 2009. 2. 26. 10:08




1. 프로세스 확인

[root@dbadb root]# ps aux | grep mysql


2. 프로세스 KILL

[root@dbadb root]# kill 29824 29837



3. 프로세스 확인

[root@dbadb root]# ps aux | grep mysql


4. 디렉토리 삭제

[root@dbadb root]# cd /usr/local
[root@dbadb local]# rm -rf mysql

Posted by Finebe
,



데이터 백업 받기
순서

==============================================================
1. 텔넷 접속
2. mysqldump -u [Mysql ID] -p [DM NAME] > [백업할 파일 이름]
3. password input

===============================================================

 

자신의 컴퓨터로 접속할때

===============================================================

telnet localhost 25  <- 보통 포트 번호가 25이다.

===============================================================

 

외부에서 접속할때
===============================================================

telnet Ip Address 25
===============================================================

 

백업...
===============================================================

리눅스 경우
./mysqldump -u root -p testtable1 > testdb_1.sql
---------------------------------------------------------------

윈도우의 경우
c:\mysql\bin>mysqldump -u root -p testtable1 > testdb_1.sql

===============================================================

 

복구

===============================================================

리눅스 경우
---------------------------------------------------------------

[root@khtnhs bin]# mysql -u root -p testdb < testdb_backup.sql
Enter password;

mysql도 백업해줘야 한다.
[root@khtnhs bin]# mysqldump -u root -p mysql > mysql_backup.sql
Enter password:
[root@khtnhs bin]#

===============================================================

Posted by Finebe
,



로컬에서 작업할 때는 몰랐는데 다른 서버에 MySql을 설치하였더니 원격에서 접근이 되지 않는다.

당연하게 방화벽 때문에 그러려니 하고 방화벽 설정에서 MySql port인 3306 포트를 허용 시켰더니

 

SQLyog에서

Error no 1130 

 '아이피주소' XXXXXXX

라는 메시지가 나오면서 접속이 여전히 되지 않는다.

에러메시지라도 잘 나오면 좋은데

SQLyog는 좋긴 헌데 이런 메시지가 깨지는게 좀 불편하다. (한글 패치 없나..? 좀 찾아봐야지...)

 

여하튼 찾아보니 1130 은 mysql error 메시지라는 걸 확인할 수 있었구

 

정상적(?) 인 에러 구문은..

Error no 1130 

 Host '아이피주소' is not allowed to connect to this mysql server 라고 나온다고 한다.

 

흐음 도대체 어느 부분이 SQLyog 에서는 깨져서 나오는걸까?

 

결론은 해당계정에 대하여 외부에서의 접근권한이 허용되지 않아서 나온 문제..

 

[해결방법]

grant all privileges on *.* to 계정@'%' identified by '패스워드' with grant option;

flush privileges;

 

1130 뿐 아니라 1045(28000) 에러인 경우에도 같은 방법으로 해결된다고 한다.

 

ERROR 1045 (28000): Access denied for user 'root'@'ip주소' (using password: YES)  

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

[mysql] date, time과 unix_timestamp  (0) 2009.03.10
mysql에서 데이터베이스 추가 및 권한 설정  (1) 2009.03.05
Mysql 사용자 계정 추가하기  (1) 2009.02.26
MySQL 삭제하기  (0) 2009.02.26
Mysql 백업 & 복원  (0) 2009.02.26
Posted by Finebe
,