MYSQL / R

게시물 검색
전체 23건 2 페이지
  • MERGE tables (2개 테이블 병합 테이블 만들기)
    mysql> CREATE TABLE t1 (
    ->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> message CHAR(20)) ENGINE=MyISAM;
    mysql> CREATE TABLE t2 (
    -> a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> message CHAR(20)) ENGINE=MyISAM;
    mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
    mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
    mysql> CREATE TABLE total (
    -> a INT NOT NULL AUTO_INCREMENT,
    -> message CHAR(20), INDEX(a))
    -> ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

    t1, t2 테이블의 데이터를 total 테이블에 병합된 데이터로 insert 하게 된다.

    NSERT_METHOD는 total 테이블에 다이렉트로 INSERT할경우 UNION에
    정의한 테이블중 어느 테이블에 INSERT를 할건지 정의하는것이다.(FISRT or LAST)


    ※ 주의할점은 두 테이블의 레코드 형식 및 타입까지 모두 일치하여야 한다.…
    작성자최고관리자 시간 02-01 조회 2268
  • merge table 과 partition table
    merge 테이블은 구간적용없이 여러개의 테이블을 합쳐서 사용하는 개념입니다.

    여러개의 테이블에 각각 insert된 data들을 합쳐서 볼 때 사용합니다.

    어느 테이블 위치에 들어갈지를 DB가 자동으로 결정하지 않습니다.

    수동으로 특정 위치에 insert 하여야 합니다.

    view, union all 개념이기 때문에,

    예를 들어 월단위 데이터를 1~4월 나눠서 네개 테이블로 구성하고,

    구성된 네개의 테이블을 merge 테이블로 구성했을때,

    1월 데이터가 들어오면 1월 테이블에 insert하지 않고 merge table에 했을때

    어디에 들어갈 지 알 수 없습니다.(옵션을 통해 처음, 마지막 테이블에 들어가게 할 수 있습니다)



    partiton 테이블은 구간 및 특정값 지정을 통해 데이터는 분산시키는 개념입니다.

    하나의 partition 테이블에 insert를 했을 경우 알아서 위치를 지정해주며,

    데이터를 셀렉할 때도 - 위예시를 통해 알아보면 -

    1월 데이터를 셀렉트 하면 내부적으로 1월 파티션만 조회합니다.



    결과적으로

    partition 테이블은 데이터를 넣을때 자동으로 원하는 위치에 넣어주고,

    꺼낼때 대략적인 위치를 파악하여 scanning 범위를 좁혀주나,



    merge 테이블은 데이터를 원하는 위치에 넣기 힘들고,

    꺼낼때는 - indexing 제외 - scanning 범위를 줄일 수 없는 테이블입니다.…
    작성자최고관리자 시간 02-01 조회 1356
  • MySQL 파티션 테이블 백업 및 복구
    ADWorks 파티셔닝 테이블 백업 정책


    1. 파티셔닝 테이블
    - ADWORKS_TS


    2. 사용하지 않는 테이블 ( adws2v1, adws2v2 Miner 정지 )
    - ADWORKS_NB
    - ADWORKS_SPM
    - ADWORKS_SPM_TS
    - ADWORKS_STAT_BOUNCE
    - ADWORKS_STAT_SPM


    3. ADWORKS_TS 데이터는 2년 유지
    ex) 2011년 01월 01일 2008년 데이터 백업 후 삭제 (추후 복구가능 - 하지만 시간이 다소 걸릴 수 있음)


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


    ADWORKS_TS 파티셔닝 테이블 백업


    ]# mysqldump --user=username --password=password --no-create-info --where="TS_ID=2008030000000000000 and TS_ID=2008040000000000000 and TS_ID=2008050000000000000 and TS_ID=2008060000000000000 and TS_ID=2008070000000000000 and TS_ID=2008080000000000000 and TS_ID=2008090000000000000 and TS_ID=2008100000000000000 and TS_ID=2008110000000000000 and TS_ID=2008120000000000000 and TS_ID…
    작성자최고관리자 시간 02-01 조회 2794
  • 대용량 table 파티션하는 방법
    MySQL 5.5 릴리즈는 몇 가지 기능향상이 되었습니다. 당연히, 대부분의 내용은 semi-synchronous replication가 주목되는 동안 파티션의 향상된 기능은 도외시되고, 때로는 이 기능의 진정한 의미에 대한 약간의 오해도 발생했습니다. 이 문서를 통해서, 멋진 기능과 특히 잘 이해가 되지 않는 부분을 설명하려 합니다.
    직관적인 부분: 비정수(non-integer) 컬럼의 파티션


    지금까지 정수형이 아닌 컬럼을 사용하여 파티션을 사용해본 경험이 있다면(MySQL 5.1 파티션 연습 참조) 많은 문제로 일종의 좌절을 경험했을 것입니다.
    새로운 추가사항은 범위(RANGE)와 리스트 파티션과 함꼐 작동합니다. 새로운 기능을 소개하는 새로운 컬럼 키워드가 있습니다.
    다음과 같은 테이블이 있다고 가정합니다.
    CREATE TABLE expenses (
    expense_date DATE NOT NULL,
    category VARCHAR(30),
    amount DECIMAL (10,3)
    );
    만약에 MySQL 5.1에서 category 컬럼으로 파티션을 원한다면, category 컬럼을 정수형으로 변환하고 category에 대한 내용을 찾아볼 수 있는 테이블을 추가해야만 합니다. MySQL 5.5에서는 간단하게 처리할 수 있습니다.
    ALTER TABLE expenses
    PARTITION BY LIST COLUMNS (category)
    (
    PARTITION p01 VALUES IN ( 'lodging', 'food'),
    PARTITION p02 VALUES IN ( 'flights', 'ground transportation'),
    PARTITION p03 VALUES IN ( 'leisure', 'customer entertainment'),
    PARTITION p04 VALUES IN ( 'communications'),
    PARTITION p05 VALUES IN ( 'fees')
    );
    이 구문은 명확하게 읽을 수 있고 효율적인 결집으로 데이터를 정리하는것 뿐만아니라 오직 열거된 category만 사용이 가능하여, 다른측면에서의 혜택이 있습니다.
    MySQL 5.1에서의 또 다른 문제점은 날자열의 처리입니다. 아래와 같은 상황에서 YEAR 또는 TO_DAYS 중 하나를 사용하는 컬럼에 대해서 직접 사용할 수 없지만, 변환이 필요합니다.
    /* with MySQL 5.1*/
    CREATE TABLE t2
    (
    dt DATE
    )
    PARTITION BY RANGE (TO_DAYS(dt))
    (
    PARTITION p01 VALUES LESS THAN (TO_DAYS('2007-01-01')),
    PARTITION p02 VALUES LESS THAN (TO_DAYS('2008-01-01')),
    PARTITION p03 VALUES LESS THAN (TO_DAYS('2009-01-01')),
    PARTITION p04 VALUES LESS THAN (MAXVALUE));
    SHOW CREATE TABLE t2 \G
    *************************** 1. row ***************************
    Table: t2
    Create Table: CREATE TABLE `t2` (
    `dt` date DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    /*!50100 PARTITION BY RANGE (TO_DAYS(dt))
    (PARTITION p01 VALUES LESS THAN (733042) ENGINE = MyISAM,
    PARTITION p02 VALUES LESS THAN (733407) ENGINE = MyISAM,
    PARTITION p03 VALUES LESS THAN (733773) ENGINE = MyISAM,
    PARTITION p04 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
    이 얼마나 무섭고 진정한 고통을 주는 코드입니까? 물론, 해결 방법은 있지만, 많은 문제가 발생했습니다. YEAR 또는 TO_DAYS를 사용하여 파티션을 정의하는 것과, 함수로 파니셔닝된 부분에 질의 문으로 노출된 컬럼을 기준으로 질의를 하는 것은 정말 말도 안 되는 퍼즐을 마추는 것 같습니다.
    이젠 상황이 달라졌습니다. 날짜별로 분할하는 것이 쉬고 직관적으로 되었습니다.
    /*With MySQL 5.5*/
    CREATE TABLE t2
    (
    dt DATE
    )
    PARTITION BY RANGE COLUMNS (dt)
    (
    PARTITION p01 VALUES LESS THAN ('2007-01-01'),
    PARTITION p02 VALUES LESS THAN ('2008-01-01'),
    PARTITION p03 VALUES LESS THAN ('2009-01-01'),
    PARTITION p04 VALUES LESS THAN (MAXVALUE));
    SHOW CREATE TABLE t2 \G
    *************************** 1. row ***************************
    Table: t2
    Create Table: CREATE TABLE `t2` (
    `dt` date DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    /*!50500 PARTITION BY RANGE COLUMNS(dt)
    (PARTITION p01 VALUES LESS THAN ('2007-01-01') ENGINE = MyISAM,
    PARTITION p02 VALUES LESS THAN ('2008-01-01') ENGINE = MyISAM,
    PARTITION p03 VALUES LESS THAN ('2009-01-01') ENGINE = MyISAM,
    PARTITION p04 VALUES LESS THAN (MAXVALUE) ENGINE = MyISAM) */
    이전 경우와 같은 파티션 정리는 버릴 수 있습니다. 정의된 컬럼을 기준으로 하기 때문에, 컬럼을 기준으로 함수와 쿼리의 의한 정의 사이에서 혼란이 없습니다. DBA의 업무를 수월하게 하기 위해서, 정의되어진 값을 그대로 유지합니다.
    모두가 행복해졌죠? 아마, 대부분 그럴것 입니다. 이제 컬럼 특성에 대한 조금 더 모호한 특성에 대하여 살펴보겠습니다.
    직관에 반대되는 부분: 다중 컬럼(multiple columns)


    컬럼 키워드는 문자열이나 date 컬럼의 파티션 정의자를 허락하는 것보다 더 좋습니다. 그것은 또한 파티션을 정의하는 다중 컬럼으로 사용이 가능합니다.
    공식적인 문서에서 아래의 예문과 비슷한 몇 가지 예제를 본적이 있을 것입니다.
    CREATE TABLE p1 (
    a INT,
    b INT,
    c INT
    )
    PARTITION BY RANGE COLUMNS (a,b)
    (
    PARTITION p01 VALUES LESS THAN (10,20),
    PARTITION p02 VALUES LESS THAN (20,30),
    PARTITION p03 VALUES LESS THAN (30,40),
    PARTITION p04 VALUES LESS THAN (40,MAXVALUE),
    PARTITION p05 VALUES LESS THAN (MAXVALUE,MAXVALUE)
    );
    CREATE TABLE p2 (
    a INT,
    b INT,
    c INT
    )
    PARTITION BY RANGE COLUMNS (a,b)
    (
    PARTITION p01 VALUES LESS THAN (10,10),
    PARTITION p02 VALUES LESS THAN (10,20),
    PARTITION p03 VALUES LESS THAN (10,30),
    PARTITION p04 VALUES LESS THAN (10,MAXVALUE),
    PARTITION p05 VALUES LESS THAN (MAXVALUE,MAXVALUE)
    )
    PARTITION BY RANGE COLUMNS (a,b,c) 을 기준으로 하는 예제도 있습니다. 만약에 이러한 예문으로 부터 대단한 아이디어를 얻은 독자라면, 부담 없이 나를 재미있게 만들어 주세요. 왜냐하면 나는 그렇게 하지 못했기 때문입니다.
    오랜 세월 동안 MySQL 5.1 파티션을 사용하는데 있어서, 다중 컬럼에 의한 파티션의 중요성을 파학하지 못했습니다. LESS THAN (10,10) 구문의 의미는 무엇입니까? 그리고 다음 파티션으로 LESS THAN (10,20)이 설정된다면 어떤 일이 발생합니까? (20,30)과 같이 완전히 다른 쌍을 적용한다면 어떻게 되겠습니까? 이러한 모든 질문에 답변이 필요하고, 답변하기 전에 우리가 함께 다루고 있는 이것에 대해서 더 많은 이해가 필요합니다.
    처음에는 MySQL 엔지니어 가운데도 약간의 혼동이 있었습니다. 그리고 그것 뿐만 아니라 나는 어리석었습니다! 모든 파티션의 첫 번째 범위 값은 마치 단 하나의 컬럼으로 분할되어진 것과 같이 실질적인 값은 전부 다르다고 믿고 있었습니다. 그러나 이 경우만이 아니었습니다. 다음 예제를 보겠습니다.
    CREATE TABLE p1_single (
    a INT,
    b INT,
    c INT
    )
    PARTITION BY RANGE COLUMNS (a)
    (
    PARTITION p01 VALUES LESS THAN (10),
    PARTITION p02 VALUES LESS THAN (20),
    PARTITION p03 VALUES LESS THAN (30),
    PARTITION p04 VALUES LESS THAN (40),
    PARTITION p05 VALUES LESS THAN (MAXVALUE)
    );
    이것은 p1 테이블에 해당되지 않습니다. 만약에 p1dp (10, 1, 1)을 삽입한다면, 그것은 첫 번째 파티션에 포함될 것입니다. p1_single에 대입하면 2번째 파티션에 포함될 것입니다.
    (10,1)은 (10, 10)보다 작기 때문입니다. 만약 오직 첫 번째 값을 초점을 둔 경우라면, 튜플이 아닌 단일 값을 비교하였을 것입니다.
    이제부터 어려운 부분입니다. 데이터(row)가 어디로 배치될지 결정이 필요할 때 무슨 일이 발생합니까? (10,9) < (10,10)와 같은 작없을 어떻게 비교 합니까? 답변은 간단합니다: 두개의 레코드를 정렬하여 비교하는 방법이 사용됩니다.
    a=10
    b=9
    (a,b) < (10,10) ?
    # 다음과 같이 평가 합니다.:
    (a < 10)
    OR
    ((a = 10) AND ( b < 10))
    # 다음과 같이 변환을 합니다.:
    (10 < 10)
    OR
    ((10 = 10) AND ( 9 < 10))
    만약에 3개의 컬럼과 복잡한 표현이 있다고 하여도, 더 이상 복잡하지 않습니다. 우선 첫 번째 항목에 대해서 적은 비용(낮은 리소스의 사용을 의미함)으로 테스트합니다. 만약 두개 이상의 파티션에서 일치하는 경우라면, 두 번째 항목을 테스트 합니다. 그렇게 한 다음에도 하나 이상의 후보 파티션을 가지고 있다면, 다음 세 번째 항목을 테스트합니다.
    아래의 그림은 세 개의 평가 기록이 파티션의 정의를 통해서 테이블에 삽입되는 과정을 보여줍니다.
    (10,10),
    (10,20),
    (10,30),
    (10, MAXVALUE)




    그림 1. 첫 번째 (비교)값이 파티션 정의의 첫 번째 범주보다 작은 경우에 모든 것이 쉽습니다. 데이터(row)는 여기에 포함됩니다.


    그림 2. 튜플 비교. 첫 번째 (비교)값이 파티션 정의의 첫 번째 범주와 같을 때, 두 번째 항목을 비교해야 합니다. 남은 하나가 두 번째 범위보다 작다면, 데이터(row)는 여기에 포함됩니다.


    그림 3. 튜플 비교. 첫 번째 (비교)값과 두번쨰 (비교)값 둘 다 (첫번째) 해당 범주 값과 동일합니다. 튜플은 정의된 범위보다 작지 않으므로, 여기에 포함되지 않습니다. 다음단계로 넘어갑니다.


    그림 4. 튜플 비교. 다음 범위를 보면, 첫 번째 (비교)값은 같고, 두 번째 (비교) 값은 작습니다. 따라서 튤플은 작고 데이터(row)는 여기에 포함됩니다.


    이와 같은 수치의 도움으로, 우리는 다중 컬럼으로 파니션된 테이블에 레코드를 삽입하는 절체에 대해서 더 많은 이해를 할 수 있게 되었습니다. 이것이 이론이 되었습니다. 내가 했던 것보다 훨씬 더 쉽게 새로운 기능을 파악하는 것을 돕기 위해서, 감각적으로 이해 할려고 하는 독자들에게 다른 예제를 제공하자고 합니다. 런치패드에 있는 MySQL test 데이터베이스의 employees 테이블의 몇 가지를 수정하여 사용합니다.
    CREATE TABLE employees (
    emp_no int(11) NOT NULL,
    birth_date date NOT NULL,
    first_name varchar(14) NOT NULL,
    last_name varchar(16) NOT NULL,
    gender char(1) DEFAULT NULL,
    hire_date date NOT NULL
    ) ENGINE=MyISAM
    PARTITION BY RANGE COLUMNS(gender,hire_date)
    (PARTITION p01 VALUES LESS THAN ('F','1990-01-01') ,
    PARTITION p02 VALUES LESS THAN ('F','2000-01-01') ,
    PARTITION p03 VALUES LESS THAN ('F',MAXVALUE) ,
    PARTITION p04 VALUES LESS THAN ('M','1990-01-01') ,
    PARTITION p05 VALUES LESS THAN ('M','2000-01-01') ,
    PARTITION p06 VALUES LESS THAN ('M',MAXVALUE) ,
    PARTITION p07 VALUES LESS THAN (MAXVALUE,MAXVALUE)
    위의 예제와 다르게 이것은 이론적인 측면을 보면 너무 많은 모호함을 가지고 있음을 알 수 있습니다. 첫 번째 파티션은 1990년 이전, 두 번째 파티션에서는 1990년에서 2000년 사이, 그리고 세 번째파티션은 남아있는 고용된 여자 직원을 저장합니다. 파티션 p04에서 p06도 비슷한 케이스이지만, 남자 직원을 저장합니다. 마지막 파티션의 조작의 경우: 누군가가 이 파티션에 저장이 되기 위해서는 어딘가에 실수가 있어야 합니다.
    마지막 문장을 읽어보면, 올바른 문장인지 확인할 필요가 있습니다. 데이터(row)가 어떤 파티션에 저장되는지 어떻게 알 수 있을까요?
    두가지 방법이 있습니다. 첫 번째 방법은 정의 하는데 사용되는 동일한 조건을 가진 질의를 하는 것입니다.
    SELECT
    CASE
    WHEN gender = 'F' AND hire_date < '1990-01-01'
    THEN 'p1'
    WHEN gender = 'F' AND hire_date < '2000-01-01'
    THEN 'p2'
    WHEN gender = 'F' AND hire_date < '2999-01-01'
    THEN 'p3'
    WHEN gender = 'M' AND hire_date < '1990-01-01'
    THEN 'p4'
    WHEN gender = 'M' AND hire_date < '2000-01-01'
    THEN 'p5'
    WHEN gender = 'M' AND hire_date < '2999-01-01'
    THEN 'p6'
    ELSE
    'p7'
    END as p,
    COUNT(*) AS rows
    FROM employees
    GROUP BY p;
    +------+-------+
    | p | rows |
    +------+-------+
    | p1 | 66212 |
    | p2 | 53832 |
    | p3 | 7 |
    | p4 | 98585 |
    | p5 | 81382 |
    | p6 | 6 |
    +------+-------+
    만약 MyISAM 또는 ARCHIVE 테이블이라면, INFORMATION_SCHEMA에서 제공되는 통계를 신뢰 할 수 있습니다.
    SELECT
    partition_name part,
    partition_expression expr,
    partition_descript-xion descr,
    table_rows
    FROM
    INFORMATION_SCHEMA.partitions
    WHERE
    TABLE_SCHEMA = schema()
    AND TABLE_NAME='employees';
    +------+------------------+-------------------+------------+
    | part | expr | descr | table_rows |
    +------+------------------+-------------------+------------+
    | p01 | gender,hire_date | 'F','1990-01-01' | 66212 |
    | p02 | gender,hire_date | 'F','2000-01-01' | 53832 |
    | p03 | gender,hire_date | 'F',MAXVALUE | 7 |
    | p04 | gender,hire_date | 'M','1990-01-01' | 98585 |
    | p05 | gender,hire_date | 'M','2000-01-01' | 81382 |
    | p06 | gender,hire_date | 'M',MAXVALUE | 6 |
    | p07 | gender,hire_date | MAXVALUE,MAXVALUE | 0 |
    +------+------------------+-------------------+------------+
    InnoDB 엔진을 사용하는 경우에는, 위의 값은 근사치이며, 정확한 값이 필요하다면, INFORMATION_SCHEMA는 신뢰 할 수 없습니다.
    한 가지 의문점은 위의 모든 설명과 성능에 관련된 것들은, 아직까지 미지수입니다. 이와 같은 partition pruning을 개선 사항으로 볼 수 있겠습니까? 답변은 분명히 '그렇다' 입니다. 5.1 버전과 달리, 5.5에서는 날짜뿐만 아니라, 모든 파티션은 COLUMNS 키워드로 정의된 partition pruning을 사용하는, 두 가지 기능의 파티션닝을 지원합니다. 다음을 보면:
    select count(*) from employees where gender='F' and hire_date < '1990-01-01';
    +----------+
    | count(*) |
    +----------+
    | 66212 |
    +----------+
    1 row in set (0.05 sec)
    explain partitions select count(*) from employees where gender='F' and hire_date < '1990-01-01'\G
    *************************** 1. row ***************************
    id: 1
    select_type: SIMPLE
    table: employees
    partitions: p01
    type: ALL
    possible_keys: NULL
    key: NULL
    key_len: NULL
    ref: NULL
    rows: 300024
    Extra: Using where
    첫 번째 파티션을 정의하는 조건을 사용하여, 매우 최적화된 쿼리를 얻었습니다. 그 뿐만 아니라, 일부 조건은 불필요한 부분이 제거된 파티션으로 부터 (검색) 혜택을 받았습니다.
    select count(*) from employees where gender='F';
    +----------+
    | count(*) |
    +----------+
    | 120051 |
    +----------+
    1 row in set (0.12 sec)
    explain partitions select count(*) from employees where gender='F'\G
    *************************** 1. row ***************************
    id: 1
    select_type: SIMPLE
    table: employees
    partitions: p01,p02,p03,p04
    type: ALL
    possible_keys: NULL
    key: NULL
    key_len: NULL
    ref: NULL
    rows: 300024
    Extra: Using where
    이것은 복잡한 인덱스에 사용된 것과 같은 알고리즘 입니다. 조건이 인덱스의 왼쪽 부분을 의미 하는 경우, MySQL은 그것을 사용합니다. 마찬가지로, 당신은 파티션 정의의 왼쪽 부분을 참조 한다면, 가능한 최대한 불필요한 부분을 제외합니다. 파티션 정의의 오른쪽 부분을 참조하는 경우에는 복합 인덱스와 불필요한 부분이 제거된 파티션이 작동하지 않습니다.
    select count(*) from employees where hire_date < '1990-01-01';
    +----------+
    | count(*) |
    +----------+
    | 164797 |
    +----------+
    1 row in set (0.18 sec)
    explain partitions select count(*) from employees where hire_date < '1990-01-01'\G
    *************************** 1. row ***************************
    id: 1
    select_type: SIMPLE
    table: employees
    partitions: p01,p02,p03,p04,p05,p06,p07
    type: ALL
    possible_keys: NULL
    key: NULL
    key_len: NULL
    ref: NULL
    rows: 300024
    Extra: Using where
    첫 번째를 사용하지 않고, 파티션 정의의 두 번째 부분을 참조하면, 전체 테이블을 검색합니다. 이것은 항상 파티션 생성과 쿼리 디자인을 할 때, 고려해 두어야 합니다.
    사용성 개선: TRUNCATE PARTITION


    파티션 ID 가장 매력적인 기능 중 하나는 거의 즉시 대량의 데이트를 제거하는 능력입니다. 이 스키마는 DBA들이 로그 데이터를 기록하는 날짜를 기준으로 정의된 파티션된 테이블에서, 정기적으로 오래된 기록이 보관된 파티션을 삭제하는 방법으로 매우 인기를 끌고 있습니다. 이 방법은 아주 잘 작동합니다. 첫 번째 (가장 오래된 기록을 가진) 파티션을 삭제 하고, 끝에 (최신 기록을 저장할) 새로운 파티션을 추가합니다.
    모두 좋습니다. 단지 끝부터 잘라내야 합니다. 하지만 중간에 있는 파티션을 제거해야하는 경우에는 상황이 원활하게 진행되지 않습니다. 이런 경우에 대해서 아무 문제없이 파티션을 삭제 할 수 있습니다. 그러나 단지 파티션을 비우는 것을 원한다면, 상당히 어러운 문제에 직면한 것입니다. 파티션으로 부터 모든 레코드를 제거하기 위해서 할 수 있는 것:
    DELETE 구문을 사용하여, 잘려진 파티션의 장점의 대부분을 포기하는 방법
    DROP PARTITION을 사용한 다음, REORGANIZE PARTITIONS으로 다시 만들려면, 이전의 선택보다 더 많은 부하가 발생합니다.
    MySQL 5.5버전에서는 DROP PARTITION과 같지만, 파티션이 삭제되는 대신에 다시 사용할 준비가 되어지는 TRUNCATE PARTITION 구문을 소개합니다.
    TRUNCATE PARTITION 구문은 모든 DBA의 도구상자에 있어야 합니다.
    더 미세한 조정: TO_SECONDS


    보너스로 파티션 기능 개선 패키지는 날짜와 시간 컬럼을 조작하는 새로운 함수가 준비되어 있습니다. TO_SECONDS와 같은 기능으로 날짜 시간 컬럼을 "0"년 부터 초 단위로 변환할 수 있습니다. 만약 하루 보다 작은 시간 간격으로 파티션하려는 경우에 유용한 기능입니다.
    향상된 기능의 나머지 부분과 같이, TO_SECONDS으로 파티션을 잘라내는 것은 날짜 함수의 수가 세 가지가 됨으로써, 효율적인 파티션닝을 할 수 있습니다.
    TO_DAYS는, FROM_DAYS로 변환할 수 있지만, TO_SECONDS에 대한 그런 기능은 없습니다. 하지만 이런 것을 만드는 것은 어렵지 않습니다.
    drop function if exists from_seconds;
    delimiter //
    create function from_seconds (secs bigint)
    returns DATETIME
    begin
    declare days INT;
    declare secs_per_day INT;
    DECLARE ZH INT;
    DECLARE ZM INT;
    DECLARE ZS INT;
    set secs_per_day = 60 * 60 * 24;
    set days = floor(secs / secs_per_day);
    set secs = secs - (secs_per_day * days);
    set ZH = floor(secs / 3600);
    set ZM = floor(secs / 60) - ZH * 60;
    set ZS = secs - (ZH * 3600 + ZM * 60);
    return CAST(CONCAT(FROM_DAYS(days), ' ', ZH, ':', ZM, ':', ZS) as DATETIME);
    end //
    delimiter ;
    이런 새로운 무기로 무장한 우리는 하루도 안 되는 시간을 기준으로 정의한 파티션과 같은 테이블을 자신 있게 만들 수 있습니다.
    CREATE TABLE t2 (
    dt datetime
    )
    PARTITION BY RANGE (to_seconds(dt))
    (
    PARTITION p01 VALUES LESS THAN (to_seconds('2009-11-30 08:00:00')) ,
    PARTITION p02 VALUES LESS THAN (to_seconds('2009-11-30 16:00:00')) ,
    PARTITION p03 VALUES LESS THAN (to_seconds('2009-12-01 00:00:00')) ,
    PARTITION p04 VALUES LESS THAN (to_seconds('2009-12-01 08:00:00')) ,
    PARTITION p05 VALUES LESS THAN (to_seconds('2009-12-01 16:00:00')) ,
    PARTITION p06 VALUES LESS THAN (MAXVALUE)
    );
    show create table t2\G
    *************************** 1. row ***************************
    Table: t2
    Create Table: CREATE TABLE `t2` (
    `dt` datetime DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    /*!50500 PARTITION BY RANGE (to_seconds(dt))
    (PARTITION p01 VALUES LESS THAN (63426787200) ENGINE = MyISAM,
    PARTITION p02 VALUES LESS THAN (63426816000) ENGINE = MyISAM,
    PARTITION p03 VALUES LESS THAN (63426844800) ENGINE = MyISAM,
    PARTITION p04 VALUES LESS THAN (63426873600) ENGINE = MyISAM,
    PARTITION p05 VALUES LESS THAN (63426902400) ENGINE = MyISAM,
    PARTITION p06 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
    COLUMNS 키워드를 사용하지 않기 때문에 (그리고 우리가 COLUMNS 과 함수의 홈합을 허용하지 않은 이유로 할 수 없었던) TO_SECONDS 함수의 결과로 정의되어진 테이블 안에 값을 기록되었습니다.
    그러나 새로운 기능덕분에, 오래된 블로그 포스트에서 본것 같은 값을 변환하지 않아도 사람이 읽을 수 있는 값을 사용할 수 있습니다.
    select
    partition_name part,
    partition_expression expr,
    from_seconds(partition_descript-xion) descr,
    table_rows
    FROM
    INFORMATION_SCHEMA.partitions
    WHERE
    TABLE_SCHEMA = 'test'
    AND TABLE_NAME='t2';
    +------+----------------+---------------------+------------+
    | part | expr | descr | table_rows |
    +------+----------------+---------------------+------------+
    | p01 | to_seconds(dt) | 2009-11-30 08:00:00 | 0 |
    | p02 | to_seconds(dt) | 2009-11-30 16:00:00 | 0 |
    | p03 | to_seconds(dt) | 2009-12-01 00:00:00 | 0 |
    | p04 | to_seconds(dt) | 2009-12-01 08:00:00 | 0 |
    | p05 | to_seconds(dt) | 2009-12-01 16:00:00 | 0 |
    | p06 | to_seconds(dt) | 0000-00-00 00:00:00 | 0 |
    +------+----------------+---------------------+------------+
    요약


    MySQL 5.5버전은 파티션을 사용하는 사용자에게 확실히 좋은 소식입니다. (응답 시간과 같은 성능을 평가하는 경우라면) 성능에 직접적인 개선은 없었지만, 기능향상으로 사용이 쉬워지고, 시간을 절약할 수 있는 새로운 TRUNCATE PARTITION 구문과 같은 결과로 DBA나 최종 사용자의 시간을 많이 절약할 수 있습니다.
    출처: http://www.mysqlkorea.co.kr/gnuboard4/bbs/board.php?bo_table=develop_05&wr_id=6
    원문 : http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html…
    작성자최고관리자 시간 02-01 조회 5664
  • 초기셋팅 root 암호
    1. 초기 mysql root 패스워드 설정하기
    mysql 서버에 패스워드 없이 로그인 하게되면 서버에 만들어진 데이터베이스나 테이블
    기타 이곳에 저장된 자료가 외부인에게 노출될 수 있다. 따라서 이러한 보안을 목적으로
    root 패스워드를 지정하면 mysql 서버를 안전하게 보호할 수 있다.

    mysql> use mysql;
    mysql> update user set password=password('123456') where user='root';
    Query OK, 2 rows affected (0.03 sec)
    Rows matched: 2 Changed: 2 Warnings: 0
    mysql> flush privileges; select host, user, password from user;
    +----------------------------------------------------------------+
    | Host user password |
    +----------------------------------------------------------------+
    | localhost root 2e01146f5c065853 |
    | localhost.localdomain root 2e01146f5c065853 |
    +----------------------------------------------------------------+

    mysql> \q
    Bye
    ------------------------------------------------------------------------------------
    [주의]# mysql -u root -p
    Enter password:
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
    그대는 mysql 을 shutdown 하거나 reload 하면 된다.
    # /usr/local/mysql/bin/mysqladmin -u root -p shutdown
    하면 패스워드를 묻는데 이때 입력하면 설정한 mysql이 적용이된다.
    # /usr/local/mysql/bin/mysqladmin -u root -p reload;
    ------------------------------------------------------------------------------------

    # mysql -u root -p [Enter] // root 패스워드로 로그인
    Enter password: ******

    ※ Mysql 서버에 root 패스워드가 설정되면 이제 부터는 mysql 서버에 접속하기 위해서는
    위와 같이 -u 뒤에 root입력하고 -p 옵션을 사용하여 패스워드를 사용한다는 것을 명시해야 한다.
    그리고 엔터를 치면 root 패스워드를 입력받기 위해 커서가 멈춘다.
    (mysql 명령어만 입력하고 엔터를 치면 패스워드를 묻지 앟고 바로 mysql> 프롬프트가 나온 옛 시절을 생각해 보면 금방 차이를 느낄수 있음)

    2. 루트 비번 변경
    mysql> use mysql;
    mysql> update user set password=password('123456') where user='root';
    mysql> flush privileges;

    3. root 패스워드를 분실한 경우(응급조치)

    mysql을 오랫동안 사용하지 않았을 경우에 간혹 root패스워드가 기억나질않아서 당황할 때가 있습니다. 시스템관리자라면 시스템의 root나 MySQL의 root의 암호를 잊어 버렸을 때를 대비해서 패스워드를 새로 설정하는 방법을 반드시 숙지하고 있어야 할 것입니다.

    ① 실행중인 msyql 종료

    # ps -ef | grep mysqld
    root 9567 1 0 Mar16 ? 00:00:00 sh ./mysqld_safe
    root 9576 9567 0 Mar16 ? 00:00:00 /usr/local/mysql/libexec/mysqld
    root 9578 9576 0 Mar16 ? 00:00:00 /usr/local/mysql/libexec/mysqld
    root 9579 9578 0 Mar16 ? 00:00:00 /usr/local/mysql/libexec/mysqld

    # killall mysqld

    ② grant-table 미사용모드로 mysql시작(권한 테이블을 사용하지 않는 옵션으로 데몬 실행)

    nt일 경우 :
    c:\program files\mysql\mysql server 4.1\bin>mysqld-nt --standalone --skip-grant-tables
    만약 Error 2003 Hy000 Can't connect to MySQL server on 'localhost' 와 같은 메세지가 나온다면

    c:\program files\mysql\mysql server 4.1\bin>mysqld --defaults-file="c:\program files\mysql\mysql server 4.1\my.ini" --consol --skip-grant-tables
    따로 프롬프트는 떨어지지 않으므로 새로 cmd창을 열어서 접속해 본다.


    # ./safe_mysqld --skip-grant-tables &
    [1] 12084
    # Starting mysqld daemon with databases from /usr/local/mysql/data
    #

    # ./mysql -u root mysql
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 1 to server version: 3.22.24
    Type 'help' for help.
    mysql>

    ※ mysqld_safe 명령어는 mysql 데몬을 실행시킨다.

    ③ update문으로 root사용자 패스워드 갱신

    mysql> update user set password=password('123') where user = 'root';
    Query OK, 3 rows affected (0.00 sec)
    Rows matched: 3 Changed: 3 Warnings: 0
    mysql> flush privileges;
    Query OK, 0 rows affected (0.01 sec)
    mysql> \q
    Bye

    ④ 실행중인 mysql 다시 종료(권한 테이블을 사용하지 않는 데몬을 종료)

    # ps -ef | grep mysqld
    root 12084 11558 0 20:10 pts/2 00:00:00 sh ./mysqld_safe --skip-grant-ta
    root 12090 12084 0 20:10 pts/2 00:00:00 /usr/local/mysql/libexec/mysqld
    root 12092 12090 0 20:10 pts/2 00:00:00 /usr/local/mysql/libexec/mysqld
    root 12093 12092 0 20:10 pts/2 00:00:00 /usr/local/mysql/libexec/mysqld
    #
    # killall mysqld
    mysqld daemon ended
    [1]+ Done ./mysqld_safe --skip-grant-tables
    #

    ⑤ Mysql 데몬 재 실행 후 갱신된 패스워드로 로그인

    # ./safe_mysqld &
    [1] 12102
    # Starting mysqld daemon with databases from /usr/local/mysql/data
    #

    # ps -ef | grep mysql
    root 12102 11558 0 20:13 pts/2 00:00:00 sh ./mysqld_safe
    root 12108 12102 0 20:13 pts/2 00:00:00 /usr/local/mysql/libexec/mysqld
    root 12110 12108 0 20:13 pts/2 00:00:00 /usr/local/mysql/libexec/mysqld
    root 12111 12110 0 20:13 pts/2 00:00:00 /usr/local/mysql/libexec/mysqld

    # mysql -u root -p
    Enter Password: ***************…
    작성자최고관리자 시간 04-05 조회 1466
  • 기본 쿼리 사용 예
    1. MA_State
    MA_Vice_ma
    ALTER TABLE manage_MemberA ADD COLUMN MA_State int(2) AFTER MA_permissions
    ALTER TABLE manage_MemberA ADD COLUMN MA_Vice_ma int(3) AFTER MA_State

    2. create table clickchoice.post (select * from hakjumpluscokr.post);



    3. create table target_table_name (select * from source_table_name);
    create table target_table_name (select filed1,field2 from source_table_name);


    4. update ABCDE set column1='xyz',column2='1234' where point>3 and point…
    작성자최고관리자 시간 03-30 조회 1787
  • 쿼리 사용방법
    MySQL 실행과 종료
    - MySQL 실행
    사용형식 : /usr/local/mysql/bin/mysqld_safe [각종 옵션들] &
    - MySQL 종료
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p shutdown

    * MySQL 기본관리
    - MySQL 접속
    사용형식 : /usr/local/mysql/bin/mysql -u MySQL_계정명 -p 접속할_데이터베이스명 -h 접속할 호스트이름 -P 접속포트번호 -S /tmp/mysql.sock
    mysql : MySQL 데이터베이스로 접속하기 위한 MySQL 클라이어트 프로그램
    -u : 접속할 MySQL 계정(사용자)명을 지정하기 위한 옵션
    MySQL_계정명 : 데이터베이스로 접속할 MySQL의 사용자(계정)명
    -p : 패스워드를 입력하기 위한 옵션(패스워드가 없을 경우에 생략가능함)
    접속할_데이터베이스명 : 접속 후 사요할 데이터베이스명
    -h : 접속할 호스트이름
    -P : 접속할 포트번호
    -S : 접속할 MySQL 소켓파일 위치 지정
    # /usr/local/mysql/bin/mysql -u root -p mysql
    Enter password: ********
    # /usr/local/mysql/bin/mysql -u picasso -p picasso_db
    Enter password: ********
    # /usr/local/mysql/bin/mysql -u root -p'12345678' mysql
    # /usr/local/mysql/bin/mysql -u user -p'11111111' user_db
    # /usr/local/mysql/bin/mysql -u ruser -p ruser_db -h 192.168.0.111 -P 3306
    Enter password: ********
    - 패스워드 재설정
    사용형식 : /usr/local/mysql/bin/mysqladmin -u 계정명 password 변경할_패스워드
    # /usr/local/mysql/bin/mysqladmin -u root password 12345678 -> 기존에 패스워드가 존재하지 않을 때
    Enter password: ********
    # /usr/local/mysql/bin/mysqladmin -u root -p password 12345678 -> 기존에 패스워드가 존재할 때
    Enter password: ********
    # /usr/local/mysql/bin/mysqladmin -u user -p password 11111
    Enter password: ********
    # /usr/local/mysql/bin -u root -p'12345678' mysql
    mysql> update user set password = password('12345678') where user = 'root';
    mysql> set password for root = password('2345');
    - 쉘상태에서 특정파일에 저장된 SQL문 실행하기
    # /usr/local/mysql/bin -u user -p user_db < /home/user/user.sql
    Enter password: ********
    - 새로운 MySQL 사용자를 위한 MySQL 설정
    mysql> create database user_db;
    mysql> grant all on user_db.* to user@'localhost' identified by 'password';
    ## mysql> revoke all on user_db.* from user@'localhost';
    ## mysql> revoke all on user_db.* from user;
    ## mysql> delete from mysql.user where user = 'user';

    * MySQL 패스워드 복구
    1. 실행중인 MySQL을 종료한다.
    # ps -ef | grep mysqld
    # killall mysqld
    2. table grant 권한없이 MySQL을 실행한다.
    # /usr/local/mysql/bin/mysqld_safe --skip-grant-table &
    3. 패스워드없이 MySQL root 계정으로 MySQL에 접속한다.
    # /usr/local/mysql/bin/mysql -u root mysql -> 패스워드 지정 안함
    4. UPDATE 문으로 MySQL root사용자의 패스워드를 변경한다.
    mysql> update user set password = password('12345678') where user = 'root';
    5. "flush privileges"로 MySQL데이터들을 동기화한다.
    mysql> flush privileges;
    6. MySQL을 빠져나와서 실행했던 MySQL을 종료한다.
    # killall mysqld
    # /usr/local/mysql/bin/mysqladmin -u root shutdown
    7. 일반적인 방법으로 MySQL을 실행한다.
    # /usr/local/mysql/bin/mysqld_safe --skip-grant-table &
    8. 패스워드를 사용하여 MySQL의 root계정으로 접속하여 확인한다.

    * "too many connections" 에러 해결방법
    원인: 이에 대한 원인을 설명하기 위해서는 php에서 사용하는 MySQL 연결함수인 mysql_connect()와 mysql_pconnect의 차이점 그리고, mysql_close()함수에 대한 정확한 이해가 필요하다.
    mysql_connect()함수를 이용하여 MySQL에 연결하였다면 해당 스크립트가 종료됨과 동시에 mysql_close()함수를 호출하지 않았다 하더라도 자동으로 연결이 종료된다.
    하지만, mysql_pconnect()함수는 해당 스크립트가 종료된 후 mysql_close()함수가 호출되어도 연결이 끊어지지 않은 채로 계속 연결을 유지하고 있다.
    따라서, 얼핏보기에는 "too many connections"라는 에러메시지는 mysql_pconnect()라는 함수의 사용때문에 발생하는 것 같지만 (물로 그런 이유도 있을 수 있지만) 근본적인 원인은 이와 다를 수 있다.
    결론적으로 "mysqladmin -u -p variables"의 결과로서 볼 수 있었던 MySQL의 환경변수값들 가운데 "wait_timeout"의 값만큼 서버에 그대로 연결을 유지한 채로 남아있는 것이다.
    따라서, 이것이 "too many connections" 에러가 발생하는 긍극적인 원인이 되는 것이다.
    이를 해겨하면 MySQL이 빠른 응답을 할 수 있도록 서버 하드웨어 사양(CPU, 메모리 등)을 높이는 방법도 있겠지만 급하게 조치해야하는 경우에는 MySQL의 필요한 변수의 값을 보다 높게 설정하는 방법이 현명할 것이다.
    "mysqladmin -u root -p variables"라고 하면 MySQL의 전체 환경변수의 값을 확인할 수 있다.
    이들 MySQL 환경변수 가운데 다음 3가지의 값을 현재보다 높게 설정함으로서 "too many connection" 에러를 응급초지할 수 있다.
    - max_connection : MySQL에 connect할 수 있는 최대 개수
    - table_cache : MySQL의 테이블 캐쉬크기
    - wait_timeout : MySQL에 connect하여 쿼리를 지속할 수 있는 시간
    # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep max_connections
    | max_connections | 100 |
    # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep table_cache
    | table_cache | 64 |
    # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep wait_timeout
    | innodb_lock_wait_timeout | 50 |
    | table_lock_wait_timeout | 50 |
    | wait_timeout | 28800 |
    # /usr/local/bin/mysqld_safe -O max_connections=500 -O table_cache=256 -O wait_timeout=57600 &

    * MySQL 관리자 전용 유틸리티 mysqladmin
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p 명령어
    - 새로운 데이터베이스 생성하기
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p create 새로운_데이터베이스명
    # /usr/local/mysql/bin/mysqladmin -u root -p create user_db2
    Enter password: ********
    - 특정 데이터베이스 삭제하기
    사용형식: /usr/local/mysql/bin/mysqladmin -u root -p drop 삭제할_데이터베이스명
    # /usr/local/mysql/bin/mysqladmin -u root -p drop user_db2
    Enter password: ********
    - MySQL 권한테이블 갱신하기
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p reload
    # /usr/local/mysql/bin/mysqladmin -u root -p reload
    Enter password: ********
    - MySQL에 접속한 사용자 확인하기
    사용형식: /usr/local/mysql/bin/mysqladmin -u root -p processlist
    # /usr/local/mysql/bin/mysqladmin -u root -p processlist
    - 접속되어 있는 MySQL 사용자(thread) 접속 끊기
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p kill 쓰레드번호
    # /usr/local/mysql/bin/mysqladmin -u root -p processlist -> 종료시킬 쓰레드 확인
    # /usr/local/mysql/bin/mysqladmin -u root -p kill 8 -> Id가 8인 쓰레드 종료
    - MySQL의 간단한 실행정보 확인하기
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p status
    # /usr/local/mysql/bin/mysqladmin -u root -p status
    Uptime: 2095884 Threads: 12 Questions: 2578614 Slow queries: 0 Opens: 0 Flush tables: 1 Open tables: 138 Queries per second avg: 1.230
    - MySQL의 현재 상황 자세히 살펴보기
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p extended-status
    # /usr/local/mysql/bin/mysqladmin -u root -p extended-status
    - MySQL의 환경변수를 확인하기
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p variables
    # /usr/local/mysql/bin/mysqladmin -u root -p variables
    - 현재 MySQL의 정확한 버전과 여러 가지 실행정보 확인하기
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p version
    # /usr/local/mysql/bin/mysqladmin -u root -p version
    - MySQL이 죽었는지 살았는지 확인하기
    사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p ping
    # /usr/local/mysql/bin/mysqladmin -u root -p ping

    * MySQL 로그
    - 쿼리로그 옵션 형식 : --log=쿼리로그파일명
    이 형식을 사용하면 MySQL 데이터 디렉토리에 "쿼리로그파일명"으로 지정된 로그파일이 생성되며 SQL 쿼리로그를 기록한다.
    - 바이너리로그 옵션 형식 : --log-bin=바이너리로그파일명
    바이너리로그를 보기위해서는 /usr/local/mysql/bin/mysqlbinlog 명령어를 사용해야 한다.
    이 형식을 사용하면 MySQL 데이터디렉토리에 "바이너리로그파일명"으로 지정된 바이너리로그파일이 생성되면 MySQL데이터의 변경내역을 기록한다.
    - SLOW쿼리 옵션 형식 : --log-slow-queries=SLOW쿼리파일명
    이 형식을 사용하면 MySQL 환경변수 "long_query_time"에 초단위로 지정된 시간보다 초과하는 쿼리문만을 기록한다.

    * 텍스트파일의 데이터를 MySQL의 특정 데이터베이스로 입력하기
    사용형식 : /usr/local/mysql/bin/mysqlimport -u MySQL사용자 -p 데이터베이스명 텍스트파일명
    이 형식으로 실행하면 "텍스트파일명"에 저장되어 있는 데이터가 "데이터베이스명"의 특정 "테이블"의 데이터로 입력된다.
    위의 형식에서 데이터가 저장될 테이블이름은 "텍스트파일명"과 동일한 테이블이 된다.
    위의 형식에서 "텍스트파일명"은 "테이블명"과 동일한 이름이어야 한다.
    또한 저장될 테이블은 이미 생성되어 있어야 한다.
    # cat addressbook
    PARKSUNGSOO 011-111-2222 SEOUL A+
    JUNGWOOYOUNG 011-222-3333 SEOUL B+
    LEEJAESUK 016-222-1111 BUSAN C+
    CHOYUEJIN 019-333-4444 BUSAN D+
    # /usr/local/mysql/bin/mysqlimport -u root -p user_db2 addressbook
    Enter password: ********
    user_db2.addressbook: Records: 4 Deleted: 0 Skipped: 0 Warning: 0

    * MySQL 데이터베이스 스키마 확인
    사용형식 : /usr/local/mysql/bin/mysqlshow [옵션] [데이터베이스 [테이블 [컬럼]]]
    1. 위의 형식에서 특정 데이터베이스명이 주어지지 않는다면 MySQL내에 존재하는 모든 데이터베이스들을 나열한다.
    2. 위의 형식에서 특정 테이블명이 주어지지 않는다면 지정된 데이터베이스내의 모든 테이블들을 나열한다.
    3. 위의 형식에서 특정 컬럼이 주어지지 않는다면 지정된 테이블내에 존재하는 모든 컬럼들과 컬럼타입들을 나열한다.
    - MySQL에 존재하는 모든 데이터베이스들 확인하기
    # /usr/local/mysql/bin/mysqlshow -u root -p
    mysql> show databases;
    - 특정 데이터베이스의 테이블들 확인하기
    # /usr/local/mysql/bin/mysqlshow -u root -p user_db
    mysql> use user_db;
    mysql> show tables;
    - 특정 테이블의 컬럼정보들 확인하기
    # /usr/local/mysql/bin/mysqlshow -u root -p user_db addressbook
    mysql> use user_db;
    mysql> show columns from addressbook;
    mysql> desc addressbook;
    - 특정 테이블의 하나의 컬럼만 확인하기
    # /usr/local/mysql/bin/mysqlshow -u root -p user_db addressbook name

    * MySQL 데이터베이스 데이터 백업과 복구
    - /usr/local/mysql 디렉토리 전체를 압축백업하기
    # cd /usr/local
    # tar cvfpz /backup/mysql.tar.gz mysql
    - MySQL 데이터 백업하기
    사용형식1 : /usr/local/mysql/bin/mysqldump [옵션] DB [TABLES ..] > 파일명
    DB는 백업대상이 되는 데이터베이스명이고 TABLES는 지정한 백업대상 데이터베이스내에 존재하는 테이블명이다.
    이 백업의 의미는 DB의 데이터베이스내에 존재하는 테이블의 내용을 백업해서 "파일명"에 저장하라는 의미이다.
    사용형식2 : /usr/local/mysql/bin/mysqldump [옵션] --databases [옵션] DB1 [DB2 ..] > 파일명
    --databases라는 옵션에 의해 DB1 DB2 의 데이터베이스들을 백업하여 "파일명"에 저장한다.
    즉 백업대상이 되는 데이터베이스가 2개 이상이 될 때에는 --databases 옵션을 사용하고 그 뒤에 백업할 데이터베이스를 지정한다.
    사용형식2 : /usr/local/mysql/bin/mysqldump [옵션] --all-databases [옵션] > 파일명
    --all-databases라는 옵션은 MySQL내에 존재하는 모든 데이터베이스를 백어밷상으로 한다는 의미이다.
    - 특정 데이터베이스 데이터 백업과 복구
    백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p 백업대상_데이터베이스명 > 저장할_파일명
    복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p 복구할_데이터베이스명 < 저장한_파일명
    # /usr/local/mysql/bin/mysqldump -u root -p mysql > mysql.sql
    # /usr/local/mysql/bin/mysql -u root -p mysql < mysql.sql
    # /usr/local/mysql/bin/mysqldump -u user -p user_db > user_db.sql
    # /usr/local/mysql/bin/mysql -u user -p user_db < user_db.sql
    - 특정 데이터베이스의 특정 테이블의 백업과 복구
    백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p 데이터베이스명 테이블명 > 저장할_파일명
    복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p 데이터베이스명 < 저장한_파일명
    # /usr/local/mysql/bin/mysqldump -u user -p user_db addressbook > addressbook.sql
    # /usr/local/mysql/bin/mysql -u user -p user_db < addressbook.sql
    - 여러 개의 데이터베이스 한번에 백업과 복구
    백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p --databases [옵션] DB1 [DB2 ..] > 저장할_파일명
    CREATE DATABASE문과 USE문이 추가되어 있다.
    복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p < 저장한_파일명
    # /usr/local/mysql/bin/mysqldump -u user -p --databases user_db user_db2 > user_dbs.sql
    # /usr/local/mysql/bin/mysql -u user -p < user_dbs.sql
    -- MySQL 전체 데이터베이스 백업하기
    사용형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p --all-databases > 저장할_파일명
    # /usr/local/mysql/bin/mysqldump -u root -p --all-databases > all_dbs.sql
    - 기존 테이블을 삭제후 백업된 파일로 복구하기 위한 백업방법
    mysqldump문으로 데이터베이스 백업시에 각각의 CRETE TABLE문 앞에 DROP TABLE문 삽입하기
    # /usr/local/mysql/bin/mysqldump -u user -p --add-drop-table user_db > user_db.sql
    # /usr/local/mysql/bin/mysql -u user -p user_db < user_db.sql
    - 데이터베이스 백업시 에러발생율 무시하고 계속 진행하기
    사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -f DB명 > 파일명
    # /usr/local/mysql/bin/mysqldump -u user -p -f user_db > user_db.sql
    - 원격서버의 MySQL 데이터베이스 백업하기 #1(기본포트 사용)
    사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -h 호스트명(IP주소) DB명 > 파일명
    # /usr/local/mysql/bin/mysqldump -u user -p -h 192.168.0.111 user_db > user_db.sql
    - 원격서버의 MySQL 데이터베이스 백업하기 #2(특정 포트번호 지정)
    사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -h 호스트명(IP주소) -P 포트번호 DB명 > 파일명
    # /usr/local/mysql/bin/mysqldump -u user -p -h 192.168.0.111 -P 22222 user_db > user_db.sql
    - 데이터 백업시 CREATE DATABASE 문을 생략하여 백업하기
    사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -n [옵션] DB명 > 파일명
    /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-create-db [옵션] DB명 > 파일명
    # /usr/local/mysql/bin/mysqldump -u user -p -n --databases user_db user_db2 > user_dbs.sql
    # /usr/local/mysql/bin/mysqldump -u root -p -n --all-databases > all_dbs.sql
    -- 데이터 백업시에 CREATE TABLE문을 생략하여 백업하기
    사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -t DB명 > 파일명
    /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-crate-info DB명 > 파일명
    # /usr/local/mysql/bin/mysqldump -u user -p -t user_db > user_db.sql
    - 데이터는 백업하지않고 테이블 스키마만 백업하기
    사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -d DB명 > 파일명
    /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-data DB명 > 파일명
    # /usr/local/mysql/bin/mysqldump -u user -p -d user_db > user_db.sql
    -- 특정 데이터베이스의 조건에 맞는 데이터만 백업하기
    사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -w="WHERE 조건문" DB명 테이블명 > 파일명
    /usr/local/mysql/bin/mysqldump -u 사용자명 -p --where="WHERE 조건문" DB명 테이블명 > 파일명
    # /usr/local/mysql/bin/mysqldump -u user -p -w="admin_id = 'admin'" user_db addressbook > admin_id.sql
    - select문을 이용한 데이터 백업 및 복구
    mysql> select * into outfile './backup.sql' from addressbook;
    mysql> load data infile './backup.sql' into table addressbook;

    * 데이터베이스의 깨진 테이블파일 복구
    - 데이터파일 구성
    테이블 하나에 아래의 파일형식을 가진 파일이 3개씩 생성되어 그 테이블의 데이터를 실제로 저장하는 용도로 사용된다.
    *.MYD: 해당 테이블의 데이터가 저장되는 테이블 데이터파일이다.
    *.MYI: 해당 테이블의 인덱스정보가 저장되는 테이블 인덱스파일이다.
    *.frm: 해당 테이블의 테이블구조가 저장되는 테이블 스키마파일이다.
    - myisamchk
    사용형식 : myisamchk [옵션] 점검복구새상테이블인덱스파일(*.MYI)
    주의할 것은 myisamchk의 복구 대상파일은 반드시 MySQL의 인덱스파일이라는 것이다.
    또한 반드시 MySQL을 종료한 후에 사용하라.
    - MySQL 테이블파일의 이상유무 점검
    # /usr/local/mysql/bin/myisamchk /usr/local/mysql/var/user_db/addressbook.MYI
    # /usr/local/mysql/bin/myisamchk -c /usr/local/mysql/var/user_db/addressbook.MYI
    # /usr/local/mysql/bin/myisamchk --check /usr/local/mysql/var/user_db/addressbook.MYI
    - MySQL 테이블 점검시 이상발견시만 알려주기
    # /usr/local/mysql/bin/myisamchk -s /usr/local/mysql/var/user_db/addressbook.MYI
    # /usr/local/mysql/bin/myisamchk --silent /usr/local/mysql/var/user_db/addressbook.MYI
    - MySQL의 테이블 점검(복구)시 가능한 상세하게 메시지 출력하기
    # /usr/local/mysql/bin/myisamchk -v /usr/local/mysql/var/user_db/addressbook.MYI
    # /usr/local/mysql/bin/myisamchk --verbose /usr/local/mysql/var/user_db/addressbook.MYI
    - MySQL의 테이블 이상유무 점검시 결과를 상세히 종합하여 보여주기
    # /usr/local/mysql/bin/myisamchk -i /usr/local/mysql/var/user_db/addressbook.MYI
    # /usr/local/mysql/bin/myisamchk --information /usr/local/mysql/var/user_db/addressbook.MYI
    -- MySQL의 특정테이블 이상유무를 가장 정밀하게 점검하기
    # /usr/local/mysql/bin/myisamchk -ev /usr/local/mysql/var/user_db/addressbook.MYI
    # /usr/local/mysql/bin/myisamchk --extend-check --verbose /usr/local/mysql/var/user_db/addressbook.MYI
    - 정형적인 방법으로 MySQL의 깨진 테이블파일 복구하기
    # /usr/local/mysql/bin/myisamchk -rv /usr/local/mysql/var/user_db/addressbook.MYI
    # /usr/local/mysql/bin/myisamchk --recover --verbose /usr/local/mysql/var/user_db/addressbook.MYI
    -- MySQL의 깨진 테이블파일 안전모드로 복구하기
    # /usr/local/mysql/bin/myisamchk -o /usr/local/mysql/var/user_db/addressbook.MYI
    # /usr/local/mysql/bin/myisamchk --safe-recover /usr/local/mysql/var/user_db/addressbook.MYI
    -r옵션을 사용하여 테이블파일을 복구하는 것은 MySQL의 테이블 복구 방법 가운데 가장 정형적인 방법이다.
    하지만 데이터의 안전성을 고려한다면 -o옵션을 사용하라.
    깨진 테이블파일의 오류를 복구할 때에 시간이 좀 더 소요되더라도 데이터의 안전성이 걱정이 된다면 -o옵션을 사용하라.
    -o옵션을 사용하면 전통적인 방법으로 복구를 하며 -r옵션을 사용하는 것보다 속도는 좀 떨어지지만 -r옵션으로 복구하지 못하는 데이터파일을 복구할 수 있다.
    - MySQL 테이블이 완전히 깨졌을 때의 최후의 복구방법
    # /usr/local/mysql/bin/myisamchk -re /usr/local/mysql/var/user_db/addressbook.MYI
    # /usr/local/mysql/bin/myisamchk -oe /usr/local/mysql/var/user_db/addressbook.MYI
    - MySQL 내부명령어 사용
    사용형식 : repair table 테이블명;
    mysql> repair table addressbook;…
    작성자최고관리자 시간 03-30 조회 1622
  • MySQL 내장 함수
    1. 숫자 관련 함수

    ▶ ABS(숫자) - 절대값 출력.
    ▶ CEILING(숫자) - 값보다 큰 정수 중 가장 작은 수.
    ▶ FLOOR(숫자) - 값보다 작은 정수 중 가장 큰 수[실수를 무조건 버림(음수일 경우는 제외)].
    ▶ ROUND(숫자,자릿수) - 숫자를 소수점 이하 자릿수에서 반올림.(자릿수는 양수,0,음수를 갖을 수 있다.)
    ▶ TRUNCATE(숫자,자릿수) - 숫자를 소수점 이하 자릿수에서 버림.
    ▶ POW(X,Y) or POWER(X,Y) - X의 Y승
    ▶ MOD (분자, 분모) - 분자를 분모로 나눈 나머지를 구한다.(연산자 %와 같음)
    ▶ GREATEST(숫자1,숫자2,숫자3...) - 주어진 수 중 제일 큰 수 리턴.
    ▶ LEAST(숫자1,숫자2,숫자3...) - 주어진 수 중 제일 작은 수 리턴.
    ▶ INTERVAL(a,b,c,d.....) - a(숫자)의 위치 반환

    2. 문자 관련 함수

    ▶ ASCII(문자) - 문자의 아스키 코드값 리턴.
    ▶ CONCAT('문자열1','문자열2','문자열3'...) - 문자열들을 이어준다.
    ▶ INSERT('문자열','시작위치','길이','새로운문자열') - 문자열의 시작위치부터 길이만큼 새로운 문자열로 대치
    ▶ REPLACE('문자열','기존문자열','바뀔문자열') - 문자열 중 기존문자열을 바뀔 문자열로 바꾼다.
    ▶ INSTR('문자열','찾는문자열') - 문자열 중 찾는 문자열의 위치값을 출력
    ▶ LEFT('문자열',개수) - 문자열 중 왼쪽에서 개수만큼을 추출.
    ▶ RIGHT('문자열',개수) - 문자열 중 오른쪽에서 개수만큼을 추출.
    ▶ MID('문자열',시작위치,개수) - 문자열 중 시작위치부터 개수만큼 출력
    ▶ SUBSTRING('문자열',시작위치,개수) - 문자열 중 시작위치부터 개수만큼 출력
    ▶ LTRIM('문자열') - 문자열 중 왼쪽의 공백을 없앤다.
    ▶ RTRIM('문자열') - 문자열 중 오른쪽의 공백을 없앤다.
    ▶ TRIM('문자열') - 양쪽 모두의 공백을 없앤다.
    ▶ LCASE('문자열') or LOWER('문자열') - 소문자로 바꾼다.
    ▶ UCASE('문자열') or UPPER('문자열') - 대문자로 바꾼다.
    ▶ REVERSE('문자열') - 문자열을 반대로 나열한다.

    3. 논리 관련 함수

    ▶ IF(논리식,참일 때 값,거짓일 때 값) - 논리식이 참이면 참일 때 값을 출력하고 논리식이 거짓이면 거짓일 때 출력한다.
    ▶ IFNULL(값1,값2) - 값1이 NULL 이면 값2로 대치하고 그렇지 않으면 값1을 출력

    4. 집계 함수

    ▶ COUNT(필드명) - NULL 값이 아닌 레코드 수를 구한다.
    ▶ SUM(필드명) - 필드명의 합계를 구한다.
    ▶ AVG(필드명) - 각각의 그룹 안에서 필드명의 평균값을 구한다.
    ▶ MAX(필드명) - 최대값을 구한다.
    ▶ MIN(필드명) - 최소값을 구한다.

    5. 날짜 관련 함수

    ▶ NOW() or SYSDATE() or CURRENT_TIMESTAMP() - 현재 날짜와 시간 출력
    ▶ CURDATE() or CURRENT_DATE() -현재 날짜 출력
    ▶ CURTIME() or CURRENT_TIME() -현재 시간 출력
    ▶ DATE_ADD(날짜,INTERVAL 기준값) -날짜에서 기준값 만큼 더한다.
    ※ 기준값 : YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
    ▶ DATE_SUB(날짜,INTERVAL 기준값) -날짜에서 기준값 만큼 뺸다.
    ※ 기준값 : YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
    ▶ YEAR(날짜) -날짜의 연도 출력.
    ▶ MONTH(날짜) -날짜의 월 출력.
    ▶ MONTHNAME(날짜) -날짜의 월을 영어로 출력.
    ▶ DAYNAME(날짜) -날짜의 요일일 영어로 출력.
    ▶ DAYOFMONTH(날짜) -날짜의 월별 일자 출력.
    ▶ DAYOFWEEK(날짜) -날짜의 주별 일자 출력(월요일(0),화요일(1)...일요일(6))
    ▶ WEEKDAY(날짜) -날짜의 주별 일자 출력(월요일(0),화요일(1)...일요일(6))
    ▶ DAYOFYEAR(날짜) -일년을 기준으로 한 날짜까지의 날 수.
    ▶ WEEK(날짜) -일년 중 몇 번쨰 주.
    ▶ FROM_DAYS(날 수) --00년 00월 00일부터 날 수 만큼 경과한 날의 날짜 출력.
    ▶ TO_DAYS(날짜) --00 년 00 월 00일 부터 날짜까지의 일자 수 출력.
    ▶ DATE_FORMAT(날짜,'형식') : 날짜를 형식에 맞게 출력…
    작성자최고관리자 시간 03-30 조회 1786

회원로그인

Copyright © 2001-2016 ITNANUM. All Rights Reserved..