이 문서는 Oracle 9i의 new feature인 ORDER SIBLINGS BY 절을 
   Hierarchical query에 사용하는 예를 통하여 특정 컬럼을 기준으로 
   Ordering된 형태로 display하는 방법을 보여준다. 


Explanation & Example

   Hierarchical query를 구현할 때 ORDER BY 절을 사용하는 것은
   Oracle 7.1 버젼부터 가능한 것이었다.
   그러나, 순서대로 ordering되지 않고 특정 컬럼(emp table의 ename)을
   기준으로 ordering하기를 원한다면 <Bulletin:10373>처럼 procedure를
   작성하여야만 하였다.
   그러나, Oracle 9i 에서는 ORDER BY 절 대신에 ORDER SIBLINGS BY 절을
   사용할 수 있어 user-defined stored procedure를 만들 필요가 없게 되었다. 

1) Ordering 하기 전의 emp table의 Hierarchical query

SQL> @a


ename                      EMPNO    MGR JOB
------------------------- ------ ------ ---------------
     KING                   7839        PRESIDENT
          JONES             7566   7839 MANAGER
               SCOTT        7788   7566 ANALYST
                    ADAMS   7876   7788 CLERK
               FORD         7902   7566 ANALYST
                    SMITH   7369   7902 CLERK
          BLAKE             7698   7839 MANAGER
               ALLEN        7499   7698 SALESMAN
               WARD         7521   7698 SALESMAN
               MARTIN       7654   7698 SALESMAN
               TURNER       7844   7698 SALESMAN


ename                      EMPNO    MGR JOB
------------------------- ------ ------ ---------------
               JAMES        7900   7698 CLERK
          CLARK             7782   7839 MANAGER
               MILLER       7934   7782 CLERK

14 rows selected.


Ordering 하기 전의 a.sql 은 다음과 같다.

   col ename format a25
   col empno format 99999
   col mgr format 99999
   col job format a15
   select rpad(' ', LEVEL*5) || ename "ename", empno, mgr, job
   from emp
   start with job='PRESIDENT'
   connect by prior empno=mgr;

   /


2) 9i의 new feature인 Hierarchical query를 사용하여 Ordering한 경우

SQL> @new_a

ename                      EMPNO    MGR JOB
------------------------- ------ ------ ---------------
     KING                   7839        PRESIDENT
          BLAKE             7698   7839 MANAGER
               ALLEN        7499   7698 SALESMAN
               JAMES        7900   7698 CLERK
               MARTIN       7654   7698 SALESMAN
               TURNER       7844   7698 SALESMAN
               WARD         7521   7698 SALESMAN
          CLARK             7782   7839 MANAGER
               MILLER       7934   7782 CLERK
          JONES             7566   7839 MANAGER
               FORD         7902   7566 ANALYST


ename                      EMPNO    MGR JOB
------------------------- ------ ------ ---------------
                    SMITH   7369   7902 CLERK
               SCOTT        7788   7566 ANALYST
                    ADAMS   7876   7788 CLERK

14 rows selected.


Ordering하기 위해 사용한 new_a.sql 은 다음과 같다.

   col ename format a25
   col empno format 99999
   col mgr format 99999
   col job format a15
   select rpad(' ', LEVEL*5) || ename "ename", empno, mgr, job
   from emp
   start with job='PRESIDENT'
   connect by prior empno=mgr
   order siblings by ename;
   /

 


HIERARCHICAL QUERY DATA의 SORT와 ORDERING

ORACLE 6에서의 HIERARCHICAL QUERY에서는 SORT를 하기 위한 ORDER BY 절을 사용
할 수 없었다. 그러나, ORACLE 7.1이상 VERSION에서는 USER-DEFINED STORED
PROCEDURE를 이용하여 HIERARCHY 순서로 출력되면서 ORDERING할 수 있게 되었다.

세계의 지역에 관한 자료를 예로 보자.

 

      CREATE TABLE UNIVERSE
      ( PARENT VARCHAR2(30) REFERENCES UNIVERSE, 
      NAME  VARCHAR2(30) PRIMARY KEY );
     
     REM SOME TEST DATA
     INSERT INTO UNIVERSE VALUES ( NULL, 'WORLD' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'WORLD', 'EUROPE' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'ENGLAND' ) ;
     INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'THE NETHERLANDS' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'GERMANY' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'WORLD', 'ASIA' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'ASIA', 'JAPAN' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'ASIA', 'CHINA' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'WORLD', 'AMERICA' ) ;
     INSERT INTO UNIVERSE VALUES ( 'AMERICA', 'UNITED STATES' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'AMERICA', 'MEXICO' ) ;
     INSERT INTO UNIVERSE VALUES ( 'WORLD', 'AFRICA' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'AFRICA', 'EGYPT' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'AFRICA', 'MOROCCO' ) ;

 


위의 자료를 다음과 같이 보고자 하는 경우
WORLD
        AFRICA
                EGYPT
                MOROCCO
        AMERICA
                MEXICO
                UNITED STATES
        ASIA
                CHINA
                JAPAN
        EUROPE
                ENGLAND
                GERMANY
                THE NETHERLANDS

 

만약,ORDER BY절이 없이 QUERY하면


     SELECT RPAD( ' ', LEVEL * 5 ) || NAME FROM UNIVERSE 
     CONNECT BY PRIOR NAME = PARENT START WITH PARENT IS NULL;

다음과 같은 결과를 얻게 된다.    
    WORLD
        EUROPE
                ENGLAND
                GERMANY
                THE NETHERLANDS
        ASIA
                JAPAN
                CHINA
        AMERICA
                UNITED STATES
                MEXICO
        AFRICA
                EGYPT
                MOROCCO

만약, 위 문장에 ORDER BY 절을 사용하면

 

      SELECT RPAD( ' ', LEVEL * 5 ) || NAME FROM UNIVERSE
      CONNECT BY PRIOR NAME = PARENT START WITH PARENT IS NULL 
      ORDER BY NAME;

 

다음과 같은 원치 않는 결과를 얻게 된다.    
        AFRICA
        AMERICA
        ASIA
                CHINA
                EGYPT
                ENGLAND
        EUROPE
                GERMANY
                JAPAN
                 MEXICO
                MOROCCO
                THE NETHERLANDS
                UNITED STATES
     WORLD

 

7. 1이상 VERSION에서는 다음과 같이 USER DEFINED FUNCTION을  이용하여

원하는 자료를 얻을 수 있다.

 

CREATE OR REPLACE FUNCTION UNIVERSESORTORDER( PKEY UNIVERSE.NAME%TYPE ) 
     RETURN VARCHAR2 IS
        PATH VARCHAR2(2000);
     BEGIN
        PATH := PKEY;
        -- INSERT ALL PREVIOUS PARENT RECORDS LIKE A DIRECTORY STRUCTURE
        -- E.G. WORLD/EUROPE/...
        FOR CREC IN ( SELECT PARENT FROM UNIVERSE 
                      CONNECT BY PRIOR PARENT = NAME
                      START WITH NAME = PKEY ) LOOP
           PATH := CREC.PARENT || '/' || PATH;
        END LOOP;
        RETURN PATH;
     END;
     /
     
SELECT SUBSTR( RPAD( ' ', LEVEL * 5) || NAME, 1, 40) "THE UNIVERSE"
       FROM UNIVERSE
       CONNECT BY PRIOR NAME = PARENT
       START WITH PARENT IS NULL
       ORDER BY UNIVERSESORTORDER( NAME ) ;


저작자 표시 비영리
Posted by 티엘로

"복구에 실패한 DBA는 용서받을 수 있어도, 백업에 실패한 DBA는 용서받을 수 없다"

 

이 길을 들어서서 제일 먼저 사수에게 들었던 전설과 같다는 말이다.

아무리 시스템의 성능이 고도화되고, 성능개선을 위해 숱한 시간을 허비했어도, 다음날 출근했을 때 어제의 작업, 심지어 그동안의 모든 작업이 허사가 되도록 시스템이 주저앉아버린다면 아무런 소용도 없게 된다.

 

본 문서는 ORACLE사의 RDBMS를 사용하는 사용자 및 운영자들이 적절한 수준에서 백업전략을 수립하고, 이에 맞는 복구전략을 숙지할 수 있도록 가이드를 하는 목적으로 작성하게 되었다.

 

본 장은 일반적인 데이터베이스 백업전략에 대해 정리해 보았다.

 

1. DATABASE-데이터베이스  백업

  1.1  백업의 개요 및 목적

 

 데이터베이스 백업이라 함은 기간시스템의 장애가 발생할 경우 이를 복구하기 위한 보험과 같은 개념이다. 관계형 데이터베이스를 사용하는데 있어서 가장 큰 장점중의 하나는 데이터베이스의 이상 발생시 언제든지 데이터베이스 RECOVERY를 수행하여 현재의 상황으로 복구할 수 있다는 점이다. 이러한 복구가 가능하기 위해서는 데이터베이스 관리자는 복구가 가능한 상태로 데이터베이스를 운용하여야 한다. 예를 들어 사용자가 NO ARCHIVE MODE로 운용할 경우에는 불행히도 데이터베이스를 처음 생성한 시점이나 전체 백업 받은 시점으로만이 복구가 가능하기 때문이다.

일반적인 경우 백업 정책이 없이 무작정 과다한 양의 백업을 받을 경우 일정 기간이 경과하면 백업에 대한 의미가 희미해지게 되고 정상적인 작업을 수행하지 않을 때, 백업파일이 꼭 필요한 경우 작업을 할 수 없는 경우가 발생할 수도 있다.

데이터베이스 관리자는 백업에 대한 정책을 수립하여 꼭 필요한 데이터를 최소의 약으로 백업을 받고 최소의 시간을 소비- 고객의 MTTR(MEAN TIME TO RECOVERY)을 만족할 수 있는 시간-하면서도 항시 복구가 가능한 상태를 유지하여야 한다.

 

1.2 주요 고려사항

 

데이터베이스는 기존의 파일시스템과는 달리 전체 사용자 OBJECT를 하나의 TABLESPACE로 관리하거나 필요에 따라 나누어 사용 및 관리하므로 백업뿐 아니라 복구 시에도 상당히 주의를 요한다. 만일 ARCHIVE LOG 상태에서 운용하고 있는 상태에서 이상이 발생할 경우 복구작업에 필요한 LOG FILE중에 하나의 파일이라도 없어지거나 사용할 수 없는 경우에는 정상적인 복구가 불가능하게 된다.

이러한 불행한 경우를 방지하기 위해서 DBA는 항시 복구가 가능한 상태로 작업하기 위한 백업정책을 수립하여 정확하게 작업하여야 한다.

또한 24 X 7(1 365) DOWN TIME없이 운용되는 시스템의 경우 백업 정책의 수립에 COLD BACKUP과 같은 FULL IMAGE 백업이 불가능 할 수 있기에 HOT BACKUP 혹은 EXPORT를 통한 LOGICAL 백업만이 가능할 수 있다. 이런 제약사항으로 인해 혹시 발생할 수 있는 장애에 적절한 대응을 하지 못할 수 있다.

이러한 결정상황을 파악하여 백업정책 수립에 심혈을 기울여야 할 것이며 , 시스템 운용의 묘를 살려야 할 것이다.

또한 HOT BACKUP등의 ONLINE상에서 데이터베이스를 백업하기 위해서는 반드시 ARCHIVE MODE로 운영되어야 한다.

 

 

1.3 백업 전략

 

DBA가 어떠한 방법으로 백업을 유지하느냐에 따라 복구 성공률이나 복구 속도 등이 결정된다 물론 매일 작업 종료 후 전체 데이터베이스에 대하여 FULL BACKUP을 한다면 가장 안전한 백업이라고 볼 수 있으나 실질적으로 백업을 받는데 많은 시간을 요구하므로 현실적으로는 불가능한 작업이라 볼 수 있다.

: XXX시스템의 특징은 24시간 365일 무중단 운영을 원칙으로 하고 있고, 타 시스템과의 INTERFACE 대상의 DATA LOAD가 야간에 대량으로 발생하며, 정산 및 온라인 통계작업을 통한 대량의 TRANSACTION이 발생한다.이는 다시 말해 COLD BACKUP을 위한 시스템 중단이 사실상 불가능하다는 말과 같다.

 

이런 시스템의 특성을 반영한 백업시스템 정책은 현실적으로 적용 가능한 HOT BACKUP을 업무가 집중하지 않는 시간에 수행하는 것으로 정하여야 하며, 단위 업무별로 대량의 변화가 발생할 경우에 데이터의 수정 혹은 삭제, 변화가 발생하기 전에 각 단위 팀의 별도 APPLICATION을 통해 데이터 BACKUP을 수행하는 것으로 한다.

 

가.    업무수행에 지장을 받지 않는 시간대에 HOT BACKUP을 수행한다.

나.    업무변화가 대량으로 발생하기 전에 APPLICATION을 통한 BACKUP수행

다.    자주 read-write되는 tablespace는 자주 online backup을 수행.

라.    데이터베이스에 구조적인 변화가 생기기 , full backup을 수행.

마.    이전의 backup본을 최소한 2본 이상 가지고 있을 필요가 있다.

바.    특정 테이블들에 대한 data의 입력 오류로 인해 과거 특정 시점으로의 회귀가 필요하거나, 특정 테이블 데이터의 분실로 인해 다시 복귀를 하고자 할 경우를 대비하여 Logical Backup Export를 수시로 받아놓도록 한다.

사.    Unrecoverable Creation Object redo log file logging되지 않기에 이러한 Object들에 대해서는 Export Utility를 사용하여 Backup하도록 하는 것이 좋으며, 초기 생성 후 정상적인 데이터 입력/수정이 이루어질 경우에는 logging으로 변경하도록 한다.

 

1.4 백업 방법

1.4.1 Physical Backup

물리적인 데이터베이스 파일을 한 위치에서 다른 위치로 COPY하는 물리적인 복제를 Physical Backup이라 한다. 또한 Physical Backup Offline, Online Backup(Without Archiving / With Archiving)으로 나눌 수 있다. 즉 데이터베이스 상태가 Down인 상황에서 Backup을 수행하면 Offline Backup이며 이 백업은 Archive Log파일의 Backup은 불필요하나, 데이터베이스가 Online인 상황에서 Backup을 수행하는 Online Backup인 경우에는 Backup도중에도 Transaction이 발생할 수 있고, 이 기간 중에 발생한 데이터의 보존을 위해 Archive Log를 반드시 백업하고 있어야 한다.

 

1.4.1.1 Cold Backup (Offline Backup)

데이터베이스를 Shutdown 한 이후 아래와 같은 파일들을 백업 Library COPY하여야 한다.

 . DataFiles (V$datafile확인자료)

 . Redo Log Files (V$logfile확인자료)

 . Control Files (V$controlfile확인자료)

 . Parameter Files(initSID.ora, spfileSID, configSID.ora, etc)

 

1.4.1.2 HOT Backup(Online Backup)

데이터베이스가 구동중인 상태에서 datafile을 복사하는 방식으로 Archive Log Mode로 운영되어야 한다.

SQL> ALTER TABLESPACE …… BEGIN BACKUP;

$ *.DBF COPY수행

SQL> ALTER TABLESPACE ….. END   BACKUP;

 

     이런 명령을 수행하는 기간 동안에는 해당 TABLESPACE HOTBACKUP MODE로 운영중이어서 해당 TABLESPACE안에 있는 TABLE에 대한 DML이 발생할 경우 DATAFILE WRITE가 불가능하기 때문에 REDO LOG에만 기록하는 기록하게 되고, 백업이 완료된 시점에서 LOG에 저장된 변경사항을 다시 Data file에 기록하기 위해 적지 않은  부하가 발생할 수 있다. 그러므로 ONLINE HOT BACKUP을 수행하는 시간은 작업량이 적고, 사용자의 접근을 최소화 할 수 있는 시간을 선정하여야 하며, 최소한의 시간에 HOT BACKUP을 수행할 수 있어야 한다.

 

또한 BACKUP의 시작과 끝에는 HOT BACKUP의 시작 바로 전까지 발생한 TRANSACTION REDO LOG CHANGE하도록 하여 ARCHIVING하도록 한다.또한 BACKUP이 종료한 후에도 LOG CHANGE를 하도록 하여 BACKUP중에 발생한 DATA에 대한 REDO LOG 내 변경분을 DATAFILE에 기록 및 ARCHIVING을 통한 ARCHIVE FILE BACKUP을 동시에 수행할 수 있도록 하여야 한다.

 

     SQL> ALTER SYSTEM ARCHIVE LOG CURRENTS;

 

 

1.4.2 Logical Backup

    Export Utility를 이용한 데이터 백업은 보통 DML 발생빈도가 높아 데이터블록의 활용도나 Capacity를 높이지 못할 경우 데이터블록을 최적화하기 위해 사용할 수 있고, 사용자의 실수 혹은 구조상의 문제로 인해 데이터의 손실을 최소화하기 위해 데이터의 보존을 목적으로 사용하는 방법이다.

Export Utility를 이용한 데이터 백업방법은 Full, User, Table단위의 Export Mode가 있다.

 

1.4.3 Archive Log File Backup

    1.4.3.1 Archive Log Mode 구조

    오라클에서 Online Backup을 받거나 완벽한 복구작업을 수행하기 위해서는 데이터베이스를 “Archive Log Mode”로 운영하여야 한다.

오라클의 log File기록방법은 순환기록방법을 채택하고 있다. 첫 번째 log File을 기입하고 나면 두 번째 것을 기입하고, 그것이 끝나면 세 번째 log를 기록한다. 그리고 마지막 Online Redo Log File을 쓰고 나면 Log Writer(LGWR)가 첫번째 Log File을 다시 선택하여 덮어쓰기 시작한다.

Oracle Archive Log Mode에서 작동하고 있을 때에는 Archive Background Process(ARCH)는 각각의 Redo Log File을 덮어쓰기 전에 그에 대한 복사본을 지정된 디렉토리에 만들게 된다.

 

 [그림 1 No Archive Log Mode]

CheckPoint가 발생할 때 까지는 Redo Log File은 재사용되지 않으며 ARCH에 의해 물리적으로 Redo Log File은 다시 backup된다.

 

 

             [그림 2 Archive Log Mode]

 

    1.4.3.2  Archive Mode No-Archive Mode의 비교

   위 그림에서 보는 바와 같이 Redo Log가 덮어 쓰이기 시작하고 Archive Mode가 아니면 Media Recovery는 마지막으로 Full Backup받은 시점으로 밖에 복구가 불가능 하다. 반면에 Archive Mode로 운영되는 데이터베이스는 가장 나중의 변화까지도 복구가 가능하다. Archive Log Mode로 운영 시 log_archive_dest Directory밑에 Archive File이 계속 발생하여 할당된 Space가 부족할 경우 log Change가 발생하지 않아 데이터베이스가 Hang-Up이 될 수 있으므로 Space관리를 유의하여야 한다.

 

    1.4.3.3 Archive Log의 백업

 데이터베이스 백업주기 결정시 archive log backup주기도 결정되어야 한다.

Archive log O/S Backup 을 통해 보관하고, Archive Log가 너무 많이 발생하지 않도록 Archive Log Size Redo Log의 사이즈를 적절히 조절하여야 복구를 위한 필요시간을 줄일 수 있다.

 Archive Log는 데이터베이스 백업수행과는 별도로 Space의 여유분을 Check하여 일정수치 이상 Free Space가 부족할 경우 자동적으로 Copy한 다음 삭제하도록 스케쥴링하여야 한다.

 

  1.5 백업 주기

    1.5.1 백업주기의 결정

백업의 주기 및 백업 시기, 시간은 어떠한 백업방법을 적용할 것인가와 어느 정도의 Down Time을 허용할 것인가에 따라 결정된다.

Hot Backup만을 허용하는 사이트에는 Transaction양이 최소화되는 시간을 선택하여 백업을 수행할 것이고, 시스템을 사용할 수 없는 최대한의 시간을 1~3시간으로 선정었다면 복구를 위해 주어진 시간이 1~3시간으로 판단되어 이에 맞는 백업주기가 결정되게 된다.

 

전체 시스템을 모두 Backup하는데 걸리는 시간을 산정하여야 한다. 예를 들어 전체 시스템을 Hot Backup하는데 걸리는 시간이 최대 3시간이 걸린다 할 경우 이를 3일 주기로 전체시스템을 백업할 수 있도록 나눈다면 하루에 백업에 소요되는 시간은 대략 1시간이 될 것이다.

그런데 3일 주기로 백업의 한 사이클이 종료되는 관계로 월요일에 백업한 테이블스페이스에 속한 데이터파일에 문제가 생긴 시기가 수요일 오후라면 약 이틀간 발생한 Archive Log를 이용하여 복구를 하여야 하는데 DataFile, Archive Log Restore 및 복구를 마치는데 주어진 Down Time안에 해결할 수 있는지 판단하여야 한다.

 일반적으로 백업의 주기는 1,1분기,1,1일에 두고 주기 및 방법을 정한다. 또한 백업의 주기 뿐 아니라  백업한 Media의 보관 주기 또한 백업 및 복구에 큰 영향을 미치는 요소이다.

 

    1.5.2 백업 주기 별 대상 결정

백업의 주기(일단위,주단위,월단위,분기단위,년단위,기타)별로 백업 대상을 선정하여 백업 매체를 선정하고, 백업대상을 LIST-UP한 다음 백업하도록 한다.

       1.5.2.1 백업 주기

 

요일

대상

백업대상

A

B

C

D

E

F

ALL

TBS

백업사이즈

354G

296G

338G

354G

296G

338G

998G

 


저작자 표시 비영리
Posted by 티엘로


# dd if=/dev/zero of=/swap1 bs=1024 count=532480
(1024
바이트의 크기로 532480 블럭을 만드는거죠 520M ,
만들고 싶은 크기x1024 해서 count 넣어 주시면 됩니다.)


# mkswqp /swap1 532480 (
스왑 파일 생성)

# chmod 0600 /swap1
# sync; sync (
확실하게 하기위해)
# swapon /swap1 (
스왑 파일 활성화 )

free
명령으로 확인해 보세요.

해제할때는 swapoff /swap1

부팅시 자동으로 스왑 파일을 활성화 시킬려면 

/etc/rc.d/rc.local 파일
끝에 swapon /swap1 이라고 추가하면 됩니다.

저작자 표시 비영리
Posted by 티엘로

MYSQL 주요함수

Blah Blah 2008/10/31 18:33

MYSQL 주요함수
여기서는 mysql에 사용되는 중요한 몇 가지 기본 함수들을 소개하겠습니다.    대부분의 함수가 php와 연관하여 비슷한 것들이 많이 있습니다.    php에서 만약 이 함수를 사용하려면 mysql query 문을 이용하는 방법도 있습니다.    (여기서의 설명은 직접 local에서 접속해서 하는 것보다 클라이언트에서 telnet으로 접속해서 사용한 예를 더 많이 들었습니다.)


연산자 
연산자의 경우 일반적으로 사용하는 연산자들을 사용합니다.    "+" , "-" , "*" , "/" 등 입니다.    그럼 각각의 수행 결과를 확인 하겠습니다. 

비교 연산자 

비교 연산자는 결과가 참(1) 과 거짓(0)으로 결과를 출력합니다.

그리고 비교 연산자의 경우 몇 가지 규칙이 있습니다.

   ~
인수가 모두 문자열이면 문자열로 비교됩니다.
   ~
인수가 모두 정수면 정수로 비교됩니다.
   ~
인수가 모두 "null" 이면 연산의 결과도 "null"이 됩니다.
   ~
한쪽의 인수가 "timestamp" 이면 나머지도 같이 변환되어 비교됩니다.
   ~
한쪽의 인수가 "datetime" 이면 나머지도 같이 변환되어 비교됩니다.
   ~
나머지의 경우는 부동소수점 실수로 비교됩니다.

기호로는
 

   "=" -
같다 
   "!= ,<>" -
같지 않다  
   "<=" -
작거나 같다
 
   "<" -
작다  
   ">=" -
크거나 같다
 
   ">" -
크다
   "<=>" -
둘 중 한쪽이 "null" 일 경우 0을 출력

   
인자 between (최소값) and (최대값) - 인자가 최소값과 최대값 사이에 존재 하면 "1"을 그렇지
   
않을 경우 "0"을 출력합니다.
    
인자 in (, , ) - 인자가 ( ) 안에 존재하면 "1"을 그렇지 않으면 "0"을 출력합니다.

 날짜와 시간 관련 함수 
날짜와 시간 관련 함수는 여러모로 사용하는 곳이 많은 부분입니다.    대부분의 표현에서 날짜와 시간은 꼭 들어가기 때문에 이 부분을 먼저 다루도록 하겠습니다. 

MONTHNAME("
날짜") - 해당하는 날짜의 월을 영어로 리턴합니다.
QUARTER("
날짜") - 해당하는 날짜의 분기를 리턴해 줍니다.
YEAR("
날짜") - 해당 날짜의 년도를 리턴해 줍니다.
HOUR("
시간") - 해당하는 시간을 리턴합니다.
MINUTE("
시간") - 해당 시간의 분을 리턴합니다.
SECOND("
시간") - 해당 시간의 초를 리턴합니다.
PERIOD_ADD(
날짜, N) - 해당하는 날짜에의 개월에 "N"개월을 더 합니다.
            (
날짜는 YYMM, YYYYMM형식으로 주어지면 YYYYMM 형식으로 리턴합니다.)
CURDARE( ) -
오늘 날짜를 YYYY-MM-DD 또는 YYYYMMDD 형식으로 리턴해 줍니다.
           
함수가 문자열 또는 숫자로 사용됨에 따라 리턴 값은 달라 집니다.
CURTIME( ) -
현재 시간을 HH:MM:SS 또는 HHMMSS 형식으로 리턴해 줍니다.
           
이 함수 역시 함수가 문자열 또는 숫자로 사용됨에 따라 리턴 값이 달라 집니다.
NOW( ) -
현재의 날짜와 시간을 리턴합니다.
UNIX_TIMESTAMP( ) -
유닉스 타임스탬프를 리턴합니다.
                   
날짜 인자가 있을 경우 해당 날짜의 유닉스 타임스탬프를 리턴하고, 인자가 없을
                   
현재의 유닉스 타임스탬프를 리턴합니다.(초 단위로 나타냅니다.)
FROM_UNIXTIME (
유닉스 타임스탬프) - 유닉스 타임스탬프 날짜에서 일반 형식의 날짜와 시간으로 리턴합니다이 함수를 이용해서 원하는 데이터 형태로도 출력이 가능합니다. (DATE_FORMAT( ) 함수는 날짜와 시간을 여러 가지 형태로 표현 가능하게합니다. 다음 함수를 참고 하세요.)
DATE_FORMAT(
날짜, 형태) - 형태의 종류에 맞게 여러 가지 양식으로 날짜와 시간을 리턴해 줍니다.
                         
특히 이 함수는 자주 사용 되므로 관심있게 보기 바랍니다.
형태의 종류는….
   %M -
월 이름을 영어로 리턴합니다.(January)
   %D -
접미사를 사용해 영어로 일을 리턴합니다.(1st , 2nd ..)
 
   %W -
요일을 영어로 리턴합니다. (Monday)
   %y - 2
자리 연도를 리턴합니다.
   %m -
월을 숫자로 리턴합니다.(01 , 02 , 03)
   %d -
일을 숫자로 리턴합니다. (00 , 01 ,02 )
   %a -
요일을 짧은 영어로 리턴합니다. (Mon)
   %e -
일을 숫자로 리턴합니다.(0 , 1 , 2)
   %c -
월을 숫자로 리턴합니다. (1 , 2 , 3)
   %j -
한해의 몇 번째 요일인지 리턴합니다. (001 ~ 366)
   %b -
월을 짧은 영어로 리턴합니다. (Jan)
   %H - 24
시간 형식의 시간을 리턴합니다. (00 ~ 23 )
   %h - 12
시간 형식의 시간을 리턴합니다. (01 ~ 12)
   %k - 24
시간 형식의 시간을 리턴합니다. (1 ~ 23)
   %l -
시간을 리턴합니다. (1 ~ 12)
   %i -
분을 리턴합니다. (00 ~ 59)
   %T -
시분초의 24시간 형식을 리턴합니다. (hh:mm:ss)
   %r -
시분초의 12시간 형식을 리턴합니다. (hh:mm:ss)
   %s -
초를 리턴합니다. (00 ~ 59)
   %p - AM , PM
을 리턴합니다.
   %w -
일주일 중 몇 번째 요일인지 리턴합니다.(0 - 일요일)
   %U -
한해 중 몇 번째 주인지 리턴합니다.(일요일이 시작)
   %u -
한해 중 몇 번째 주인지 리턴합니다.(월요일이 시작)

   second -
초를 추가 합니다(interval 1 second)
   minute -
분을 추가 합니다.(interval 1 minute)
   hour -
시간을 추가 합니다.(interval 1 hour)
   day -
일을 추가 합니다.(interval 1 day)
   month -
달을 추가 합니다. .(interval 1 month)
   year -
년을 추가 합니다. .(interval 1 year)
   minute_second -
분과 초를 추가 합니다. (interval "1:1" minute_second)
   hour_minute -
시간과 분을 추가 합니다. (interval "1:1" hour_minute)
   day_hour -
일과 시간을 추가 합니다. (interval "1 1" day_hour)
   year_month -
년과 월을 추가 합니다. (interval "1-1" year_month)
   hour_second -
시간과 분, 초를 추가 합니다. (interval "1:1:1" hour_second)
   day_minute -
일과 시간, 분을 추가 합니다.(interval "1 1:1" day_minute)
   day_second -
일과 시간, , 초를 추가 합니다.(interval "1 1:1:1" day_second)

만약 날짜와 시간을 빼기를 원한다면 " - "를 사용하면 됩니다. 또 다른 방법은 DATE_SUB( ) 함수를
사용하는 것입니다.

PERIOD_DIFF(
날짜1, 날짜2) - 날짜1 과 날짜2 사이의 개월 수를 리턴합니다.


문자열 관련 함수
 


php
스크립트 프로그래밍을 하면서 php에서 지원하는 함수를 이용한 방법으로 많은 문자열 처리하게 될 것입니다.    Mysql 역시 문자열을 처리하는 여러 가지 함수가 있습니다.    여러분들은 데이터를 데이터베이스에 저장할 때 php 함수에서 지원하는 함수를 사용할 수도 있지만 여기서 설명할 mysql 함수를 사용해도 됩니다.    (문자열 함수는 결과 값이 정의된 길이보다 클 경우 NULL을 리턴합니다.) 

HEX(n) -
해당 10진수를 16진수로 리턴해 줍니다. (NULL NULL로 리턴)
OCT(n) -
해당 10진수를 8진수로 리턴해 줍니다.(NULL -> NULL로 리턴)
BIN(n) -
해당 10진수를 2진수로 리턴합니다. (NULL -> NULL로 리턴)
CONV(n , a , b) -
해당 숫자를 a 형식의 진수에서 b 형식의 진수로 변환해서 리턴합니다.
 
                 
앞에서 설명한 각 진수별 변환 방법의 기능을 다 가지고 있는 함수입니다.
                (
인자중 NULL이 있으면 NULL을 리턴합니다. 2 ~36진까지 가능)
ASCII(
문자열) - 해당 문자열의 처음 위치의 ASCII 코드를 리턴합니다.(NULL -> NULL로 리턴 합니다.)
FIELD(Nstring , string ,
) - Nstring에 해당하는 문자열이 몇 번째 인지 리턴합니다.
LOWER(
문자열) - 해당 문자열을 소문자로 변환해서 리턴합니다.(컴파일 시 선택한 문자 설정)
UPPER(
문자열) - 해당 문자열을 대문자로 변환해서 리턴합니다.
              (
컴파일 시 선택한 문자 설정)
LOAD_FILE(
파일명) - 64kb 보다 작은 내용의 파일을 읽어 들여 문자열로 리턴합니다.
                  (64kb
보다 클 경우 NULL을 리턴합니다.)
SPACE(n) -
해당 인자의 수 만큼 공백을 리턴합니다.
REVERSE(
문자열) - 해당 문자열의 순서를 바꾸어 리턴합니다.
INSERT(
문자열, a , b , 문자열1) - 해당 문자열을 a 위치부터 b 크기 만큼 문자열1을 넣어 리턴합니다.
SUBSTRING_INDEX(
문자열, a , count ) - 해당 문자열을  a로 구분해서 배열로 만들고 count 수만큼 리턴해줍니다.  오른쪽부터 출력하길 원하면 음수를 적으면 됩니다.

REPEAT(
문자열 , c ) - 해당 문자열을  c 만큼 반복해서 리턴합니다.
LTRIM(
문자열) - 해당 문자열의 왼쪽 공백을 제거합니다.
RTRIM(
문자열) - 해당 문자열의 오른쪽 공백을 제거하고 리턴합니다.
TRIM(
옵션 a FROM 문자열) - 주어진 옵션에 따라 a 문자를 제거하고 리턴합니다.
옵션에는 LEADING | TRAILING | BOTH 등이 있으며 각각 앞쪽 공백제거 | 뒤쪽 공백 제거 | 앞뒤 공백 제거입니다.
 
CONCAT(
문자열, 문자열 …..) - 해당 문자열을 이어 줍니다.
                             
이 함수는 php " . "을 이용한 문자열 연결 방법과 유사 합니다.
                            (NULL -> NULL
로 리턴합니다.)
LEFT(
문자열,n) - n 만큼 해당 문자열을 왼쪽부터 리턴합니다.
 
RIGHT(
문자열, n) - n만큼 해당 문자열을 오른쪽부터 리턴합니다.
LOCATE(a , b) - a(
문자열) b(문자열)에서 처음부터 몇 번째 위치인지 리턴합니다.
LPAD(
문자열 , a , b) - 해당 문자열에 a 길이 만큼 b 문자를 왼쪽부터 넣어 리턴합니다.
RPAD(
문자열, a , b) - 해당 문자열에 a 길이만큼 b 문자를 오른쪽에 넣어 리턴합니다.

여기까지 문자열 함수의 대부분을 설명했습니다.몇 가지 빠진 함수들도 있지만 여기 있는 것만으로도 대부분을 표현하기는 충분합니다.

기타 함수들
 


mysql
의 수학 함수는 여기서 다루지 않도록 하겠습니다.    대부분의 경우 php 함수가 대신 할 수 있기 때문에 구지 mysql 함수를 이용해 수학연산을 할 필요는 없습니다.    하지만 어느 경우든 꼭 사용해야만 할 경우는 mysql 매뉴얼을 보시기 바랍니다.    짧은 영어 실력으로도 충분히 보실 수 있는 매뉴얼이기 때문에 걱정은 필요 없습니다.    그럼, 여기서는 자주 사용되는 나머지 함수들을 설명하겠습니다. 


USER() -
현재 mysql에 접속 중인 사용자 이름을 리턴합니다.
VERSION( ) - mysql
의 버전을 리턴해 줍니다.
PASSWORD(
문자열) - 이 함수는 mysql의 데이터 베이스에 문자열을 암호화 해서 저장해 줍니다. 대부분의 경우 사용자 인증에 이용합니다.  

, 암호화된 문자열끼리 비교함으로 해서 인증을 하는 것입니다. 뒤에 설명할 admin tool의 사용자 인증 역시 이 방법을 이용했습니다.

이렇게 중요하게 사용되는 몇 가지 함수들을 봤습니다.
대부분의 프로그램과 스크립트들은 거의 비슷한 양식의 함수를 가지고 있습니다.
 
그래서 다른 곳에서 비슷한 함수를 보면 그 기능이 무엇인지는 어느정도 예상할 수 있습니다.
꼭 필요한 것을 확실히 이해하는 것도 중요합니다.

 

저작자 표시 비영리
Posted by 티엘로