Mysql Binary Log 관리

MySQL 2013.11.11 15:48

Mysql은 기본적으로 바이너리 로그를 남긴다.

해당 파일은 복구시에도 사용할 수 있다.


my.cnf에 보면

log-bin=mysql-bin

을 주석처리 하지 않는다면 로그를 지속적으로 쌓을 것이다.


기본적으로 data 디렉터리에 쌓이는 것 같다.


필요치 않다면 해당 부분을 주석처리하면 된다.


복구할 때는


mysqlbinlog msyql-bin.000001 > bakcup.sql


형식으로해서 쿼리문으로 복구가 가능하다.


로그를 관리할려면 my.cnf에 아래와 같이 설정하면 된다.


binlog_cache_size      =  50M      # binlog cache 사이즈
max_binlog_size        =  500M    # bin로그 maximum 사이즈
expire_logs_days        = 3       # 로그 만료기간


바이너리 로그 리스트는


mysql> show binary logs;
mysql> show master logs;


해당 로그 파일을 삭제할 때는


mysql> purge master logs to 'mysql-bin.000010';


특정 일자기준으로 삭제할 때는


mysql> purge master logs before date_sub(CURRENT_DATE, INTERVAL 31 DAY);


my.cnf 설정 외에 환경변수를 수정해도 된다.


mysql>show variables;

에서 expire_logs_days를 보면 알 수 있다.


기본적으로는 0으로 되어 있어 삭제가 되지 않으나


mysql> set global expire_logs_days=7;

로 설정하면 7일동안 저장하고 삭제한다.


'MySQL' 카테고리의 다른 글

Mysql Binary Log 관리  (0) 2013.11.11
MySQL INSERT 속도 향상  (0) 2013.11.10

설정

트랙백

댓글

MySQL INSERT 속도 향상

MySQL 2013.11.10 16:10

열을 삽입하는데 필요한 시간은 아래의 요소들을 가지고 판단할 수가 있는데, 여기에서 보여주는 숫자는 대략적인 수치이다:

  • 연결: (3)
  • 서버에 쿼리를 보내기: (2)
  • 쿼리 파싱: (2)
  • 열 삽입: (1 × size of row)
  • 인덱스 삽입: (1 × number of indexes)
  • 마침: (1)

여기에는 테이블을 처음에 열 때 발생하는 오버헤드는 고려하지 않았는데, 이것은 동시에 구동하는 각 쿼리에 대해서 한번씩 발생을 한다.

여러분은 아래의 방법을 통해서 삽입 속도를 개선 시킬 수가 있다:

  • 만일 여러분이 같은 클라이언트로부터 동시에 많은 수의 열을 가져와서 삽입하고자 한다면, INSERT 명령문을 다중 VALUES 리스트와 함께 사용한다. 이것을 사용하면 개별적인 단일-INSERT 명령문을 사용하는 것 보다 훨씬 속도의 개선을 가져올 수가 있다. 만일 비어 있지 않는 테이블에 데이터를 추가한다면, bulk_insert_buffer_size 변수를 튜닝해서 데이터 삽입의 속도를 개선시킬 수가 있다. Section 5.2.2, “서버 시스템 변수를 참조할 것.
  • 만일 여러분이 다른 클라이언트로부터 많은 열을 가져와서 삽입을 한다면, INSERT DELAYED 명령문을 사용함으로써 속도의 개선을 얻을 수가 있을 것이다. Section 13.2.4.2, “INSERT DELAYED 신텍스를 참조할 것.
  • MyISAM 테이블의 경우, 테이블 중간에 삭제된 열이 없다면, SELECT 명령문이 구동되고 있을 때에 열을 추가할 수 있는 동시 삽입을 사용할 수 있게 된다. Section 7.3.3, “동시 삽입을 참조.
  • 텍스트 파일에서 테이블을 읽어 올 때(loading)에는, LOAD DATA INFILE을 사용한다. 이것은 INSERT 명령문을 사용하는 것보다 20배 정도 속도가 빠르다. Section 13.2.5, “LOAD DATA INFILE 신텍스를 참조할 것.
  • 추가적인 작업으로는, 많은 수의 인덱스를 가지고 있는 MyISAM 테이블에 대해서 보다 빠른 LOAD DATA INFILE을 만들 수가 있는데, 이렇게 하기 위해서는 아래의 과정을 따라 진행한다:

1.       CREATE TABLE을 사용해서 선택적으로 테이블을 만든다.

2.       FLUSH TABLES 명령문 또는 mysqladmin flush-tables 명령어를 실행한다.

3.       myisamchk --keys-used=0 -rq /path/to/db/tbl_name를 사용한다. 이것은 테이블에 대한 모든 인덱스 사용을 제거한다.

4.       LOAD DATA INFILE을 사용해서 데이터를 테이블에 삽입시킨다. 이것은 어떠한 인덱스도 업데이트를 시키지 않기 때문에 속도가 매우 빠르게 된다.

5.       만일 여러분이 나중에 테이블에서 데이터를 읽기만 할 생각이라면, 이것을 압축하기 위해서는 myisampack를 사용한다. Section 14.1.3.3, “압축된 테이블의 특성을 참조할 것.

6.       myisamchk -rq /path/to/db/tbl_name를 사용해서 인덱스를 다시 생성 시킨다. 이것은 디스크에 기록을 하기 저에 메모리에 인덱스 트리를 먼저 생성을 하는데, 이렇게 하는 것이 LOAD DATA INFILE를 실행하는 동안 인덱스를 업데이트하는 것을 보다 빠르게 만들게 되는데, 그 이유는 이것이 디스크 검색을 피하기 때문이다. 그 결과 인덱스 트리 또한 완벽하게 균형이 잡히게 된다.

7.       FLUSH TABLES 명령문 또는 mysqladmin flush-tables 명령어를 실행한다.

여러분이 데이터를 삽입 시키는 MyISAM 테이블이 비어 있을 경우에는, LOAD DATA INFILE은 앞에서 설명하는 최적화 동작을 자동으로 실행한다는 점을 알아두자.

여러분은 myisamchk을 사용하는 대신에 아래의 명령문을 사용해서 MyISAM 테이블에 대한 인덱스를 비활성화 또는 활성화 시킬 수도 있다. 만일 이 명령문을 사용한다면, 여러분은 FLUSH TABLE 동작을 하지 않아도 된다:

ALTER TABLE tbl_name DISABLE KEYS;
ALTER TABLE tbl_name ENABLE KEYS;
  • 비 트랜젝셔널 테이블에 대해서 다중 명령문과 함께 실행되는 INSERT 연산의 속도를 향상 시키기 위해서는, 여러분의 테이블에 대해 잠금을 실행한다:
·                LOCK TABLES a WRITE;
·                INSERT INTO a VALUES (1,23),(2,34),(4,33);
·                INSERT INTO a VALUES (8,26),(6,29);
·                ...
·                UNLOCK TABLES;

이렇게 함으로써 속도를 개선 시킬 수가 있는데, 그 이유는 인덱스 버퍼는 모든 INSERT 명령문이 실행이 완료된 후에 디스크에 오직 한번만 플러시 되기 때문이다. 보통의 경우, INSERT 명령문의 개수만큼의 인덱스 버퍼 플러시가 생기게 된다. 만일 여러분이 단일 INSERT 명령문만을 가지고 모든 열을 삽입할 수가 있다면, 명확한 잠금 명령문은 필요하지 않게 된다.

트랜젝셔널 테이블에 대해서, 보다 빠른 삽입 성능을 얻기 위해서는, LOCK TABLES를 사용하는 대신에, 여러분은 START TRANSACTION COMMIT를 사용해야 한다.

출처: http://blog.naver.com/gckcs2?Redirect=Log&logNo=10020613837


'MySQL' 카테고리의 다른 글

Mysql Binary Log 관리  (0) 2013.11.11
MySQL INSERT 속도 향상  (0) 2013.11.10

설정

트랙백

댓글