반응형
반응형

use test;

drop table if exists xxx_user;

create table xxx_user (

usn int not null auto_increment

, money int not null

, grade char(1) not null

, reg_date datetime

, primary key (usn)

) engine=innodb default charset=utf8mb4;


insert into xxx_user values (null, 1000, 'A', now()), (null, 2000, 'B', now()), (null, 3000, 'C', now());


select * from xxx_user;


set @uv_money_old := -999, @uv_money_new := -999;

select @uv_money_old, @uv_money_new;


select * from xxx_user where usn = 1;


update xxx_user

set money = (@uv_money_new := (@uv_money_old := money) - 50)

, grade = 'Z'

where usn = 1;


select * from xxx_user where usn = 1;


select @uv_money_old, @uv_money_new;

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

innodb flush  (0) 2015.03.05
IN ( ) 절에 Multiple 인자값 넣어 조회 (ex. where id in (12, 34, 56) )  (0) 2015.03.03
MRU LRU  (0) 2015.03.03
index hit  (0) 2015.03.02
날짜 및 시간설정  (0) 2015.02.26
반응형

MRU( Most Recently Used) End : 가장 최근에 액세스한 버퍼 영역. 주로 데이터를 검색할 때 이용한다.

LRU( Least Recently Used) End : 가장 오래 전에 액세스했던 버퍼 영역. 주로 Fre e Buffer를 검색할 때 이용한다.

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

IN ( ) 절에 Multiple 인자값 넣어 조회 (ex. where id in (12, 34, 56) )  (0) 2015.03.03
update 전/후 데이터 반환받기  (0) 2015.03.03
index hit  (0) 2015.03.02
날짜 및 시간설정  (0) 2015.02.26
mysql> show status  (0) 2015.02.26
반응형

How MySQL Uses Indexes


http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html


그리고 아래에서 보면 mysql에서 어떤 인덱스를 사용하면 좋을지 힌트를 줄 수 있는데 
http://dev.mysql.com/doc/refman/5.1/en/index-hints.html
힌트는 세가지가 있다. 

index_hint:
    USE {INDEX|KEY}
      [{FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
  | IGNORE {INDEX|KEY}
      [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
  | FORCE {INDEX|KEY}
      [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)



USE (index_list)는 mysql이 select시에 오직 index_list에서 하나를 선택하여 사용할 것을 지정한다.  
IGNORE (index_list)는 index_list에 있는 index를 사용하지 말 것을 지정한다. 
FORCE (index_list)는 USE와 동일하지만 테이블 스캔(table scan)이 가장 비싸 다는 힌트를 주므로써 
index_list와 비교해서 table_scan이 더 빠를지라도 주어진 index 중에 하나를 사용할 것을 지정한다. 

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

update 전/후 데이터 반환받기  (0) 2015.03.03
MRU LRU  (0) 2015.03.03
날짜 및 시간설정  (0) 2015.02.26
mysql> show status  (0) 2015.02.26
Multi Rows Insert - ON DUPLICATE KEY UPDATE  (0) 2015.02.19
반응형
http://blog.naver.com/jungwoodol/220112373300


5. CentOS 기본 설정

5.2. 날짜 및 시간설정
리눅스에서 날짜 및 시간설정은 아주 중요하다. 리눅스를 서버로 운영하는 경우 시간이 달라지면 입력되는 DB데이터, 남겨지는 로그데이터, 웹서버에 접속한 기록등에 기록된 날짜 및 시간이 잘못 기록될 것이다. 이는 DB서버, WAS, 웹서버 등으로 분산된 경우 더욱 심각할 것이다.
최근 OS는 두 개의 시계를 가지고 있다. 하나는 일반적으로 사용하는 시스템 시계(소프트웨어 시계)이고, 하나는 하드웨어 시계(실시간 시계, CMOS 시계 또는 BIOS 시계) 이다. 시스템 시계는 커널의 timer에 의해 구동되고, 하드웨어 시계는 메인보드의 내장타이머에 의해 구동된다. 보통 리눅스 시스템을 부팅할 때 하드웨어 시간을 가지고와서 시간대와 써머타임(summer time) 등의 설정을 적용해 시스템 시간을 설정한다. 리눅스 시스템을 종료하는 과정에서 시스템 시간을 하드웨어 시계에 설정한다. 갑작스럽게 리눅스 시스템이 종료된 경우 시간이 틀어지는 경우가 있는데 이는 하드웨어 시계의 시간이 맞지 않는 경우이다. 
시간을 확인하거나 설정하는 방법에 대해 알아보도록 하자.

5.2.1. 날짜 및 시간 프로그램 (GUI)
프로그램 > 시스템도구 > 설정 > 날짜 및 시간

수동으로 시간설정
아래 그림은 날짜 및 시각 설정 실행화면이다. 아래 그림과 같이 시간대(Time zone)을 설정하고 날짜 및 시간을 설정할 수 있다. 
  

NTP(Network Time Protocol)를 이용한 자동설정
만약 위 그림에서 네트워크 시간(N)을 켜면 NTP를 이용하여 시간동기화를 하게 된다. NTP에 대한 내용은 뒤쪽에 더 자세히 다루도록 하겠다.

5.2.2. timedatectl 명령어를 사용한 설정
CentOS 7 부터는 많은 명령어들을 통합한 프로그램을 제공한다. 시간과 관련된 부분에도 새로운 명령어인 timedatectl을 제공한다. 시간을 보거나 설정하는 아주 유용한 유틸리티이다. 물론 CentOS 6 이하 버전에는 존재하지 않으니 다음에 소개되는 date, hwclock등의 명령어를 사용해야 한다.

1. 시간 정보 확인

7~] #  timedatectl
      Local time: 목 2014-07-10 20:59:54 KST
  Universal time: 목 2014-07-10 11:59:54 UTC
        RTC time: 목 2014-07-10 11:59:50
        Timezone: Asia/Seoul (KST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a


위 내용을 살펴보면 timedatectl 명령어를 실행하면 다음 내용이 나타난다.
Local time : 현재 지역(Asia/Seoul, KST) 시간
Universal time : 협정세계시
RTC time : Real-time clock(하드웨어 시계, CMOS시계, BIOS시계라고도 함)
Timezone : 시간대(Time zone)
NTP enabled : NTP 활성화 여부 
NTP synchronized : NTP로 동기화되었는지 여부
RTC in local TZ : RTC(하드웨어 시계)를 시스템 시계와 동일하게 사용할 것인지 여부이다. yes로 설정하면 썸머타임이 설정되지 않고, Timezone 설정에 문제가 많다.
DST active : DST(Daylight saving time, 썸머타임) 설정여부

2. 날짜 및 시간설정
날짜와 시간 모두 설정

7~] #  timedatectl set-time "2014-07-07 22:42:30“

위 설정은 2014년 7월 7일 오후 10시 42분 30초로 설정한 것이다.

날짜만 설정

7~] # timedatectl set-time "2014-07-07"

위 설정은 2014년 7월 7일으로 설정한 것이다.

시간만 설정

7~] # timedatectl set-time "22:42:30"

위 설정은 시간을 오후 10시 42분 30초로 설정한 것이다.

3. 시간대(Time Zone) 변경
CentOS 6 이하 버전에서 시간대를 변경하는 것은 조금 까다로웠다. CentOS 7에서는 timedatectl을 이용하면 아주 쉽게 변경할 수 있다.
먼저 지원하는 시간대를 확인한다. (시간대가 너무 많이 출력될 것이니 파이프(|)와 grep 명령어로 Asia 지역만을 걸러낼 것이다.)

7~] # timedatectl list-timezones | grep Asia
Asia/Aden
Asia/Almaty
Asia/Amman
Asia/Anadyr
Asia/Aqtau
...

리스트 중 변경하고자 하는 시간대가 있으면 다음과 같이 입력한다. 

7~] # timedatectl set-timezone Asia/Seoul

위와 같이 입력하면 “Asia/Seoul"으로 시간대가 설정된다.

4. RTC(하드웨어 시계) 시간 설정
하드웨어 시계의 시간을 설정하기 위해서는 다음과 같은 과정을 거쳐서 설정한다.

7~] # timedatectl set-local-rtc yes
7~] # timedatectl set-time "2014-07-07 22:42:30“
7~] # timedatectl set-local-rtc no

위 과정은 먼저, 시스템에서 하드웨어 시계를 사용하게 설정하고, 날짜와 시간을 설정 한 다음, 시스템에서 하드웨어 시계를 사용하지 않게 하는 것이다. 물론 시간을 맞추는 과정에서 ntpdate, rdate 명령어를 사용하여 타임서버에서 시간을 동기화할 수 있다.

5. 자동 시간동기화
timedatectl 명령어는 NTP(Network Time Protocol)를 사용하여 원격지에 있는 타임서버에서 시간을 가져와 시스템 시계와 자동으로 동기화 시킬 수 있다. 이 설정은 앞에서 살펴보았던 GUI환경의 날짜 및 시간 설정 프로그램에서 네트워크 시간을 켜는 것(활성화), 끄는 것(비활성화)과 동일하게 작동한다. 
다음과 같이 설정하여 시간 동기화를 활성화 한다.

7~] # timedatectl set-ntp yes

자동 시간 동기화를 정지시키기 위해서는 다음과 같이 입력한다.

7~] # timedatectl set-ntp no



5.2.3. date 명령어를 이용한 시스템 시계 설정
날짜 및 시간을 설정하거나 확인하기 위해서는 CentOS 6이하 버전은 date 명령어를 이용한다. 다음과 같이 입력해 보자.

날짜와 시간 모두 설정하는 경우

~] # date -s "2014-07-07 22:42:30“

위 설정은 2014년 7월 7일 오후 10시 42분 30초로 설정한 것이다.

날짜만 설정

~] # date +%D -s "2014-07-07"

위 설정은 2014년 7월 7일으로 설정한 것이다.

시간만 설정

~] # date +%T -s "22:42:30"

위 설정은 시간을 오후 10시 42분 30초로 설정한 것이다.

날짜와 시간을 보기 위해서는 date 명령어만 입력하면 볼 수 있다.

~] # date
2014. 07. 07. (월) 22:47:37 KST


날짜와 시간을 내가 원하는 방식으로 출력할 수 있다. 

~] # date '+%Y-%m-%d %H:%M:%S'
2014-07-07 22:52:36

위와 같이 다양한 포멧을 지정하여 출력할 수 있다. 더 많은 정보는 “date --help"를 입력하면 볼 수 있다. 특히 쉘스크립를 작성할 때 유용하다.



5.2.4. hwclock 명령어를 이용한 시스템 시계 설정
하드웨어 시계를 설정하거나 확인하기 위해 CentOS 6이하 버전은 hwclock 명령어를 이용한다. 리눅스를 사용하면서 하드웨어 시계를 설정하는 경우는 거의 없을 것이다. 수동으로 날짜 및 시간을 입력하여 설정하는 방법을 포함하여 여러 기능이 있지만, 꼭 필요한 몇가지 경우만 알아보자 더 많은 것이 필요하면 멘페이지(man hwclock)를 활용하라.

하드웨어 시계 날짜 및 시간 확인

~] # hwclock
2014년 07월 10일 (목) 오후 09시 59분 19초  -0.536955 seconds

위와 같이 hwclock 명령어를 입력하면 현재 하드웨어 시간을 확인할 수 있다.

현재 시스템 시간을 하드웨어 시간으로 설정

~] # hwclock -w

위와 같이 입력하면 현재 시스템 시간을 하드웨어 시간으로 설정한다.

현재 하드웨어 시간을 시스템 시간으로 설정

~] # hwclock -s

위와 같이 입력하면 시스템 시간을 하드웨어 시간으로 설정한다. 필자는 이 설정을 리눅스를 사용하면서 사용해본 적이 없으나 참고로 적어보았다.

5.2.5. 시간대(Time Zone) 변경
CentOS 6이하 버전에서는 커멘드라인 환경에서 시간대를 변경하는 것은 조금 까다롭다. 필자는 미국에서 제공되는 리눅스서버를 설정해야 하는 경우가 있었는데 시간대를 Asia/Seoul로 설정해 달라는 요청이 있었다. 미국서버로 접속할 수 있는 유일한 방법은 SSH였으며 다음과 같은 방법으로 시간대를 변경할 수 있었다.
시간대에 대한 파일은 /etc/localtime이다. 이 파일에서 설정하는 것이 아니라 시간대에 해당하는 파일을 복사함으로 시간대를 변경할 수 있다.
우선 현재 시간대를 백업한다.

~] # cp /etc/localtime /etc/localtime.bk


변경하고자 하는 시간대 파일을 다음과 같이 /etc/localtime으로 복사한다. 시간대에 관련된 파일은 /usr/share/zoneinfo/ 디렉토리에 디렉토리 및 파일로 존재한다.

~] # cp /usr/share/zoneinfo/US/Hawaii /etc/localtime

하와이 시간대로 복사해 보자. (집필이 끝나면 가고 싶은 곳이 하와이라서..)
변경된 시간을 확인해 보자.

~] # date
2014. 07. 07. (월) 04:03:32 HST



5.2.6. rdate를 이용한 시간 동기화
앞에서 NTP를 이용한 시간동기화를 설정하였다. 여기서는 Time서버에서 시간을 가져와 설정하는 방법을 알아보자. 

~] #  rdate time.bora.net
rdate: [time.bora.net]  Mon Jul  7 23:15:17 2014

위 결과는 네트워크를 통해 시간정보를 가져오는 rdate 명령어를 사용하여 Time서버(time.bora.net)에서 시간을 가져온 것이다. 다음과 같이 가져온 시간을 현재 시간으로 설정할 수 있다.

~] #  rdate -s time.bora.net

"-s"옵션을 사용하여 시스템의 시간을 설정하였다. 
주기적으로 명령어를 실행시켜주는 cron을 이용한다면 매일 00시 00분에 시간을 동기화할 수 있다. 다음과 같이 설정해 보자. cron에 대해서는 다음에 자세히 다루도록 한다.

~] #  crontab -e

위 명령어를 실행하여 사용자 cron을 편집한다. vi 편집기가 실행되고 cron을 설정할 수 있다. 다음과 같이 입력한다. (만약, vi 편집기에 익숙하지 않다면 vi편집기 부분을 약간 공부하고 작업하기 바란다.)

00 00 * * * /usr/bin/rdate -s time.bora.net

위와 같이 입력하고 <ESC>키를 누르고, :wq를 입력하여 저장하고 vi 편집기를 빠져 나온다. 위 설정이 매일 00시 00분에 /usr/bin/rdate -s time.bora.net 명령어를 실행키는 것이다. 이는 매일 리눅스 시스템의 시간을 동기화 한다는 것이다.


 이상으로 15번째 강좌를 마무리 하겠습니다. 날짜 및 시간설정에서 timedatectl이라는 명령어로 통합되었습니다. 2014년 9월 3일(수) 도리(Doly)였습니다.^^ 
 
#################################################
* 본 강좌는 언제든 갱신될 수 있으며, 원글은 www.linux.co.kr 강좌>리눅스>Doly의 연재강좌 에서 수정됩니다. 
* 본 강좌의 일부 또는 전체를 인용하실 경우, 반드시 출처를 밝혀 주시기 바랍니다.

* 수정이력 :
 2014.09.03(수): 최초작성


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1840


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

MRU LRU  (0) 2015.03.03
index hit  (0) 2015.03.02
mysql> show status  (0) 2015.02.26
Multi Rows Insert - ON DUPLICATE KEY UPDATE  (0) 2015.02.19
deterministic  (0) 2015.02.19
반응형

mysql>show status;


Aborted_clients
클라이언트가 비정상으로 종료한 접속 건수
Aborted_connects
접속을 시도했으나 실패한 건수
Bytes_received
모든 클라이언트로부터 받은 바이트 수
Bytes_sent
모든 클라이언트에게 보낸 바이트 수
Com_xxx
xxx 명령이 실행된 횟수
Connections
서버로 접속을 시도한 횟수
Created_tmp_disk_tables
디스크에 만들어진 임시 테이블 수
Created_tmp_tables
메모리에 만들어진 임시 테이블 수
Created_tmp_files
mysqld가 만든 임시 파일 수
Delayed_insert_threads
사용중인 delayed insert handler의 스레드 수
Delayed_writes
insert delayed로 기록된 row의 수
Delayed_errors
insert delayed로 기록할 때 에러가 발생한 row의 수
Flush_commands
Flush 명령이 실행된 횟수
Handler_commit
내부적으로 commit한 횟수
Handler_delete
row가 테이블에서 삭제된 횟수
Handler_read_first
첫 엔트리가 인덱스에서 읽혀진 횟수
즉, full index scan 횟수
Handler_read_key
key에 의해서 row가 읽히도록 요청받은 횟수
수치가 높으면 잘 인덱스 되었음을 의미
Handler_read_next
key order로 다음 row를 읽도록 요청받은 횟수
index scan, 제약된 범위로 index column을 질의하면 증가함
Handler_read_prev
key order로 앞 row를 읽도록 요청받은 횟수
즉, order by...desc를 사용한 횟수
Handler_read_rnd
지정한 위치로부터 row를 읽도록 요청 받은 횟수
즉, 소팅한 횟수
Handler_read_rnd_next
데이터 파일에서 다음 row를 읽도록 요청 받은 횟수
즉, 테이블 scan의 횟수로 테이블이 적절하게 인덱스 되어 있지 않음을 가리킴
Handler_rollback
내부적으로 rollback한 횟수
Handler_update
테이블에서 row의 갱신을 요청 받은 횟수
Handler_write
테이블에서 row에 insert를 요구한 횟수
Key_blocks_used
key cache에서 사용된 block의 수
Key_read_requests
cache로부터 key block을 읽도록 요청받은 횟수
Key_reads
디스크에서 key block를 실제로 읽은 횟수
Key_write_requests
cache에 key block을 기록하도록 요구한 횟수
Key_writes
디스크에 key block을 실제로 기록한 횟수
Max_used_connections
동시에 사용토록 허용된 최대 접속 수
Not_flushed_key_blocks
변경된 것이 디스크에 flush되지 않은 key cache의 key block 수
Not_flushed_delayed_rows
insert delay에 의해서 아직 기록되지 않고 기다리는 row의 수
Open_tables
open되어 있는 테이블의 수
Open_files
open되어 있는 파일의 수
Open_streams
open되어 있는 stream의 수(주로 logging에 사용)
Opened_tables
열어본 테이블의 수
Questions
서버에 질의를 보낸 횟수
Qcache_queries_in_cache
0
Qcache_inserts
0
Qcache_hits
0
Qcache_lowmem_prunes
0
Qcache_not_cached
0
Qcache_free_memory
0
Qcache_free_blocks
0
Qcache_total_blocks
0
Rpl_status
안전조치 복제 상태
Select_full_join
key 없이 join한 횟수(0이 아니면, 테이블의 인덱스를 검토요망)
Select_full_range_join
참조 테이블에서 range search로 join한 횟수
Select_range
첫 테이블에서 range를 사용하여 join한 횟수
Select_range_check
key 없이 join한 횟수(0이 아니면, 테이블의 인덱스를 검토요망)
Select_scan
첫 테이블중 full scan한 곳에서 join한 횟수
Slave_open_temp_tables
slave가 현재 열고 있는 임시 테이블 수
Slave_running
ON이면 master에 접속한 slave가 있음
Slow_launch_threads
create시 slow_launch_time보다 더 걸린 스레드의 수
Slow_queries
long_query_time보다 더 시간이 걸린 질의의 수
Sort_merge_passes
sort 알고리즘을 통과한 merge의 수
값이 크면 sort_buffer의 증가를 고려해야함
Sort_range
range 내에서 소팅한 수
Sort_rows
소팅한 row의 수
Sort_scan
테이블을 스캔닝하여 소팅한 수
ssl_xxx
SSL이 사용한 변수
Table_locks_immediate
테이블 lock이 직접 요구된 횟수
Table_locks_waited
테이블 lock이 기다려야 했던 횟수
수치가 크면, 퍼포먼스에 문제 있으므로 optimize요망
Threads_cached
thread cache에 있는 스레드의 수
Threads_created
접속을 유지하기 위해서 만들었던 스레드의 수
Threads_connected
현재 열려서 접속되어 있는 스레드 수
Threads_running
sleeping하지 않고 작동중인 스레드의 수
Uptime
서버의 작동 시간(초)


위 변수에서
 Opened_tables가 크면, 
    table_cache 변수는 작을 수 있다..
 Key_reads가 크면,  
    key_buffer_size는 작을 수 있다.
 Handler_read_rnd가 크면, 
    더 많은 쿼리를 한다.
 Thread_created가 크면,   
    thread_cache_size를 크게해야 될지도 모른다.
 Created_tmp_disk_tables가 크면, 
    tmp_table_size를 크게 해야 될지도 모른다.



http://blog.naver.com/serimo/50169995211

[출처] mysql> show status|작성자 만박



반응형

'연구개발 > MYSQL' 카테고리의 다른 글

index hit  (0) 2015.03.02
날짜 및 시간설정  (0) 2015.02.26
Multi Rows Insert - ON DUPLICATE KEY UPDATE  (0) 2015.02.19
deterministic  (0) 2015.02.19
MySQL optimize/analyze table  (0) 2015.02.18
반응형

[출처] Multi Rows Insert - ON DUPLICATE KEY UPDATE (MySQL Power Group) |작성자 ham

http://cafe.naver.com/mysqlpg/585


Insert ~ ON DUPLICATE KEY UPDATE 글(http://cafe.naver.com/mysqlpg/583)을 보고,

예전에 테스트 했던 내용이 생각나 올려보네요.

 

Reference : http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

 

use test;

 

drop table if exists xxx;

create table xxx (
  useridx     bigint        not null
, memo        varchar(20)
, reg_date    datetime
, upd_date    datetime
, primary key (useridx)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- 1) Single Row Insert

 

INSERT INTO xxx (useridx, memo, reg_date) VALUES (0, 'TEST-0', now())
   ON DUPLICATE KEY UPDATE useridx = 0;

 

select * from xxx;

+---------+--------+---------------------+----------+
| useridx | memo   | reg_date            | upd_date |
+---------+--------+---------------------+----------+
|       0 | TEST-0 | 2014-01-12 09:16:25 | NULL     |
+---------+--------+---------------------+----------+

 

-- 2) Multi Row Insert

 

INSERT INTO xxx (useridx, memo, reg_date)
     VALUES (1, 'TEST-1', now())
           ,(2, 'TEST-2', now())
           ,(3, 'TEST-3', now())
           ,(4, 'TEST-4', now())
           ,(5, 'TEST-5', now())
   ON DUPLICATE KEY UPDATE useridx = VALUES(useridx);

 

select * from xxx;

+---------+--------+---------------------+----------+
| useridx | memo   | reg_date            | upd_date |
+---------+--------+---------------------+----------+
|       0 | TEST-0 | 2014-01-12 09:16:25 | NULL     |
|       1 | TEST-1 | 2014-01-12 09:16:37 | NULL     |
|       2 | TEST-2 | 2014-01-12 09:16:37 | NULL     |
|       3 | TEST-3 | 2014-01-12 09:16:37 | NULL     |
|       4 | TEST-4 | 2014-01-12 09:16:37 | NULL     |
|       5 | TEST-5 | 2014-01-12 09:16:37 | NULL     |
+---------+--------+---------------------+----------+

 

-- 3) Multi Row Insert & Update

 

INSERT INTO xxx (useridx, memo, reg_date)
     VALUES (1, 'TEST-11', now())
           ,(2, 'TEST-12', now())
           ,(3, 'TEST-13', now())
   ON DUPLICATE KEY UPDATE useridx  = VALUES (useridx)
                          ,memo     = VALUES (memo)
                          ,upd_date = now();

 

select * from xxx;

+---------+---------+---------------------+---------------------+
| useridx | memo    | reg_date            | upd_date            |
+---------+---------+---------------------+---------------------+
|       0 | TEST-0  | 2014-01-12 09:16:25 | NULL                |
|       1 | TEST-11 | 2014-01-12 09:16:37 | 2014-01-12 09:16:54 |
|       2 | TEST-12 | 2014-01-12 09:16:37 | 2014-01-12 09:16:54 |
|       3 | TEST-13 | 2014-01-12 09:16:37 | 2014-01-12 09:16:54 |
|       4 | TEST-4  | 2014-01-12 09:16:37 | NULL                |
|       5 | TEST-5  | 2014-01-12 09:16:37 | NULL                |
+---------+---------+---------------------+---------------------+

 


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

날짜 및 시간설정  (0) 2015.02.26
mysql> show status  (0) 2015.02.26
deterministic  (0) 2015.02.19
MySQL optimize/analyze table  (0) 2015.02.18
cursor 커서  (0) 2015.02.17
반응형

http://blog.naver.com/wwko1212/120115420877


deterministc 함수는 입력값이 같으면 리턴되는 결과 값도 항상 같음을 보장하는 홤수이다.

함수 기반 인덱스를 생성할 때 사용자 정의함수를 사용하려면 해당 함수는

반드시  deterministic 함수로 생성되어야 한다.

 

아래 함수는 deterministic 키워드를 사용했지만 실제로는 deterministic 함수로 보기 어렵다.

왜냐하면 하나의 쿼리에서 이 함수가 반복 실행된다면 도중에 다른 값이 리턴될 수 있기 때문이다.

 

create or replace function uf_name(p_empno number)

 return varchar2

 deterministic

is

 v_ename emp.ename%type;

begin

 select ename into v_ename

 from emp

 where empno = empno;

 return v_ename;

end;

/

반면 다음 함수는 입력값이 같으면 항상 결과 값이 같으므로 deterministic 함수의

적절한 예제로 볼 수 있을것이다.

 

create or replace function uf_tax (p_sal number)

 return number

 deterministic

is

begin

 return p_sl*0.01;

end;

/

[출처] deterministic|작성자 HYUN


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

mysql> show status  (0) 2015.02.26
Multi Rows Insert - ON DUPLICATE KEY UPDATE  (0) 2015.02.19
MySQL optimize/analyze table  (0) 2015.02.18
cursor 커서  (0) 2015.02.17
binlog 파일 관리  (0) 2015.02.11
반응형

[출처] MySQL optimize/analyze table 정리|작성자 또리장군


analyze table
1. optimizer가 사용하는 통계정보의 갱신처리이다.
2. InnoDB에서는 자발(자동)적으로 통계 정보를 갱신하기 때문에 별필요가 없다고 한다.
   MyISAM의 경우는 카디날리티가 정확하게 갱신되어 있지만
   InnoDB는 아주 부정확하고 analyze table을 실행하면 빈번이 값이 바뀐다.
   InnoDB의 경우 자동으로 갱신되는 조건은 아래와 같다.
   - 전에 인덱스 통계정보를 갱신한후 테이블의 전체행수의1/16이 갱신된경우
   - 전에 인덱스 통계정보를 갱신한후 20억행이상이 갱신된경우
3. analyze table은 랜덤으로 페이지를 8회추출해서 그 페이지내에 포함된 행 데이타를 조사해서
   인덱스의 통계정보를 근사치로 갱신한다. 근사치이지만 옵티마이저가 사용하기 위한 통계정보로는
   충분하다고 한다. 만약 페이지가 InnoDB 버퍼 풀에 있지 않다면 디스크 Read가 발생하게 되므로 8회되로 제한했는지 모르겠다.
4. MySQL 5.1의 InnoDB에서는 8회로 고정되어있다.
   plugin을 사용하면 innodb_stats_sample_pages 옵션을 조정하여 변경할 수 있다.

optimize table
1. InnoDB의 경우 fragmentation이 발생할 빈도가 높지는 않다. 물론 추기형이 아니므로 vacuum은 필요없다.
2. InnoDB는 MVCC구조이므로 DELETE의 경우 불필요한 로그, 데이타가 남게 되므로 이런 경우 정리가 필요하게 된다.
3. optimize table은 프라이머리키 순서로 데이타를 재배치한다. 이로 인해 인덱스의 정리도 가능해진다.
4. optimize table은 ALTER TABLE t1 ENGINE INNODB;과 동일하다.
5. MySQL은 ALTER TABLE작업은 
   임시 테이블 생성 > 임시 테이블로 복제 > 기존 테이블 DROP > 임시 테이블의 이름을 기존 테이블의 이름으로 변환
   하는 식으로 수행한다. 인덱스가 추가, 갱신등으로 많은 시간을 허비하므로 인덱스를 삭제후 alter table 그후 인덱스 재생성
   식으로 빠르게 수행하도록 한다.
6. 4의 내용을 기반으로 5의 방식을 도입하면 optimize table을 보다 고속으로 수행할수 있다.
   PK이외의 인덱스를 삭제 > optimize table > 인덱스 재생성
   
   
http://blog.naver.com/parkjy76/30098128371
http://blog.naver.com/parkjy76/30135775298
http://blog.naver.com/parkjy76/30135863796

------------------------------------------------------------------------------------------

InnoDB의 delete optimize table테스트

------------------------------------------------------------------------------------------

$ ls -al
-rw-rw----  1 mysql mysql      8640 Feb 24 16:16 cate_item.frm
-rw-rw----  1 mysql mysql  50331648 Feb 24 17:33 cate_item.ibd


mysql> delete from cate_item where store_id in(3, 5, 7);
Query OK, 150000 rows affected (3.55 sec)
---------------------------------------------------------------
-rw-rw----  1 mysql mysql      8640 Feb 24 16:16 cate_item.frm
-rw-rw----  1 mysql mysql  50331648 Feb 24 17:33 cate_item.ibd


mysql> optimize table cate_item;
+----------------+----------+----------+-------------------------------------------------------------------+
| Table          | Op       | Msg_type | Msg_text                                                          |
+----------------+----------+----------+-------------------------------------------------------------------+
| test.cate_item | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.cate_item | optimize | status   | OK                                                                |
+----------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (18.11 sec)
---------------------------------------------------------------
-rw-rw----  1 mysql mysql      8640 Apr 18 15:59 cate_item.frm
-rw-rw----  1 mysql mysql  37748736 Apr 18 16:00 cate_item.ibd


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

Multi Rows Insert - ON DUPLICATE KEY UPDATE  (0) 2015.02.19
deterministic  (0) 2015.02.19
cursor 커서  (0) 2015.02.17
binlog 파일 관리  (0) 2015.02.11
Linux time. (real, user, sys)  (0) 2015.02.10
반응형

http://cafe.naver.com/mysqlpg/413



중첩 커서 사용시 고려해야 할 부분에 대해서 정리해보았습니다. 
중첩 커서 부분은 아래 링크의 내용을 참조한 것입니다. 

 

http://rpbouman.blogspot.kr/2005/10/nesting-mysql-cursor-loops.html

 

Single Cursor Loops

 

일반적인 케이스는 간단한 한 개의 cursor loop 입니다

더 이상의 레코드가 없을 때까지 loop을 돌면서 하나의 레코드씩 fetch를 하는 경우 입니다

 

begin

     declare v_col1 int;                    -- cursor 에서 fetch 할 레코드의 데이터를 담을 변수 

     declare no_more_rows boolean := FALSE; -- cursor looping control할 변수 선언

     declare cursor1 cursor for             -- cursor 선언 

             select col1 

             from myTable;

     declare continue handler for not found  -- cursor 에서 더이상 fetch 할 레코드가 없을 때 실행될 handler

     set no_more_rows := TRUE;

 

     open cursor1; -- cursor 선언시 지정된 쿼리를 실행하고 결과 셋을 저장하여 record looping 할 준비

 

             LOOP1: loop    -- looping LOOP1 block 의 시작 

             fetch cursor1  -- 현재 cursor pointer가 가리키는 record  fetch 하여 v_col1 에 넣는다

             into v_col1;    -- 여기서 fetch  row가 없을 때 NOT FOUND condition 이 되고 위에 선언된 not found handler set no_more_rows := TRUE 가 실행된다

 

             if no_more_rows  -- fetch시에 record가 없었는지 확인  

             then

                 close cursor1;    -- cursor1 close 하여 resource 해제 

                 leave LOOP1;      -- LOOP1 block 을 빠져 나간다

             end if;

                   --

                   -- 기타 코드 들 

                   --

             end loop LOOP1;            -- looping LOOP1 block 의 끝 

end;

 

간단하고 전형적인 mysql procedure 코드 입니다

여기서 OPEN, FETCH, CLOSE 는 다 선언 된 cursor1 과 코드 상에서 연관되어 일어나는 action들 입니다. 

그런데 handler  선언 시 특정 cursor에 연관되어 선언되지 않습니다.

cursor1 에서 마지막 레코드가 fetch 되고 더이상 fetch 될 레코드가 없을 때 

cursor1  NOT FOUND condition raise 하게 되면 이 때 NOT FOUND condition handler 와 연관을 갖게 

되는데 cursor1  scope 내에 가장 가까운 NOT FOUND handler에 의해서 해당 condition  잡혀서

지정된 exception 처리를 하게 됩니다. 이런 부분 때문에 중첩 cursor loop 사용시 자신이 원하는대로

condition handler가 작동되도록 주의가 필요합니다.

 

 

Nested Cursor Loops

 

종종 두 개의 cursor를 중첩할 필요가 생깁니다

중첩 cursor 사용시 중요한 것은 앞에 언급한 것처럼 

handler 를 특정 cursor 와 선언 과정에서 연관시킬 수 없기 때문에 

특정 cursor  fetch loop을 돌면서 NOT FOUND에 도달 했을 때 원하는 handler를 실행시키고 그 에 따라 

두 개의 loop 중 해당 cursor 와 관련된 loop만 종료되게 하도록 코딩하는 것입니다

 

 

1) Using a seperate block 

 

가장 깔끔한 방법 중에 하나로 중첩 cursor 각각에 begin .. end 로 명확히 block을 나누어 

 block 내에서 각 cursor 에 적용될 not found handler를 선언해 주는 것입니다

 cursor 에서 raise  not found condition은in -> out 으로 전파 되는데

이 과정 중에 가장 가까운 handler 에 잡히게 됩니다. 즉, inner block(BLOCK2) 에서 발생한 condition은 inner block 에서 선언 된 handler 에 잡히게 됩니다.

그리고 outer block (BLOCK1) 에서 발생한 condition 은 inner block 에 있는 handler 에 잡힐 수 없기 때문에 inner block condition 은 inner block handler 에서 outer block condition 은 outer block handler 에서 exception 처리가 되어 의도한 대로 looping 을 빠져나갈 수 있습니다.  

 

 

BLOCK1: begin

             declare v_col1 int;
             declare no_more_rows boolean := FALSE;
             declare cursor1 cursor for 
                     select col1
                     from MyTable;

             declare continue handler for not found
                     set no_more_rows1 := TRUE;

             open cursor1;

             LOOP1: loop
                    fetch cursor1
                    into v_col1;

                    if no_more_rows1 
                    then
                        close cursor1;
                        leave LOOP1;
                    end if;

 

                    BLOCK2: begin
                            declare v_col2 int;
                            declare no_more_rows2 boolean := FALSE;
                            declare cursor2 cursor for
                                    select col2
                                    from MyOtherTable
                                    where ref_id = v_col1;

                            declare continue handler for not found
                                    set no_more_rows2 := TRUE;

                            open cursor2;

                            LOOP2: loop
                                   fetch cursor2
                                   into v_col2;

                                   if no_more_rows2 
                                   then
                                       close cursor2;
                                       leave LOOP2;
                                   end if;
                            end loop LOOP2;
                    end BLOCK2;
             end loop LOOP1;
end BLOCK1;

                                  

2) Resetting the loop control variable

 

1) 의 방법이 명확하긴 하지만 코드가 중복된다는 단점이 있습니다. 
이를 피하고 의도한 대로 not found condition 발생시 해당 cursor와 연관된 loop 만을 
종료하기 위해서는 loop control variable 을 inner loop 을 빠져나가는 단계에서 초기화 해주면 됩니다. 
 

begin 
             declare no_more_rows boolean default false;
             declare v_col1 int;
             declare v_col2 int;

             declare cursor1 cursor for
                           select col1
                           from MyTable;


             declare cursor2 cursor for 
                           select col2
                           from MyOtherTable
                           where ref_id = v_col1;

 

             declare continue handler for not found
                           set no_more_rows := true;


             open cursor1:

             LOOP1: loop
                    fetch cursor1 into v_col1;

                    if no_more_rows 
                    then 
                         close cursor1;
                         leave LOOP1;
                    end if;

                    open cursor2;

                    LOOP2: loop
                          fetch cursor2 into v_col2;

                          if no_more_rows 
                          then
                               set no_more_rows := false;
                               close cursor2;
                               leave LOOP2;
                          end if;
                    end loop LOOP2;
             end loop LOOP1;
end;

 

이렇게 하면 코드 중복 없이 inner loop 이 종료 되면서 의도치 않게 outer loop 까지 종료 되는 
것을 방지할 수 있습니다.

 

3) inner cursor loop 전용 프로시저를 만든다.


1) 과 유사한 방법으로 inner loop 을 위해 프로시저를 따로 생성하고 
outer loop 에서 해당 프로시저를 호출하는 방법입니다. 
아래와 같이 작성하는 방식은 관리 효율성적인 측면에 이점이 있습니다. 
inner loop 을 재사용하거나 debugging 시에 각 모듈별로 할수 있다는 이점이 있습니다.

 

create procedure p_inner_loop(
IN p_col1 int
)
begin

             declare v_col int;
             declare no_more_rows boolean := FALSE;
             declare cursor cursor1 for
                     select col2
                     from MyOtherTable
                     where ref_id = p_col1;

             declare continue handler for not found
                     set no_more_rows := TRUE;

             open cursor1;

             LOOP1: loop
                  fetch cursor1
                  into v_col1;
                  
                  if no_more_rows 
                  then
                      close cursor1;
                      leave LOOP1;
                  end if;
             end loop LOOP1;

end;

 

BLOCK1: begin

             declare v_col1 int;
             declare no_more_rows boolean1 := FALSE;
             declare cursor1 cursor for 
                     select col1
                     from MyTable;

             declare continue handler for not found
                     set no_more_rows1 := TRUE;

             open cursor1;

             LOOP1: loop
                   fetch cursor1
                   into v_col1;

                   if no_more_rows1 
                   then
                       close cursor1;
                       leave LOOP1;
                   end if;

                   call p_inner_loop(v_col1);

             end loop LOOP1;
end BLOCK1;

 

 

 

 

 

Declare cursor position

 

 

문서에 다음과 같이 나와 있습니다.

 

Cursor declarations must appear before handler declarations and after variable and condition declarations.

 

그리고 cursor 선언 전에 dml 도 안 됩니다.

그래서 아래와 같이 하면 ERROR 납니다. 그런데 그냥 syntax 에러라고 문서에서 문법 체크하라고만 메시지가 나와서

모르고 하다 보면 이유가 뭔지 찾기가 어렵습니다. ㅠㅜ

 

begin

     declare var1;

     declare var2;

     update t_table set status='E' where status='D' and reg_date > timestampadd(minute,-2,now());

     declare c_status_E CURSOR for

             select a,status from t_table where status = 'E';

             ...

             ...

end;

ERROR syntax 어쩌구 저쩌구 please 문법 체크

 

그래서 아래와 같이 begin end 로 block 을 나눠줘야 합니다. 

 

begin

     declare var1;

     declare var2;

     update t_table set status='E' where status='D' and reg_date > timestampadd(minute,-2,now());

     begin

             declare c_status_E CURSOR for

                     select a,status from t_table where status = 'E';

             ...

             ...

     end;

end;


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

deterministic  (0) 2015.02.19
MySQL optimize/analyze table  (0) 2015.02.18
binlog 파일 관리  (0) 2015.02.11
Linux time. (real, user, sys)  (0) 2015.02.10
[모니터링] 쿼리  (0) 2015.02.10
반응형

[root@dev_M01 BINLOG]# ls -l --time-style=long-iso * | grep -v "index" | awk '{

key=$6;

cnt[key] ++;

sum[key] += $5;

}

END {

printf "======================================\n";

printf "   Date       Count       Size(MB) \n";

printf "======================================\n";

for (dt in cnt)

{

tcount = tcount + 1;

vcnt = vcnt + cnt[dt];

vsum = vsum + sum[dt];

printf "[%s] : \t%d\t%+12s\n", dt, cnt[dt], sum[dt]/1024/1024

}

printf "======================================\n";                                    

printf "Avg Per Day : \t%d\t%+12d\n", (vcnt / tcount), (vsum/1024/1024/tcount);

printf "======================================\n";                                    

}'




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

   Date       Count       Size(MB) 

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

[2015-02-09] : 1  0.00364113

[2015-02-10] : 3     185.123

[2015-02-11] : 1  0.00479031

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

Avg Per Day : 1         +61

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

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

MySQL optimize/analyze table  (0) 2015.02.18
cursor 커서  (0) 2015.02.17
Linux time. (real, user, sys)  (0) 2015.02.10
[모니터링] 쿼리  (0) 2015.02.10
MySQL NF 5.6 - Enhanced tracing (SQL Trace 방법)  (0) 2015.02.09
반응형

http://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1


real : 실제 처음과 끝까지 경과 시간
user : user 프로그램이 CPU 점유한 시간. 멀티플 CPU의 경우 각 코어들 시간이 합산되어 나오므로 user가 real보다 더 커지는 경우 있을수 있음.
sys : 시스템이 CPU 점유한 시간


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

cursor 커서  (0) 2015.02.17
binlog 파일 관리  (0) 2015.02.11
[모니터링] 쿼리  (0) 2015.02.10
MySQL NF 5.6 - Enhanced tracing (SQL Trace 방법)  (0) 2015.02.09
CentOS7 hostname 변경  (0) 2015.02.07
반응형
# 부하쿼리
SELECT *
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 5\G;



# 사용하지 않는 인덱스

SELECT OBJECT_SCHEMA, OBJECT_NAME, INDEX_NAME

FROM performance_schema.table_io_waits_summary_by_index_usage

WHERE index_name IS NOT NULL

AND OBJECT_SCHEMA NOT IN ('mysql', 'test')

AND COUNT_STAR = 0

ORDER BY OBJECT_SCHEMA, OBJECT_NAME;



스키마별 엔진별 테이블 수와 데이터 사이즈, 인덱스 사이즈를 구합니다.
SELECT TABLE_SCHEMA AS 'SCHEMA', ENGINE, COUNT(*) AS 'TABLES'
, ROUND(SUM(DATA_LENGTH)/1024/1024, 0) AS DATA_MB
, ROUND(SUM(INDEX_LENGTH)/1024/1024, 0) AS INDEX_MB
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema')
AND ENGINE IS NOT NULL
GROUP BY TABLE_SCHEMA, ENGINE;

# 서버가 시작한 이래 한번도 로그인하지 않은 계정
SELECT DISTINCT m_u.user, m_u.host
FROM mysql.user m_u
LEFT JOIN performance_schema.accounts ps_a
ON m_u.user = ps_a.user AND m_u.host = ps_a.host
WHERE ps_a.user IS NULL
ORDER BY m_u.user;

서버가 가장 최근 시작된 이래로 한 번도 연결되지 않은 유저
SELECT DISTINCT m_u.user
FROM mysql.user m_u
LEFT JOIN performance_schema.users ps_u
ON m_u.user = ps_u.user
WHERE ps_u.user IS NULL
ORDER BY m_u.user;


서버가 가장 최근 시작된 이래로 한 번도 사용되지 않은 계정( 프로시저, 뷰, 이벤트, 트리거 조차도 생성되어 있지 않은 경우 )
SELECT DISTINCT m_u.User, m_u.Host
FROM mysql.user m_u
LEFT JOIN performance_schema.accounts ps_a 
ON m_u.User = ps_a.User AND ps_a.Host = m_u.Host
LEFT JOIN information_schema.views is_v 
ON is_v.DEFINER = CONCAT(m_u.User, '@', m_u.Host) AND is_v.security_type = 'DEFINER'
LEFT JOIN information_schema.routines is_r 
ON is_r.DEFINER = CONCAT(m_u.User, '@', m_u.Host) AND is_r.security_type = 'DEFINER'
LEFT JOIN information_schema.events is_e 
ON is_e.DEFINER = CONCAT(m_u.User, '@', m_u.Host)
LEFT JOIN information_schema.triggers is_t 
ON is_t.DEFINER = CONCAT(m_u.User, '@', m_u.Host)
WHERE ps_a.USER IS NULL
AND is_v.DEFINER IS NULL
AND is_r.DEFINER IS NULL
AND is_e.DEFINER IS NULL
AND is_t.DEFINER IS NULL
ORDER BY m_u.User, m_u.Host;



반응형
반응형

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

* 참고

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

http://dev.mysql.com/doc/internals/en/optimizer-tracing.html


OOW2013 - [TUT8131] Enhancing Productivity with MySQL 5.6 New Features.pptx

- https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=8131

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


use test;


drop table if exists big_table;


create table big_table

as

select a.*

  from information_schema.columns a

      ,information_schema.columns b

      ,information_schema.columns c

 limit 1000000;


select count(*) from big_table;



[출처] MySQL NF 5.6 - Enhanced tracing (SQL Trace 방법) (MySQL Power Group) |작성자 29babo

http://cafe.naver.com/mysqlpg/105



drop procedure if exists test_proc;


delimiter //


create procedure test_proc()

begin

   set @s = "";

   select 'select count(*) from big_table' into @s;

   prepare stmt from @s;

   execute stmt;

end

//


delimiter ;


call test_proc();




SET OPTIMIZER_TRACE="enabled=on",END_MARKERS_IN_JSON=on;

set optimizer_trace_limit        =  100;

set optimizer_trace_offset       = -100;

SET optimizer_trace_max_mem_size = 1000000;


select *               from big_table where column_name = 'CHARACTER_SET_NAME' limit 10;

select count(*) as cnt from big_table where column_name = 'CHARACTER_SET_NAME';

call test_proc();


# possibly more queries...

# When done with tracing, disable it:


SET optimizer_trace="enabled=off";


SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;



반응형

'연구개발 > MYSQL' 카테고리의 다른 글

Linux time. (real, user, sys)  (0) 2015.02.10
[모니터링] 쿼리  (0) 2015.02.10
CentOS7 hostname 변경  (0) 2015.02.07
MySql Binlog 파일 복구시 원하는 쿼리문만 가공하여 추출하기..  (0) 2015.02.06
aws fdisk  (0) 2015.02.05
반응형

hostnamectl이라는 명령어가 추가 되었는데, 이 명령을 이용해 hostname을 조작할 수 있다.


1. hostname 상태 확인하기

$ hostnamectl status

   Static hostname: centos7-test-01.com2us.kr

         Icon name: computer

           Chassis: n/a

        Machine ID: 7a39a64ab05f4ea4bbf9a4276742f691

           Boot ID: c072988dc26f41e8b9f26dd2090f8bb3

    Virtualization: vmware

  Operating System: CentOS Linux 7 (Core)

       CPE OS Name: cpe:/o:centos:centos:7

            Kernel: Linux 3.10.0-123.el7.x86_64

      Architecture: x86_64


2. hostname 변경하기

$ hostnamectl set-hostname [호스트명]


$ vi /etc/hostname


반응형
반응형

http://egloos.zum.com/goodhelper/v/2376049


MySql 을 사용하다보면 사용자들이 종종 디비를 날려먹거나
혹은 특정 작업만 따로 백업을 받아 놓고 싶은 경우가 발생하는데
이때 MySql 의 바이너리 로그파일을 이용하면 일이 쉬워집니다.

먼저 무작정 MySql의 바이너리 파일을 이용하여 쿼리문을 추출하면
양도 많고, 또 일일이 쿼리문을 걸러내야 하는데 mysqlbinlog를 사용할때 리눅스
기본 명령어 옵션을 이용하면 이런 작업들을 좀 수월하게 할 수 있죠~

$경로/mysqlbinlog /path/to/바이너리_로그파일 | \
grep -i -e "^update" -e "^insert" -e "^delete" -e "^replace" -e "^alter" | \ <= 수정,입력,삭제,변경,제거 쿼리문만 추출
cut -c1-100 |\ <= 추출할 쿼리문에서 1~100번 문자열까지만
tr '[A-Z]' '[a-z]' | \ <= 대문자를 소문자로 변환
sed -e "s/\t/ /g;s/\`//g;s/(.*$//;s/ set .*$//;s/ as .*$//" | sed -e "s/ where .*$//" | \ <=  정규식적용으로 한라인씩 읽음
sort | uniq -c | sort -nr <= 정렬하여 보여줌 (uniq 명령어는 중복쿼리 제거)

========================== 예제 =========================

mysqlbinlog /path/to/mysql-bin.000706 | \
grep -i -e "^update" -e "^insert" -e "^delete" -e "^replace" -e "^alter" | \
cut -c1-100 | \
tr '[A-Z]' '[a-z]' | \
sed -e "s/\t/ /g;s/\`//g;s/(.*$//;s/ set .*$//;s/ as .*$//" | sed -e "s/ where .*$//" | \
sort | uniq -c | sort -nr 




<실제 출력 화면.. 본인이 관리하는 DB라서 테이블명은 가림>

이외에도 특정 날짜를 기준으로도 쿼리문을 추출 할 수 있는데 본인이 직접 포스팅하기 보단
이와관련해서 잘 포스팅되어진 블로그를 링크하겠습니다.

http://kemo.tistory.com/1 <= mysqlbinlog 이용해서 특정 날짜만 추출하기

참조문서 : http://dev.mysql.com/doc/refman/5.5/en/binary-log.html


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

MySQL NF 5.6 - Enhanced tracing (SQL Trace 방법)  (0) 2015.02.09
CentOS7 hostname 변경  (0) 2015.02.07
aws fdisk  (0) 2015.02.05
optimizer_swtich 쿼리로 보기  (0) 2015.02.05
[socket.io] set get 대체법  (0) 2015.02.04
반응형

vi /etc/fstab


UUID=0f790447-ebef-4ca0-b229-d0aa1985d57f /                       ext4     errors=remount-ro        0 1

/dev/xvdf       /usr1   ext4    defaults        1 2

혹은 /dev/xvdf       /usr1   ext4    defaults        0 0






LABEL=cloudimg-rootfs / ext4 defaults,discard 0 0

#/dev/xvdd1 /data ext4 defaults 0 0

#/dev/xvdb /mnt auto defaults,nobootwait,comment=cloudconfig 0 2

#/dev/xvdd /disk1 ext4 rw 0 0




출처 : http://www.greatuser.net/ilaya/index.php?document_srl=5018&mid=lectureonly

 

 

 

1 /etc/fstab 파일에 대하여

아마 이 글을 보시는 리눅스 관리자 분들께서는 다들 익숙한 파일입니다만..


 

음.. 일본에서 뭔가 하던 와중에 문득 생각이 나서.. 
뭐 새로 들어오신(실) 분들을 위해서 초큼 정리를...



 

2 필드의 설명

자../etc/fstab 파일은 총 6개의 필드로 구성이 되어있습니다.
요즘 설치하는 데비안4의 경우는 fstab 파일의 최상단에 각 필드명이 미리 기재되어있지요.
허나.. CentOS는 이러한 친절함을 배풀지는 못했습니다.. 애석하게도..

참.. /etc/fstab 파일은 장치(뭐 대략 저장공간이라고 합시다)들이 부팅시에 자동으로 마운트 되도록 해주는 기능에 관여합니다.

자~ 그럼 하나씩 살펴보도록 해봅시다~

[root@ns1 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2    6.7G  5.2G  1.2G  83% /
/dev/sda1    99M   22M   73M  23% /boot
tmpfs     1011M  0 1011M   0% /dev/shm
/dev/sda5    1.9G   36M  1.8G   3% /tmp
/dev/sda6    9.2G  3.2G  5.6G  36% /var
/dev/sda7    49G   41G  5.1G  90% /home
/dev/sdb1    19G   15G  3.3G  82% /vpopmail
/dev/sdb2    49G   35G   13G  74% /home2


자~ 이것은 제가 사용하는 서버를 기꺼이 예제로 제공한 모습입니다.
뭐.. "df -h" 라는 명령어를 이용해서 운영중인 시스템의 마운트 상황을 보는것이죠~

그럼 뭐.. 가따부따 필요없이 /home 을 먼저 살펴보겠습니다.

이것을 부팅될 때마다 자동마운트 시켜주길 원한다면 /etc/fstab에 기록을 하게 되고, 내용은 아래와 같습니다.
/dev/sda7    /home  ext3  defaults 1 2

처음 설명한대로 총 6개의 필드로 구성되어 있는것을 볼 수 있습니다.

자~ 이제 각 항목별로 어떤 내용인지 살펴봅시다.

2.1 1번필드 : /dev/sda7

요것은 마운트될 장치를 선언하는 부분입니다.
왜 그렇게 되냐구요? 
df 명령의 결과값중 /home 파티션이 /dev/sda7 을 사용하고 있으니 그런거라는...
물론 /etc/fstab에 그렇게 기록되었으니 
/dev/sda7     49G   41G  5.1G  90% /home
이런식으로 보이는 것이겠지만.. 
애초부터 이걸 결정하는것은 관리자 자신입니다.. 
뭐... 닭이 먼저냐.. 달걀이 먼저냐를 따지면 ㄷㅈ...
고로 /vpopmail 파티션을 마운트하기 위해서 fstab에 기록한다면 당근 /dev/sdb1 이지요... 
이해가 안됐다고?... 휴.. 그럼 다른일을 찾는게... 
어차피 니 적성에는 안맞는거야 이건...

2.2 2번필드 : /home

요것은 마운트포지션을 선언하는 부분입니다.
/dev/sda7 장치를 /home 디렉토리의 공간으로 사용하겠다는 의미지요.
1번필드와 이해수준이 별반 다를게 없습니다.. 
간단한 논리 아닙니까...? 
/dev/sda7장치를 /home 디렉토리로 이용하겠다... 라는... 
더 간단하게 얘기하자면... 대체 이 장치는 어디에 쓸꺼니? 라고 말하고 싶군요..

2.3 3.번필드 : ext3

파일시스템의 타입(종류)를 선언하는 부분입니다.
사실 1,2번 필드는 웬만한 바보가 아닌이상 처음 열어보더라도 "아.. 이런게 아닐까?"라는 감이옵니다.
중요한것은 바로 이 3번필드부터...

일반적으로 에서 리눅스 파일시스템을 만들때 가장 많이 사용하는것은 무엇일까요?
또는 최근 나온 리눅스 배포본을 설치할때 기본적으로 정의되는 파일시스템 타입은 무엇일까요?
바로 EXT3 타입입니다. (최근에는 EXT4 를 사용하는 사례가 많기도... )
EXT3 가 무엇인지는 별도로 찾아보도록 하시고... 
뭐 윈도우의 FAT16, FAT32, NTFS 등등과 같이... 파일시스템이 구성된 타입을 선언하는 것입니다.

만약 마운트 하려는 장치(여기서는 /dev/sda7)가 XFS라는 타입으로 생성되어있다면?
당연히 3번 필드에는 ext3가 아닌 xfs 라고 넣으면 되는겁니다.. 
어때요.. 쉽죠?
파일시스템의 종류가 존나 많기 때문에 man페이지에서 vfstype 이라고 검색하면 알 수 있을듯~
만약 이 글을 보고나서도 파일시스템의 타입에 상관없이 책에서 봤던대로 걍 ext3를 쓰고싶은 사람은.. 
역시 이런일이 적성에 안맞는 시키가 되겠습니다..

2.4 4번필드 : defaults

파일시스템의 속성(?)을 선언하는 부분입니다.
그러니까... 예를들면.. 
파일시스템을 마운트할때 일반적으로 "읽기/쓰기"가 모두 가능하게 한다던가.. 
"쓰기"는 할 수 없고 "읽기"만 가능하도록 한다던가 하는... 
일단은 여기서는 각 속성에따른 결과만을 설명하고 뒤에가서 응용을 해보겠습니다.

* 기본속성 (아마 리눅스를 새로 설치하고 본다면 대부분 이렇게 설정이 되어있...)
default : 뭐.. 일반적인 사용에 무리가 없이 대부분의 긍정적인 성격의 기능을 할 수 있습니다.
읽고쓰기는 기본이고 실행이니 기타등등을 모두는 아니고 대부분 가능하게 해주는 형태입니다.

* 긍정적인 성격의 속성
rw : 마운트 했을때(이하생략) 파일을 읽기, 쓰기가 가능하게함
suid : 뭐.. 말그대로.. SetUID, SetGID 등의 사용이 가능하게함
exec : 실행권한을 가진 파일들의 실행이 가능하게함
quota : 유저별 용량제한 기능(quata)을 사용할 수 있도록함
이외에 옵션이 무지 많지만 굳이 여기에 다 넣을 필요가 없습니다.
우리가 사용하는것들중 대표적인것들만.. 물론 어떤 내용들이 있는지는 알고 있어야 합니다.

* 부정적인 성격의 속성
ro : 오로지 읽기만 가능하게.. 
nosuid : suid의 반대 -_-;
noexec : noexec의 반대 -_-;
noquota : 또 설명할까....? ㄷㅈ?

아무튼 이런 속성을 선언하게 되는데... 
여러가지 옵션을 한번에 줄수도 있습니다.
예를 들어 
/dev/hda6  /tmp  ext3  defaults,noexec,nosuid 0 0
이런식으로 말이죠...
4번 필드를 살펴보니 옵션이 세개나 붙어있지요?
defaults 속성이 갖는 내용이되, 실행파일의 실행과 suid를 사용하지는 못하게 한다는 의미입니다.

2.5 5번째 필드 : 0

0 입니다.. -_-;;;;
여기서부터는 기재된 내용만 가지구서는 뭔지 알길이 없죠.. 휴.. 
찍기의 달인이라 불리는 저도 당췌 이것만은 내용만보구서 감을 잡을수가 없었습니다.
정확한 명칭이 데비안은 아마도 <dump> 로 되어있었던가? -_-;;;
아무튼 dump 사용 여부를 결정하는 필드로서.. 
선언이 가능한 값은 0 과 1 뿐입니다.
네/아니오 가 되겠습니다.
그럼 이건 뭘 하겠다는거냐??
mysqldump가 가능해지는 파일시스템... 이 아니구... 
리눅스의 백업툴중 dump 라는 명령어가 있습니다.
우리가 사용하는 백업관련 명령어는 cp, rsync 정도가 되겠지만서두.. 
dump 명령에대한 사용은 각자 해보기로 하시고... 
우리가 많이 사용했던 cp, rsync가 파일단위의 컨트롤을 한다면.. 
이 dump라는 명령어는 파일시스템 자체를 컨트롤 할 수 있다는것입니다.

예를들면 /dev/sda7 장치의 파일시스템 자체를 다른곳에 예를들면 뭐 이미지형태(?)로 복사하는것이 가능합니다.
바로 이 dump 명령을 이용한 백업컨트롤을 가능하도록 해주는 옵션으로서.. 
우리는 걍 "0" 으로 해놓고 사용해도 무방합니다~

2.6 6번째 필드

후... 이것도 0이네요.... 
사실 5번째 필드는 관리자의 운영 스타일에 따라서 설정을 해도그만, 안해도 그만인 부분입니다만.. 
이것은 상황에 따라서 좀 거시기한 옵션입니다.
존나 오래켜놓은 서버를 리부팅하거나, 파일시스템에 오류가 박박 뜨면서 뒤진서버들 리부팅 했을때.. 
그리고 그 서버가 벌건 대낮에 뒤졌을때.. 우리는 서버룸에 뛰어가면서 무슨생각들을 할까요?
그중엔 "이거 파일시스템 체킹을 하는거 아냐?" 라는 질문이 반드시 포함되어 있을것입니다.
공포의 파일시스템 체킹... 
바로 마운트시에 파일시스템 체킹여부를 선언하는 부분입니다.
선언이 가능한 값은 0,1,2 가 있습니다.
0 : 체크하지 않음
1 : 존나 먼저 체크
2 : 1로 선언된 항목의 체크가 완료된 이후에 체크

바로 위에 소개한 서버가 뒤졌을때... fstab에 0으로 기록되었다면.. 체크를 하지 않고 바로 넘어갑니다~
문제는 1,2 를 가질때인데.. 
파일시스템을 체크하는 순서를 나타내줍니다.
이 항목이 1로 선언되어있는 장치를 가장먼저 체크하구... 
2로 선언된 장치는 1로 선언된 장치들의 체크가 끝난 다음 하겠다는 의미입니다.
참고로 우리가 사용하는 리눅스 배포본들은.. 
기본적으로 "/" 장치의 경우 대부분 "1"을 선언하고.. 
나머지 장치들에 대해서는 "2" 내지는 "0"을 줘버립니다... 
본 항목은 어떤 수치로 설정 하더라도 운영상의 영향을 미치지는 않습니다.

아까 공포의 파일시스템체크 라고는 했습니다만.. 
파일시스템체크 자체가 나쁜것은 아닙니다.. 부팅시에 시간을 많이 잡아먹을 수 있고.. 
이건 곧 시스템이 부팅완료시점이 늦어지면서 서비스 중지시간이 길어지기 때문에 그렇게 설명을 한 것 뿐입니다.
나중에 누가 파일시스템 체킹을 한다고 할 때, 괜히 옆에서 "야 공포의 파일시스템체크를 왜하니?" 라고 묻는 어처구니 없는 사태가 오지 않도록 합시다.
참고로 파일시스템 체킹은 fsck라는 명령어로 하는건데... 역시 이번내용과는 크게 상관이 없으니 각자 알아서;;;

3 예제

소개했던 제 서버의 /etc/fstab 파일 전체내용입니다.

/dev/sda2  /          ext3    defaults        1 1
/dev/sda1  /boot      ext3    defaults        1 2
devpts     /dev/pts   devpts  gid=5,mode=620  0 0
tmpfs      /dev/shm   tmpfs   defaults,noexec,nosuid 0 0
proc       /proc      proc    defaults        0 0
sysfs      /sys       sysfs   defaults        0 0
/dev/sda3  swap       swap    defaults        0 0
/dev/sda5  /tmp       ext3    defaults,noexec,nosuid 0 0
/dev/sda6  /var       ext3    defaults        0 0
/dev/sda7  /home      ext3    defaults        0 0
/dev/sdb1  /vpopmail  ext3    defaults        1 2
/dev/sdb2  /home2     ext3    defaults        1 2

음... 이제 각 항목의 설명도 했으니 대충 뭔내용인지는 알겠는데..
4번 필드가 남들과 다르게(?) 설정되어 있는것들이 보일 것입니다.
각 옵션들에대한 부분은 알아서들 찾으시고.. 너무 많아서.. ㅋ
그중 noexec, nosuid 라는 부정적인 옵션을 왜 굳이 줬느냐 라고 물으실 수 있겠습니다.
좀 다른 장치들 중에서.. /dev/shm, /tmp 에 걸려있...

말그대로.. 실행파일 실행불가, setuid사용불가 인데... 왜 필요 할까요?
바로 보안을 위해서 입니다.
나중에 확인을 해보시면 알겠지만 저 두개의 권한은 모두 "읽기/쓰기/실행하기"가 가능한 상태입니다.
그리고 널리 알려진 위치입니다.

그래서?
누구나 파일을 쓰는것이 가능하기 때문에 상당수 서버에 기본적으로 OPEN되어있는 80번포트(웹서버)를 이용한 공격성 스크립트의 업로드가 가능합니다.
이렇게 올린 파일은 분명 서버에 좋지못한 행위를 목적으로 제작이 되었기 때문에.. 때로는 치명적으로 작용할 수 있는것이지요.. 
저렇게 마운트를 해놓으면 공격성 스크립트를 올려놓더라도, 실행하는 것은 불가능합니다.
물론 다른 꼼수를 이용해서 실행이 가능합니다만... 
저렇게라도 해놓으면 악의적인 시도가 발생할때 그중 일부는 사전에 차단할 수 도 있는겁니다.

그렇게 보안에 도움이 되는거라면 다른 디렉토리도 다 그렇게하지? 라고 반문하신다면.. 
니가 운영하는 서버의 모든 장치에 다 저렇게 걸어놓고 다시 얘기하자.... 
라고 답변을 하고 싶군요.. 
한번 해보세요~



4 mount의 확인

설정된 /etc/fstab을 이용해서 mount 여부 확인
[root@ns1 tmp]#mount -a
[root@ns1 tmp]#
요것은 fstab에 정의된 모든 장치의 마운트를 한다는 의미입니다.
실행이자 곧 설정상황의 체크를 할 수 있습니다.

왜그런고하니... 
정상적으로 설정을 잘~ 한경우에는 위의 결과처럼 아무런 반응이 없이 프롬프트가 떨어집니다..

그런데 혹시 잘못입력했다면?

예를들어서 /home2에 사용될 장치가 /dev/sdb2 인데 오타를 내는바람에 sd2 라고 잘못 썼다고 가정해봅시다.. 
그리고 나서 실행해 보았다면..

[root@ns1 tmp]# mount -a
mount: special device /dev/sd2 does not exist

라고 에러를 출력합니다.. 
이건 절대로 그냥 넘어가면 안됩니다.

이상태에서 혹시라도 서버가 리부팅이 된다면... 살지 않습니다.. -_-;;;
장치를 마운트 해야하는데 그 장치를 찾을 수 없기 때문입니다.
물론 이런 경우에 대처를 할 수 있는 방법이 있지만서두... 지금 이글을 여기까지 읽는 너라면.. 
알려줘도 모르니까.. 시키는대로 하는게 좋아! OK?
반드시 수정을 해서 바로잡도록 합시다.

5 마무리

자.. 이걸로 fstab의 설명이 끝났습니다... 
존나 잼있었는지... ??
원래 본 내용은 짧고 간단하게 설명이 가능했는데.. 
쓰다보니.. 이렇게 길어졌네요.. 
방금 쓰면서도 내가 왜 이렇게 썼지? 하는 생각이 들곤 했습니다.
암튼 리눅스 설치도 덜덜 떨리시는 분들에게는 도움이 되었으면 좋겠네요...


반응형
반응형

create function get_optimizer_switch(switch_name char(32)) 

returns char(3) 

return substring_index(substring_index(substring(@@optimizer_switch from locate(switch_name,@@optimizer_switch)),',','1'),'=','-1'); 

 

 

 

select get_optimizer_switch('원하는 변수명'); 

 

 

select get_optimizer_switch('index_merge'); 



http://blog.naver.com/bomyzzang/220142393800



반응형
반응형

에러(Error)

TypeError: Object #<Socket> has no method 'set'

 

socket.io 1.0버전 부터 set과 get을 없애버렸다..... 응 뭐라고?? 

 

이번 버전 업그래이드로 좋지 않은 곳을 없애 버렸습니다.

아니 의사양반 이게 무슨 소리요...내가 ... 내가 고자라니  내가 넣고 빼고를 못한다니 ㅜㅜ

아아아아라알아라아악 이런 미친 무슨 소스코드를 밥먹듯이 바꿔 버전업한다면서 2013년도 책이 헌책방가도 안사주게 생겼sp...... 

무슨 니가  python3냐 아오 빡쳐 

 

이유가 저장공간을 안에다 두지 않겠다나 뭐라나....결론 없어졌다..... 

 

 

 

 

해결책 

: 만들자..... 아래의 함수를 복사붙여넣기 하고 사용하자 !

 

function Sockets(){

this.sockets={};

};

Sockets.prototype.set = function(id, data) {

  this.sockets[id] = data;

};

Sockets.prototype.get = function(id, callback) {

  if (this.sockets[id] !== undefined) {

      callback(true,this.sockets[id]);

    } else {

      callback(false,this.sockets[id]);

    }

};

 

 

 

 

사용방법

모던웹을 위한 node.js라는 책에 나오는 예제로 실험 삼아 만들어봤다. 사용방법은 이전과 비슷하다 대신 다른 점은

초반에 함수를 정의해줘야 한다...... 무슨 원리냐면 이게 "클로저"라고 클라이언트 정보를 저장하는 방법이라는데 connection이라는 이벤트 안에 정의가 되면 클라이언트 마다 다른 정보를 가지게 되기 때문에 이 방법을 사용할수 있는것이다. (제가 정의한 var sockets는 클라이언트 마다 다르게 정의가 되어있어서 저장값이 달라짐....)

 

var io = socketio.listen(server);

io.sockets.on('connection',function(socket){

var sockets = new Sockets();

socket.on("join",function(data){

socket.join(data);

sockets.set('room',data);

});

socket.on("message",function(data){

sockets.get('room',function(error,room){

io.sockets.in(room).emit('message',data);

});

});

});



http://blog.naver.com/fundoong/220153918215


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

aws fdisk  (0) 2015.02.05
optimizer_swtich 쿼리로 보기  (0) 2015.02.05
MariaDB 10 CONNECT Engine - A Better Way to Access External Data  (0) 2015.01.30
Warm-up InnoDB Buffer Pool 워밍업  (0) 2015.01.28
wireshark  (0) 2015.01.19
반응형

mariadb 에서 connect 엔진을 통해 csv 포맷의 로그 파일에 대한 빠른 접근을 지원해 주는 아티클이 있어 테스트 해보았습니다.

 

[테스트]

------------------------------------ mariadb ------------------------------------------

[root@localhost lib64]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 10.0.10-MariaDB MariaDB Server

Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

* connect 엔진 플러그인 인스톨

MariaDB [(none)]> install soname 'ha_connect';
Query OK, 0 rows affected (0.06 sec)

 

---------------------------------------------------------------------------------------------------


MariaDB [(none)]> install soname 'ha_connect';
ERROR 1126 (HY000): Can't open shared library '/usr1/maria/1010m/lib/plugin/ha_connect.so' (errno: 2, libodbc.so.1: cannot open shared object file: No such file or directory)

 

만약 connect 엔진 인스톨 시 위와 같은 에러가 난다면 리눅스 쉘에서 아래와 같이 처리해 주시면 됩니다.

 

[root@localhost maria]# yum install unixODBC
[root@localhost maria]# ln -s /usr/lib64/libodbc.so /usr/lib64/libodbc.so.1

---------------------------------------------------------------------------------------------------

 

* 설치 확인

MariaDB [(none)]> show plugins;
+-----------------------------+----------+--------------------+---------------+---------+
| Name                        | Status   | Type               | Library       | License |
+-----------------------------+----------+--------------------+---------------+---------+
.........................................................................................
.........................................................................................
.........................................................................................
| CONNECT                     | ACTIVE   | STORAGE ENGINE     | ha_connect.so | GPL     |
+-----------------------------+----------+--------------------+---------------+---------+

 

MariaDB [(none)]> drop database if exists kwon;
Query OK, 2 rows affected (0.15 sec)

 

MariaDB [(none)]> create database kwon;
Query OK, 1 row affected (0.00 sec)

 

* 테스트 테이블에 더미 데이터 적재

MariaDB [(none)]> create table kwon.test as select a.column_name from information_schema.columns as a cross join information_schema.columns as b limit 1000000;
Query OK, 1000000 rows affected (5.28 sec)

Records: 1000000  Duplicates: 0  Warnings: 0

 

* csv 로그성 파일 만들기

MariaDB [(none)]> select column_name into outfile '/data1/maria/test.csv' fields terminated by ',' from kwon.test;
Query OK, 1000000 rows affected (0.50 sec)

 

MariaDB [(none)]> exit
Bye

 

* 기본 test.csv 파일내용 중 500000 만번째 줄에 kwon 단어 추가하여 test1.csv 파일 만들기

[root@localhost maria]# sed '500000 i\kwon' /data1/maria/test.csv > /data1/maria/test1.csv

 

[root@localhost maria]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.0.10-MariaDB MariaDB Server

Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

* connect 엔진을 사용하여 csv 타입의 인덱스가 정의된 테이블만들기

MariaDB [(none)]> create table kwon.test1_csv (  column_name varchar(50) not null, key ( column_name ) ) engine=connect default CHARSET=UTF8 table_type=csv file_name='/data1/maria/test1.csv' header=0 quoted=1;
Query OK, 0 rows affected (1.46 sec)

 

* 테이블 정의와 동시에 바로 데이터 확인됨.

MariaDB [(none)]> select count(*) from kwon.test1_csv;

+----------+
| count(*) |
+----------+
|  1000001 | 
+----------+
1 row in set (1.13 sec)

 

* 백만건1건 중 1건 조회

MariaDB [(none)]> select * from kwon.test1_csv where column_name = 'kwon';
+-------------+
| column_name |
+-------------+
| kwon        |
+-------------+
1 row in set (0.00 sec)

 

* 실행계획

MariaDB [(none)]> explain extended select * from kwon.test1_csv where column_name = 'kwon';
+------+-------------+-----------+------+---------------+-------------+---------+-------+------+----------+--------------------------+
| id   | select_type | table     | type | possible_keys | key         | key_len | ref   | rows | filtered | Extra                    |
+------+-------------+-----------+------+---------------+-------------+---------+-------+------+----------+--------------------------+
|    1 | SIMPLE      | test1_csv | ref  | column_name   | column_name | 152     | const |    1 |   100.00 | Using where; Using index |
+------+-------------+-----------+------+---------------+-------------+---------+-------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

 

------------------------------------------------ mysql 과비교  -----------------------------------------

[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

mysql> create database if not exists kwon;

mysql> drop database if exists kwon;
Query OK, 0 rows affected (0.11 sec)

mysql> create database kwon;
Query OK, 1 row affected (0.00 sec)

mysql> create table kwon.test as select a.column_name from information_schema.columns as a cross join information_schema.columns as b limit 1000000;
Query OK, 1000000 rows affected (4.97 sec)
Records: 1000000  Duplicates: 0  Warnings: 0


mysql> select column_name into outfile '/data1/mysql/test.csv' fields terminated by ',' from kwon.test;
Query OK, 1000000 rows affected (0.43 sec)

mysql> exit
Bye
[root@localhost ~]# sed '500000 i\kwon' /data1/mysql/test.csv > /data1/mysql/test1.csv

[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create table kwon.test1_csv(column_name varchar(50) not null) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)

 

mysql> LOAD DATA INFILE '/data1/mysql/test1.csv' INTO TABLE kwon.test1_csv FIELDS TERMINATED BY ',';
Query OK, 1000001 rows affected (3.85 sec) (
Records: 1000001  Deleted: 0  Skipped: 0  Warnings: 0

 

mysql> create index ix__test1_csv__column_name__only__01 on kwon.test1_csv(column_name);
Query OK, 0 rows affected (3.92 sec)
Records: 0  Duplicates: 0  Warnings: 0

------------------------------------------------------------------------------------------------------

mysql> select count(*) from kwon.test1_csv;
+----------+
| count(*) |
+----------+
|  1000001 |
+----------+
1 row in set (0.41 sec)

mysql> select * from kwon.test1_csv where column_name = 'kwon';
+-------------+
| column_name |
+-------------+
| kwon        |
+-------------+
1 row in set (0.00 sec)

mysql> mysql> explain extended select * from kwon.test1_csv where column_name = 'kwon';
+----+-------------+-----------+------+--------------------------------------+--------------------------------------+---------+-------+------+----------+--------------------------+
| id | select_type | table     | type | possible_keys                        | key                                  | key_len | ref   | rows | filtered | Extra                    |
+----+-------------+-----------+------+--------------------------------------+--------------------------------------+---------+-------+------+----------+--------------------------+
|  1 | SIMPLE      | test1_csv | ref  | ix__test1_csv__column_name__only__01 | ix__test1_csv__column_name__only__01 | 52      | const |    1 |   100.00 | Using where; Using index |
+----+-------------+-----------+------+--------------------------------------+--------------------------------------+---------+-------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

 

결론 
csv 형태로 로그를 저장한 후 DB로 적재하여 분석할 이슈가 있는 경우는 활용도가 높을 것으로 보입니다. 
위 테스트 결과대로 mysql 과 mariadb 단순 처리 시간 비교하여 보았습니다.

MYSQL : 0.01 sec (테이블생성시간) + 3.85 sec ( load data 적재 시간 ) + 3.92 sec ( 인덱스 생성 시간 ) = 7.78 sec
MARIADB : 1.46 sec (한방에 끝!)

 

출처 : https://mariadb.com/blog/mariadb-10-connect-engine-better-way-access-external-data


http://cafe.naver.com/mysqlpg/388


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

optimizer_swtich 쿼리로 보기  (0) 2015.02.05
[socket.io] set get 대체법  (0) 2015.02.04
Warm-up InnoDB Buffer Pool 워밍업  (0) 2015.01.28
wireshark  (0) 2015.01.19
innodb 전체백업 / 증분백업  (0) 2015.01.08
반응형

[출처] Warm-up InnoDB Buffer Pool|작성자 bomyzzang

http://blog.naver.com/bomyzzang/220118755731


MySQL 5.6 새로운 기능 (Percona Server and MariaDB​ 지원)

 

InnoDB 설정 중 innodb_buffer_pool_size, 기본적으로 메모리에 InnoDB의 데이터와 인덱스를 저장하는 방식.

 

MySQL 서버를 재시작 할 경우, 버퍼-풀이 비어진 상태이기 때문에, 보통의 경우 버퍼의 워밍업에 약간의 시간이 소요됨.

 

이럴경우, 사용하는 방식이다.

 

 

1. mysql>  SET GLOBAL innodb_buffer_pool_dump_at_shutdown = 1;

 

MySQL 서버를 재기동하기 전에 해당 명령어 사용, shutdown 할 경우, 버퍼-풀 덤프 받음.

 

MySQL 서버를​ 중지할 때, ib_buffer_pool 이라는 파일이 MySQL의 DATADIR 에 생성되어짐.

 

 

 

2. ( my.cnf 설정 추가)  

 

[mysqld]

innodb_buffer_pool_dump_at_shutdown = 1

innodb_buffer_pool_load_at_startup = 1 

 

 

3. MySQL 재기동 (mysql.err 로그 확인 또는 status 확인)

 

2014-09-11 14:18:24 7fba24d5a700 InnoDB: Loading buffer pool(s) from /data/mysql_data/ib_buffer_pool

2014-09-11 14:18:24 7fba24d5a700 InnoDB: Buffer pool(s) load completed at 140911 14:18:24 

 

 ​mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

+--------------------------------+------------------------+

| Variable_name                                    | Value                                 |

+--------------------------------+------------------------+

| Innodb_buffer_pool_load_status            | Loaded 5121/6441 pages     |

+--------------------------------+------------------------+

1 row in set (0.00 sec)

 

mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

+--------------------------+-----------------------------------------+

| Variable_name                         | Value                                                               |

+--------------------------+-------------------------- --------------+

| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 140911 14:18:24 |

+--------------------------+-----------------------------------------+

 

 

4. innodb_buffer_pool_dump_now ,innodb_buffer_pool_load_now.​ 사용하여

 

재기동 없이 즉시 버퍼-풀 적용하는 방법

 

 

 

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 3

Server version: 5.6.19-log MySQL Community Server (GPL)

 

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

mysql> show global variables like "innodb_buffer_pool_dump_now";

+-----------------------------+-------+

| Variable_name                              | Value    |

+-----------------------------+-------+

| innodb_buffer_pool_dump_now       | OFF      |

+-----------------------------+-------+

1 row in set (0.00 sec)

 

mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

+--------------------------------+--------------------------------------------------+

| Variable_name                                    | Value                                                                               |

+--------------------------------+--------------------------------------------------+

| Innodb_buffer_pool_load_status            | Buffer pool(s) load completed at 140911 14:57:18                |

+--------------------------------+--------------------------------------------------+

1 row in set (0.00 sec)

 

mysql> set global innodb_buffer_pool_dump_now = on ;

Query OK, 0 rows affected (0.00 sec)

 

mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';

+--------------------------------+--------------------------------------------------+

| Variable_name                                    | Value                                                                               |

+--------------------------------+--------------------------------------------------+

| Innodb_buffer_pool_dump_status          | Buffer pool(s) dump completed at 140911 14:58:05              |

+--------------------------------+--------------------------------------------------+

1 row in set (0.00 sec)

 

mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

+--------------------------------+--------------------------------------------------+

| Variable_name                                    | Value                                                                               |

+--------------------------------+--------------------------------------------------+

| Innodb_buffer_pool_load_status            | Buffer pool(s) load completed at 140911 14:57:18                |

+--------------------------------+--------------------------------------------------+

1 row in set (0.00 sec)

 

mysql> set global innodb_buffer_pool_load_now = on ;

Query OK, 0 rows affected (0.00 sec)

 

mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

+--------------------------------+--------------------------------------------------+

| Variable_name                                    | Value                                                                               |

+--------------------------------+--------------------------------------------------+

| Innodb_buffer_pool_load_status            | Buffer pool(s) load completed at 140911 14:58:41                |

+--------------------------------+--------------------------------------------------+

1 row in set (0.00 sec)

 




반응형

'연구개발 > MYSQL' 카테고리의 다른 글

[socket.io] set get 대체법  (0) 2015.02.04
MariaDB 10 CONNECT Engine - A Better Way to Access External Data  (0) 2015.01.30
wireshark  (0) 2015.01.19
innodb 전체백업 / 증분백업  (0) 2015.01.08
MySQL 5.6.5-m8 x86_64 튜닝  (0) 2015.01.07
반응형

http://sqlsql.tistory.com/359

반응형
반응형

nnodb 엔진을 사용할 경우 가능한 mysqldump를 이용한 전체 백업 및 binarylog를 이용한 증분백업 스크립트 입니다.
------------------------
/mysql
/mysql_data
/mysql_data/backup
/logs/mysql_logs
------------------------
전체백업 일요일 00시
증분백업 매일 00
---------------------------------------------------------------------
vi mysql-all-backup.sh
#!/bin/sh
datetime=$(date +%Y_%m_%d)
cd /mysql
./bin/mysqldump --user=root --password="pass123@#" --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-log > /mysql_data/backup/backup_sunday_$datetime.sql
tar cvzf /mysql_data/backup/backup_sunday_$datetime.tar.gz /mysql_data/backup/backup_sunday_$datetime.sql
rm -rf /mysql_data/backup/*.sql
---------------------------------------------------------------------
vi mysql-incremental-backup.sh
#!/bin/sh
datetime=$(date +%Y_%m_%d)
cd /mysql
./bin/mysqladmin --user=root --password="pass123@#" flush-logs
tar cvzf /incross/mysql_data/backup_$datetime.tar.gz /logs/mysql_logs/*bin*
find /logs/mysql_logs -name "*bin.??????" -mtime +1 -exec rm -rf {} \;
---------------------------------------------------------------------
chmod 755 mysql-all-backup.sh
chmod 755 mysql-incremental-backup.sh
chown -R mysql:mysql mysql-all-backup.sh
chown -R mysql:mysql mysql-incremental-backup.sh
---------------------------------------------------------------------
[root@BACKUP]# crontab -e
#00 01 * * * /usr/bin/rdate -s time.bora.net && /sbin/clock -w
00 00 * * 0 /incross/mysql_data/mysql-all-backup.sh./
00 00 * * 1-6 /incross/mysql_data/mysql-incremental-backup.sh


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

Warm-up InnoDB Buffer Pool 워밍업  (0) 2015.01.28
wireshark  (0) 2015.01.19
MySQL 5.6.5-m8 x86_64 튜닝  (0) 2015.01.07
order by rand 쿼리 튜닝  (0) 2015.01.07
InnoDB buffer pool Hit rate  (0) 2015.01.07
반응형
# 이 파일은 MySQL 5.6.5-m8 x86_64 기준으로 작성되었습니다.
# 저장소에서 구하실 수 있습니다. https://github.com/HyunSeungBum/sbhyun_config.git
# cd /usr/local
# chgrp mysql -R mariadb5.5; cd mariadb5.5
# mkdir logs tmp
# chown maria.maria logs; chown maria.maria tmp
# chown maria.maria -R data
# cd data
# mkdir InnoDB; mkdir InnoDB/redoLogs; mkdir InnoDB/undoLogs
# chown maria.maria -R InnoDB

[mysqld]
##--------------------------------------------------------------------
# mysqld 의 기본 설정들.
##--------------------------------------------------------------------
# id 는 1 에서 2^32 -1 개 사이에 유일한 값이여 한다.
# server-id 는 복제 그룹을 구성할 경우에 중복된 값이여서는 않된다.
# 단일 시스템일 경우 기본값 1 이면 충분하다.
server-id = 1

# 서버를 구동할 시스템 사용자 지정.
user = mysql

basedir = /usr/local/mariadb5.5
# 이 디렉토리의 소유권과 그룹은 user 에서 지정한 사용자와 그룹이어야 한다.
datadir = /usr/local/mariadb5.5/data
# 이 디렉토리는 Mysql 서버가 내부적 작업을 할때 임시로 사용하게 된다.
# 예를들어 대량의 select 처리를 위해서 임시 테이블을 만들거나 할 경우에 여기에 임시로 파일이 생성될 수 있다.
tmpdir  = /usr/local/mariadb5.5/tmp
socket  = /usr/local/mariadb5.5/tmp/mysql.sock
pid-file = /usr/local/mariadb5.5/data/mysqld.pid
# 외부 락킹(locking), 시스템 락킹, 을 사용하지 않도록 한다. 이 설정은 오직 MyISAM 테이블에 접근할때만 영향을 준다.
skip-external-locking

# 문자셋 지정.
character-set-server = utf8
collation-server = utf8_general_ci

# 기본 스토리지 엔진.
# MySQL 서버가 지원하는 스토리지 엔진중에 하나를 선택할 수 있다.
# 서버가 지원하는 스토리지 엔진은 'SHOW ENGINES' 명령어를 이용해 확인 가능하다.
default-storage-engine  = Aria

# 트랜잭션 레벨을 지정합니다.
# 레코드 기반 Replication 을 할려면 READ-COMMITED
# 기본 값으로 REPEATABLE-READ 사용.
transaction-isolation = REPEATABLE-READ

##--------------------------------------------------------------------
# Network 설정.
##--------------------------------------------------------------------
# 서버 포트 지정.
port = 3306

# 서버에 접속한 클라이언트 확인을 위해서 IP를 가지고 클라이언트의 도메인을 찾는 것을 방지한다.
# 이것을 사용하면 서버에 접속가능한 클라이언트를 정의할때에 Host 필드에 도메인을 사용하면 않되며
# IP만 사용해야 한다. 대신 클라이언트의 도메인을 찾는 작업이 없기 때문에 성능상에 이점이 있다.
skip-name-resolve

# MariaDB ThreadPool
thread_handling = pool-of-threads
thread_pool_size = 32
thread_pool_max_threads = 1024
thread_pool_idle_timeout = 10

# 최대 동시 접속 연결을 지정. 무턱대고 크게 잡을게 아니라 적절하게 잡아야 한다.
# 이 값을 초과하면 "Too many connections error" 메시지를 보여준다.
# Dynamic 설정을 할수 있다. SET GLOBAL max_connections = 300
max_connections = 300

# MySQL 서버에 접속하는 사용자 계정별 최대 동시접속 수. 기본값은 0(Unlimited) 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL max_user_connections = 1024
max_user_connections = 0

# MySQL 서버에 접속한 클라이언트들은 다양한 에러를 발생시킨다. 서버는 이러한 클라이언트별 오류 갯수를 카운팅해 놓는데,
# 만일 클라이언트가 일정한 카운팅을 넘어서면 서버는 클라이언트의 접속을 차단한다.
# 클라이언트가 발생시킬 수 있는 에러의 한계치를 조정하기 위한 설정이다. 기본 값은 10 이다.
# 이 카운터에 도달하면 "Host [client] is blocked because of many connection errors" 에러를 발생시킨다.
# Dynamic 설정을 할수 있다. SET GLOBAL max_connect_errors = 1000000
# 이 카운터의 초기화는 FLUSH HOSTS 해주면 된다.
max_connect_errors = 1000000

# 접속한 클라이언트가 아무런 일을 하지 않을 경우에 차단할 시간. 단위는 초이며 기본값은 28800초(8시간)이다.
# 웹에 붙여서 사용할 경우에 대부분의 30초 내외로 웹서버의 커넥션 타임이 정해져 있기 때문에 기본값은 매우 큰 값이라고 할 수 있다.
# Dynamic 설정을 할수 있다. SET GLOBAL wait_timeout = 600
wait_timeout = 600

# 비활성 상태에서 활성상태가 될때까지 대기시간.(seconds to waits for activity on interactive connection)
# 이것은 오직 MySQL API 중에 mysql_real_connect() 함수를 사용하는 애플리케이션에만 적용된다. 단위는 초이며 기본값은 600 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL interactive_timeout = 600
interactive_timeout = 600

# 'Bad handshake'로 응답하기전 패킷접속을 기달리는 시간.
# "Lost connection to MySQL server at 'XXX', system error: errno" 메시지가 자주 보인다면 이 값을 증가시켜줄 필요가 있다.
# 단위는 초, 기본값은 10 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL connect_timeout = 10
connect_timeout = 10

# 클라이언트에서 서버로 보내는 쿼리는 단 한개의 패킷으로 처리된다. 만일 서버로 보내는 쿼리의 크기가 이 값보다 작다면 늘려줘야 한다.
# 특히 테이블 컬럼에 BLOB 타입을 사용할 경우, 그림같은 바이너리 값, 이 값을 증가시켜줄 필요가 있다.
# 단위는 byte, 기본값은 1048576(1MB) 이다. 한계값은 1GB 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL max_allowed_packet = 1048576
max_allowed_packet = 33554432

##--------------------------------------------------------------------
# Logging
##--------------------------------------------------------------------

# 제너럴 쿼리 로그(general query log)와 슬로우 쿼리 로그(slow query log)의 출력 목적지를 결정한다.
# 이 옵션은 다른 어떤 옵션들을 덮습니다. 이 값이 NONE 이라면 다른 옵션에서 로그기록을 설정했어도 로그는 기록되지 않습니다.
# Dynamic 설정을 할수 있다. SET GLOBAL log_output = FILE
log_output = FILE

# Aborted connection.. 과 같은 경고를 error 로그에 씁니다. 리플리케이션을 사용할 경우 이 옵션의 사용을 권장합니다.
# 기본값은 1.
# Dynamic 설정을 할수 있다. SET GLOBAL log_warnings = 131072
log_warnings = 1

# 에러나 시작 메시지 로그 파일을 지정.  파일명을 지정하지 않을 경우 host_name.err 를 사용하며 확장자를 지정하지 않으면 .err 를 붙인다.
# 기본값은 없으며 Dynamic 설정을 할 수 없다.
log_error = /usr/local/mariadb5.5/logs/mysqld_error.log

# 제너럴 쿼리 로그(general query log) 의 사용 유무를 결정. log_output 값이 NONE 이라면 이 값은 무시됩니다.
# 기본값은 0(0)
# Dynamic 설정을 할수 있다. SET GLOBAL log_output = 0
general_log = 0

# 모든 쿼리를 로그로 기록하기위한 파일을 지정. 쿼리로그 혹은 제너럴 로그라고 한다.
# 파일명을 지정하지 않으면 host_name.log 가 된다.
# Dynamic 설정을 할수 있다. SET GLOBAL general_log_file = /usr/local/mariadb5.5/logs/general_query_all.log
general_log_file = /usr/local/mariadb5.5/logs/general_query_all.log

# "OPTIMIZE TABLE, ANALYZE TABLE, and ALTER TABLE" 과 같은 관리명령에 대해서도 slow query 를 남길지 결정
# 기본값은 0
# Dynamic 설정이 아니다.
log-slow-admin-statements = 1

# 인덱스를 타지 않는 Full Scan 과 같은 쿼리에 대해서 로깅을 한다.
# 기본값 0
# Dynamic 설정을 할수 있다. SET GLOBAL log-queries-not-using-indexes = 1
log-queries-not-using-indexes = 1

# 슬로우 쿼리 로그를 기록할지 말지를 결정. log_output 값이 NONE 이라면 이 값은 무시됩니다.
# 기본값 0
# Dynamic 설정을 할수 있다. SET GLOBAL slow_query_log = 0
slow_query_log = 1

# 슬로우 쿼리를 기록할 시간을 지정. 이 시간보다 크면 기록된다.
# 값은 0 ~ 10 사이이다.
# 기본값은 10.
# Dynamic 설정을 할수 있다. SET GLOBAL long_query_time = 1
long_query_time = 2

# 슬로우 쿼리 로그 파일 지정.
# 로그 파일명을 명시하지 않으면 host_name-slow.log 로 됩니다.
# Dynamic 설정을 할수 있다. SET GLOBAL slow_query_log_file = /usr/local/mariadb5.5/logs/slow_query.log
slow_query_log_file = /usr/local/mariadb5.5/logs/slow_query.log

##--------------------------------------------------------------------
# 캐쉬와 메모리
##--------------------------------------------------------------------
# 재사용을 위한 쓰레드를 서버가 얼마나 가지고 있어야 하는 지정하는 것.
# 클라이언트가 접속요청을 하면 서버는 이를 처리할 프로세스로 쓰레드를 생성한다. 접속이 완료되면 모든 작업들도 이 쓰레드를 통해서 이루어진다.
# 만일 클라이언트가 모든 작업을 끝마치고 접속을 해제하면 쓰레드는 파기되어야 하지만 재사용을 하기 위해서 이를 보관해 둔다.
# 동시접속자가 많을수록 이값을 늘려줄 필요가 있지만, 메모리 사용량도 증가할 수 있다.
# 기본값은 0.
# Dynamic 설정을 할수 있다. SET GLOBAL thread_cache_size = 52
thread_cache_size = 52

# 모든 쓰레드가 열어 캐쉬할 수 있는 테이블 개수. 이값을 증가시면 mysqld 는 file descriptors 를 증가 시킨다.
# 기본값은 400.
# Dynamic 설정을 할수 있다. SET GLOBAL table_open_cache = 400
table_open_cache = 400

# 이 값은 Memory 스토리지 엔진에도 영향을 준다. 이 변수의 값은 Memory 스토리지 엔진에서 MAX_ROWS 값을 계산해 사용하기도 한다.
# 또, MySQL 서버가 쿼리를 처리하기 위해서 종종 사용하는 임시 테이블은 메모리에 생성되기도 한다.
# 이때 생성되어지는 테이블은 Heap 테이블이라하는데, tmp_table_size 값과 함께 내부 Heap 테이블의 크기 제한에 영햐을 준다.
# 단위는 byte. 기본값은 16777216(16MB) 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL max_heap_table_size = 16777216
max_heap_table_size = 33554432

# 메모리에 생성되어지는 임시 테이블 크기의 최대 값. 메모리에 생성되는 테이블의 크가 이 값을 넘어서면 MySQL은 디스크에 MyISAM 테이블로 변환한다.
# 쿼리에 GROUP By 가 많고 메모리가 충분하다면 이 값을 증가시킬 필요가 있다.
# 이 값은 사용자가 생성하는 Memory 테이블에는 영향을 주지 않는다.
# 단위는 Byte. 기본값은 시스템에 의존적이다.
# SHOW GLOBAL STATUS 에서 'Created_tmp_disk_tables' 와 'Created_tmp_tables' 에 대한 통계정보를 볼 수 있다.
# Dynamic 설정을 할수 있다. SET GLOBAL tmp_table_size = 524288
tmp_table_size = 524288

# 각 섹션에서 정렬을 위해서 할당되는 버퍼의 크기. 이 값은 어떤 스토리지 엔진에서도 특화된것이 아닌, 최적화를 위해 일반적인 값이다.
# SHOW GLOBAL STAUS 에서 초당 'Sort_merge_passes' 값이 많이 보인다면 쿼리를 개선하거나 인덱싱을 개선하는 대신에 이 값을 늘려보는 것도 좋다.
# 그러나 2MB 이상 세팅하는 것은 권장하지 않으며 대부분 64KB ~ 512KB 사이가 적당하다.
# 단위는 Byte. 기본값은 2MB 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL sort_buffer_size = 2097144
sort_buffer_size = 131072

# MyISAM 테이블에 대해서 각 쓰레드가 sequentail scan 을 할때에 이 값의 크기만큼 버퍼를 각 할당한다.
# sequentail scan 이 자주 발생하면 이 값을 증가시킬 필요가 있다.
# 단위는 Byte. 기본값은 131072 (128K) 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL read_buffer_size = 16777216
read_buffer_size = 131072

# MyISAM 테이블로부터 Key-sorting 정렬에 의한 데이터를 레코드에서 읽을때에 디스크에서 찾는것을 피하기 위해서 이 버퍼를 사용한다.
# ORER BY 를 많이 사용한다면 이 값을 증가시키면 성능향상이 있을 수 있다.
# 단위는 Byte. 기본값은 262144(256K) 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL read_rnd_buffer_size = 131072
read_rnd_buffer_size = 131072

# 최소값. index scans, range index scans 등을 계획하거나 조인하는데 index를 사용하지 못하고 풀 테이블 스캔을 조인을 해야할 경우에 사용되어 진다.
# 인덱스를 추가해 조인을 할 수 없는 풀 조인을 해야한다면 이 값을 증가시킴으로써 보다 빠른 결과를 얻을 수 있다.
# 단위는 Byte.
# Dynamic 설정을 할수 있다. SET GLOBAL join_buffer_size = 131072
join_buffer_size = 131072

# 쿼리의 결과를 캐슁하기위한 메모리 양. 문장과는 달리 쿼리를 자체를 캐싱하는게 아니라 그 결과를 캐싱한다.
# 쿼리 결과를 캐슁하는 것이 때문에, INSERT, UPDATE, DELETE가 많이 일어나는 서버에는 크게 설정할 필요가 없다.
# 단위는 Byte. 초기값은 0(disable). 128MB 이상 설정하지 않는것이 좋다. 복제서버에서 Select 만할 경우 128MB 이상 설정도 가능.
# SHOW VARIABLES LIKE 'query_cache_size' 로 확인 가능.
# Dynamic 설정을 할수 있다. SET GLOBAL query_cache_size = 131072
query_cache_size = 54525952

# 한 쿼리당 결과를 캐쉬되는 양을 제한한다. query_cache_size는 쿼리 결과 개쉬를 위한 전체 메모리 양을 말하며
# query_cache_limit 는 각 쿼리당 캐쉬할 결과의 양을 의미한다. 이 값보다 큰 쿼리 결과는 캐싱하는 않는다는 뜻.
# 단위는 Byte. 초기값은 1048576(1M).
# Dynamic 설정을 할수 있다. SET GLOBAL query_cache_limit = 131072
query_cache_limit = 2097152

##--------------------------------------------------------------------
# MyISAM 
##--------------------------------------------------------------------

# MyISAM 테이블의 인덱스 블록(Index blocks)은 버퍼되어지고 모든 쓰레드에 공유된다.
# 이 인덱스 블럭은 버퍼하기위한 메모리 양이다. 데이터베이스 전용 서버에 MyISAM 엔진만 사용할 경우
# 전체 메모리의 25%를 할당해도 된다.
# 단위는 Byte. 초기값은 8388608(8MB)
# Dynamic 설정을 할수 있다. SET GLOBAL key_buffer_size = 131072
key_buffer_size = 33554432

# bulk insert 는 INSERT ... SELECT, INSERT ... VALUES (..),(..),... , LOAD_DATA_INFILE 등을 말합니다.
# 이때 사용되는 버퍼를 사용해서 속도를 높일 수 있습니다.
# 단위는 Byte. 초기값은 8388608 (8MB)
# Dynamic 설정을 할수 있다. SET GLOBAL bulk_insert_buffer_size = 131072
bulk_insert_buffer_size = 33554432

# CREATE INDEX, ALTE TABLE 등으로 인덱스를 생성하거나 REPAIR_TABLE 하는데에 인덱스 정렬이 필요할때에 필요한 버퍼.
# 단위는 Byte. 초기값은 8388608 (8MB)
# Dynamic 설정을 할수 있다. SET GLOBAL myisam_sort_buffer_size = 131072
myisam_sort_buffer_size = 2097152

# REPAIR_TABLE, ALTER_TABLE, LOAD_DATA_INFILE 중에 MyISAM 인덱스를 재생성해야 할 경우에 허용할 임시 파일 최대값.
# 단위는 Byte. 초기값은 2147483648 (2GB)
# Dynamic 설정을 할수 있다. SET GLOBAL myisam_max_sort_file_size = 131072
myisam_max_sort_file_size = 2147483648

# 예기치 못한 서버의 중단으로 서버가 재시작되었을때에 리커버리를 할지 결정하는 옵션.
# 0, DEFAULT, BACKUP, FORCE, QUICK 값을 콤마(,)로 나열해서 사용할 수 있다.
# 기본값은 0. 값을 주지 않으면 DEFAULT 이다.
# Dynamic 설정을 할 수 없다.
myisam_recover_options = DEFAULT

##--------------------------------------------------------------------
# InnoDB behavior
##--------------------------------------------------------------------

# InnoDB 테이블서 사용할 파일 포맷을 지정.
# 기본값 Antelope
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_file_format = Barracuda
innodb_file_format = Barracuda

# InnoDB의 백그라운드 쓰레드인 I/O 쓰레드의 읽고 쓰기 쓰레드의 갯수를 정합니다.
# innodb_read_io_threads 기본값 4
# innodb_write_io_threads 기본값 4
# Dynamic 설정을 할 수 없다.
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# "SHOW TABLE STATUS", "SHOW INDEX" 나 INFORMATION_SCHEMA의 테이블이나 통계를 InnoDB 업데이트 합니다.
# 이 변수를 Disable 하게되면 큰 테이블이나 인덱스 스키마에 대한 접근 속도를 높일 수도 있습니다.
# 이 변수를 Enable 하면 쿼리 플랜을 개선하는 도움을 줍니다.
# 기본값은 1
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_stats_on_metadata = 1
innodb_stats_on_metadata = 1

# dirty pages 의 퍼센티지를 넘지 않기 위해서 InnoDB는 buffer pool을 데이터 플러쉬(flush)를 시도합니다.
# 말 그래도 innodb 에서 dirty pages 의 퍼센티지.
# 기본값은 75
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_max_dirty_pages_pct = 75
innodb_max_dirty_pages_pct = 90

# InnoDB의 apaptive hash index 를 사용여부 결정.
# adaptive hash index 기능은 몇몇 workload 에서 유용함.
# 기본값은 1
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_adaptive_hash_index = 75
innodb_adaptive_hash_index = 1

# InnoDB buffer pool 에서 dirty pages 를 플러쉬하는 비율을 다이나믹하게 조절할지 마지 결정.
# 버스트 I/O 활동을 피하기위한 목적으로 다이나믹하게 조절하는 것.
# 기본값 1
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_adaptive_flushing = 75
innodb_adaptive_flushing = 1

# 특정 조건에 대해서 경고보다 에러를 리턴할지를 결정. strict SQL mode 와 유사합니다.
# 기본값 0
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_strict_mode = 1
innodb_strict_mode = 1

# insert buffer 로부터 데이터를 머지(merge)하거나 buffer pool로부터 페이지를 플러쉬(flush)와 같은
# InnoDB 백그라운드 태스크에 의해서 실행될때에 I/O 활성에 상계치(An upper limit) 설정.
# 기본값 200
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_io_capacity = 200
innodb_io_capacity = 600

# auto-increment 값을 생성하는데 사용할 lock mode 결정.
# 기본값은 1
# Dynamic 설정을 할 수 없다.
innodb_autoinc_lock_mode = 1

# INSERT 가 발생되면 보조 인덱스가 바로 반영되지 않고 메모리에 버퍼링 되는데 이을 사용할지 말지를 결정.
# 최근에는 inserts, deletes, purges, changes, all, none 으로 설정할 수 있게 됐다.
# 기본값은 all.
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_change_buffering = inserts
innodb_change_buffering = inserts

# 이 값은 설명하기 어렵다. 뭐가 뭔지...
innodb_old_blocks_time = 500

##--------------------------------------------------------------------
# InnoDB base
##--------------------------------------------------------------------

# InnoDB 가 테이블이나 인덱스 데이터를 캐쉬하기위한 메모리 영역에 버퍼 풀 사이즈.
# 이 값을 크게 잡으면 디스크 I/O를 줄여준다.
# InnoDB 전용 서버라면 물리적 메모리의 80%를 할당해도 된다.
# 기본값 134217728 (128MB)
# Dynamic 설정을 할 수 없다.
innodb_buffer_pool_size = 1073741824

# 모든 InnoDB 데이터 파일의 위치를 지정.
innodb_data_home_dir = /usr/local/mariadb5.5/data/InnoDB

# 개별적인 InnoDB 데이터 파일과 그 크기를 지정.
# 기본값은 10MB 크기에 파일명은 ibdata1 이다.
innodb_data_file_path = ib_data:100M:autoextend

# 기본적으로 InnoDB는 시스템 테이블 스페이스로 불리우는 곳에 모든 테이블이 생성된다.
# 이 값을 활성화하면 시스템 테이블 스페이스 대신 데이터와 인덱스를 별도의 파일에 저장한다.
# 확장자는 .ibd
# 기본값은 0
# 이 기능은 5.6.1 이상에서 지원한다.
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_file_per_table = 1
innodb_file_per_table = 1

# InnoDB 시스템 테이블 파일이 꽉차면 자동으로 확장하는데, 확장하는 사이즈 크기를 지정.
# 기본값은 8 MB 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_autoextend_increment = 10MB
innodb_autoextend_increment = 10MB

# InnoDB redo log 파일의 생성될 디렉토리 지정. 생성되는 파일의 갯수는 innodb_log_files_in_group 에서 지정.
# InnoDB 로그 값을 지정하지 않으면 5MB 크기의 ib_logfile0, ib_logfile1 두개 생성된다.
# Dynamic 설정을 할 수 없다.
innodb_log_group_home_dir = /usr/local/mariadb5.5/data/InnoDB/redoLogs

# InnoDB 셧다운 모드 설정. 이 값을 0 이라면 InnoDB는 풀 퍼지, insert 버퍼를 머징 하는 슬로우 다운이 됩니다.
# 기본값은 1
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_fast_shutdown = 1
innodb_fast_shutdown = 0

# 로그 그룹에 로그파일 갯수를 지정.
# 기본값 2
# Dynamic 설정을 할 수 없다.
innodb_log_files_in_group = 4

# 로그 그룹에 각 로그 파일의 사이즈를 결정. 1MB에서부터 innodb_buffer_pool_size/innodb_log_files_in_group 나온 값까지 설정하는게 좋다.
# 기본값은 5MB
# Dynamic 설정을 할 수 없다.
innodb_log_file_size = 268435456

# 로그 버퍼를 위한 사이즈 지정. 많이 할당할 필요가 없다.
# 기본값 8388608 (8MB)
# Dynamic 설정을 할 수 없다.
innodb_log_buffer_size = 16777216

# XA 트랜잭션에서 two-phase commit 를 지원할지를 결정.
# 오직 하나의 쓰레드로 데이터변화를 수행한다면 이 옵션을 꺼두는게 좋다.
# 기본값 TRUE
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_support_xa = TRUE
innodb_support_xa = FALSE

# InnoDB 는 OS 동시성 쓰레드를 주어진 값만큼 유지한다.
# 주어진 값에 쓰레드 갯수가 도달하면 실행을 위해서 FIFO 큐에 대기 상태로 놓인다.
# 기본값은 0 (infinite concurrency)
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_thread_concurrency = 1
innodb_thread_concurrency = 0

# InnoDB transaction 이 row lock 에 대해서 포기하전에 기다리는 시간.
# 기본값 50. 단위는 초(second)
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_lock_wait_timeout = 50
innodb_lock_wait_timeout = 60

# InnoDB에서 트랜잭션이 커밋될때마다 로그를 디스크에 쓸건지 말지 결정.
# 기본값 1
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_flush_log_at_trx_commit = 1
innodb_flush_log_at_trx_commit = 1

# MySQL 서버가 시작할때에 InnoDB를 복구를 수행하는데, 잘 않되면 서버가 구동되지 않는다.
# 이때에 이 값을 지정하고 서버를 시작하면 각 숫자에 맞는 복구를 시행하게 된다.
# 0 이면 복구를 수행하지 않는다.
# 기본값 1
# Dynamic 설정을 할 수 없다.
innodb_force_recovery = 0

# 디스크 쓰기를 할때에 운영체제에 버퍼운영을 무엇으로 할지를 결정.
# 기본값 fdatasync
# Dynamic 설정을 할 수 없다.
innodb_flush_method = O_DIRECT

# 이 기능을 켜면 InnoDB는 데이터를 두번 저장함. 첫째로 doublewrite buffer,
# 두번째에 실제로 data files 쓴다.
# 기본값 1
# Dynamic 설정을 할 수 없다.
innodb_doublewrite = 1

# 쓰레드가 서스펜드되기전에 InnoDB 뮤텍스가 해제되기어질때까지 쓰레드가 기다리는 시간.
# 기본값 30
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_sync_spin_loops = 20
innodb_sync_spin_loops = 20

# autocmmit = 0 일 경우 InnoDB 는 "LOCK TABLES"를 존중한다.
# 만약 이 값을 활성화하면 autocmmit =0 인 상태에서 "LOCK TABLES" 명령어는
# 내부적으로 InnoDB는 테이블을 락(lock) 한다.
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_table_locks = 1
innodb_table_locks = 1

# InnoDB 큐를 조이닝하기전에 InnoDB 쓰레드를 얼마나 잠재울 것인지 설정.
# 기본값은 10000, 단위는 microseconds
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_thread_sleep_delay = 10000
innodb_thread_sleep_delay = 1000

# purge 연산이 꾸물거릴때에 INSERT, UPDATE, DELETE 연산을 얼마나 지연시킬건지를 설정.
# 기본값은 0, 단위는 millisconds 이다.
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_max_purge_lag = 10000
innodb_max_purge_lag = 0

# 동시에 커밋할수 있는 쓰레드 개수. 0 은 제한을 두지 않는다.
# 기본값은 0
# 이 설정은 런타임에서 0 에서 다른 값으로 변경할 수 없다.
# 0이 아닌 값을 0으로 런타임으로 변경할 수 있다.
# 제한적으로 Dynamic 설정을 할수 있다. SET GLOBAL innodb_commit_concurrency = 100
innodb_commit_concurrency = 0

# InnoDB 가 동시성으로 들어갈수 있는 쓰레드의 갯수.
# 기본값은 500
# Dynamic 설정을 할수 있다. SET GLOBAL innodb_concurrency_tickets = 500
innodb_concurrency_tickets = 500

##--------------------------------------------------------------------
# mysqldump
##--------------------------------------------------------------------
[mysqldump]

# 테이블을 덤프할때에는 MySQL 서버는 메모리 버퍼링을 사용합니다. 하지만 큰 테이블을 덤프할때에 메모리 버퍼링을 사용하면 문제가 될 수 있습니다.
# 이 메모리 버퍼링을 끄기 위해서 다음과 같이 합니다.
# 기본은 메모리 버퍼링 사용하기 입니다.
quick

# 서버와 클라이언트간 통신에 사용할 최대 버퍼 사이즈.
# 기본값 1GB
max_allowed_packet = 33554432

##--------------------------------------------------------------------
# mysql console
##--------------------------------------------------------------------
[mysql]

# mysql 에서 사용할 기본 언어셋 지정.
default-character-set = utf8

# MySQL 에서도 리눅스의 명령해완성기능, 즉 탭을 누르면 명령형이 완성는 기능, 을 지원합니다. 명령행뿐만 아니라 칼럼명, 테이블 이름, 데이터베이스명등도 완성시켜줍니다.
# 문제는 이러한 기능을 하기위해서는 각종 정보를 모두 읽고 분석해 메모리에 적해놔야 합니다.
# 필요한 기능하긴 하지만 대용량을 운영할 경우 사용하지 않는게 좋습니다.
no-auto-rehash

# MySQL 에서 경고(Warning)가 발생하면 표시는 하지 않지만 결과값으로 있다없다정도만 보여주고, "SHOW WARNINGS;"를 이용해서 봐야 합니다.
# 그러지 말고 경고가 발생하면 그냥 표시하도록 설정을 해줍니다.
show-warnings

# MySQL 클라이언트의 프롬프트를 바꿉니다.
prompt=\u@\h:\d\_\R:\m:\\s>

# paging 기능을 지원합니다.
pager="less -n -i -F -X -E"

##--------------------------------------------------------------------
# mysql client
##--------------------------------------------------------------------
[client]
socket  = /usr/local/mariadb5.5/tmp/mysql.sock
port = 3306


http://blog.cafe-latte.co.kr/150181904955


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

wireshark  (0) 2015.01.19
innodb 전체백업 / 증분백업  (0) 2015.01.08
order by rand 쿼리 튜닝  (0) 2015.01.07
InnoDB buffer pool Hit rate  (0) 2015.01.07
xtrabackup  (0) 2015.01.07
반응형

MySQL에서 랜덤 row를 뽑기 위해 order by rand 를 많이 사용하는데 sort 에 참여하는 row 수가 많아지면 
부담이 될 수 밖에 없다.  

 

쿼리는 아래 붉은 색 쿼리이며


Where 조건을 만족하는 min(num),max(num) 을 구하고 이 범위 ( min(num) <=  rand <= max(num) ) 내에서 random 으로 num 을 뽑아서

 num 과 가장 근접한 where 조건을 만족시키는 row return 하는 방식으로 진행

Min, max 구하는 쿼리가 조금 긴데.. 이 부분은 mysql optimizer 가 인덱스를 통한 min,max 최적화를 잘 수행하지 못하여 가장 성능이 잘 나오는 쿼리로 작성하여 조금 길어짐

 

 

 

최초 쿼리 >

 

SELECT t.*
               FROM team_common as t
               WHERE t.type = 'AI'
                       and t.level = 1

               ORDER BY rand()
               LIMIT 1;
기존 변경 >

select t.* from
( select num from team_common where type='AI' and level=1 order by rand() limit 1 ) a
 inner  join team_common t
 where t.num=a.num;

신규 변경 >

case1)

select tc.*

from

(select cast( (max_num-min_num) * rand() as signed ) + min_num as rand_num

             from

             (

                           select

                           (select num from team_common t use index for order by (level) where t.type = 'AI' and t.level = 1 order by level,type,num desc limit 1) as max_num,

                           (select num from team_common t use index for order by (level) where t.type = 'AI' and t.level = 1 order by level,type,num asc limit 1) as min_num

             ) max_min_t ) t_rand

STRAIGHT_JOIN

team_common tc

where

tc.level = 1 and

tc.type  = 'AI' and

tc.num >= t_rand.rand_num

order by num limit 1;

 

case2)

select tc.*

from

(select cast( (max_num-min_num) * rand() as signed ) + min_num as rand_num

             from

             (

                           select

                           (select num from team_common t use index for order by (level) where t.type = 'AI' and t.level = 1 and t.name not in ('헬로키티','다나와') order by level,type,num desc limit 1) as max_num,

                           (select num from team_common t use index for order by (level) where t.type = 'AI' and t.level = 1 and t.name not in ('헬로키티','다나와') order by level,type,num asc limit 1) as min_num

             ) max_min_t ) t_rand

STRAIGHT_JOIN

team_common tc

where

tc.level = 1 and

tc.type  = 'AI' and

tc.name not in ('헬로키티','다나와') and

tc.num >= t_rand.rand_num

order by num limit 1;




http://ndba.egloos.com/3440696

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

innodb 전체백업 / 증분백업  (0) 2015.01.08
MySQL 5.6.5-m8 x86_64 튜닝  (0) 2015.01.07
InnoDB buffer pool Hit rate  (0) 2015.01.07
xtrabackup  (0) 2015.01.07
SlaveDB2 장애복구하기  (0) 2015.01.06
반응형
InnoDB buffer pool Hit rate
(Publish Date: 2010-4-19 4:37pm, Total Visits: 255, Today: 1, This Week: 1, This Month: 3)

innodb buffer pool hit ratio =
1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests)


1. InnoDB buffer pool Hit rate:

innodb buffer pool hit ratio =
1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests)


using a SQL statement in mysql 5.1:

SELECT round ((1-P2.variable_value / P1.variable_value),4) , P2.variable_value, P1.variable_value
FROM information_schema.GLOBAL_STATUS P1,information_schema.GLOBAL_STATUS P2
WHERE P1. variable_name = 'innodb_buffer_pool_read_requests'
AND P2. variable_name = 'innodb_buffer_pool_reads';


2. MyISAM key buffer hit rate:

key buffer hit ratio = 
1 - ( key_reads / key_read_requests )


using a SQL statement in mysql 5.1:

SELECT 1- round ((P2.variable_value / P1.variable_value),4) , P2.variable_value, P1.variable_value
FROM information_schema.GLOBAL_STATUS P1,information_schema.GLOBAL_STATUS P2
WHERE P1. variable_name = 'key_read_requests'
AND P2. variable_name = 'key_reads';


3. perc_full_table_scans

perc_full_table_scans = 
   1 - ( handler_read_rnd_next + handler_read_rnd ) /
   ( handler_read_rnd_next + handler_read_rnd + handler_read_first +
   handler_read_next + handler_read_key + handler_read_prev )



http://ndba.egloos.com/2994119

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

MySQL 5.6.5-m8 x86_64 튜닝  (0) 2015.01.07
order by rand 쿼리 튜닝  (0) 2015.01.07
xtrabackup  (0) 2015.01.07
SlaveDB2 장애복구하기  (0) 2015.01.06
7. MyISAM 동시 인서트에 대해  (0) 2014.12.30
반응형


01.XtraBackup 설치.txt


11.XtraBackup Test1.txt


11.XtraBackup Test2.txt


11.XtraBackup Test3.txt


XtraBackup 적용 v1.0 - cafe.pdf



http://cafe.naver.com/mysqlpg/414

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

order by rand 쿼리 튜닝  (0) 2015.01.07
InnoDB buffer pool Hit rate  (0) 2015.01.07
SlaveDB2 장애복구하기  (0) 2015.01.06
7. MyISAM 동시 인서트에 대해  (0) 2014.12.30
16. Seconds_Behind_Master에 대해...  (0) 2014.12.30
반응형

SlaveDB2 장애복구하기

http://cafe.naver.com/mysqlpg/726



mysqldump로 백업,복구하기.txt








반응형

'연구개발 > MYSQL' 카테고리의 다른 글

InnoDB buffer pool Hit rate  (0) 2015.01.07
xtrabackup  (0) 2015.01.07
7. MyISAM 동시 인서트에 대해  (0) 2014.12.30
16. Seconds_Behind_Master에 대해...  (0) 2014.12.30
15. MySQL 실행 시 메모리 관련 library 설정하는 방법  (0) 2014.12.30
반응형

http://mysqldba.tistory.com/37











반응형
반응형

http://mysqldba.tistory.com/173


Replication의 현재 상태의 가장 빨리 파악할 수 있는  show slave status의 상태값 중 Seconds_Behind_Master값에 대한 것을 정리해 보자.

 

이 필드는 slave가 얼마나 늦었는지를 보여주는 항목이다.

  • slave가 update를 할 때, 이 필드는 Master에서 받은 로깅된 timestamp의 값과, 현재 slave에서 실행되는 현재의 timestamp의 값의 차이를 보여준다.
  • slave에서 아무런 이벤트도 실행하고 있지 않다면, 그 값은 0 이다.

본질적으로, 이 필드는 SQL thread와 I/O thread의 차이를 측정하려는 것이다. 만약, Master와 Slave사이의 네트웍이 매우 빠르다면, slave I/O thread는 Master 로 부터 매우 빨리 이벤트를 가지고 올 것이고, 그래서 이 필드는 Master와 SQL thread 가 얼마나 많이 차이가 나는지 좋은 근사값을 얻을 수 있다. 만약, 네트웍이 느리다면, 이것은 좋은 근사값이 되지 못한다. SQL thread는 느리게 이벤트를 읽는 I/O thread를 자주 따라 잡을 것이기 때문이다. 그래서, 그런 상황에서 I/O thread가 Master에 비교하여 느릴지라도  Seconds_Behind_Master는 자주 0으로 보이게 될 것이다. 다른 말로 하면, 이 컬럼은 단지 빠른 네트웍 상에서만 유용하다.

 

Master와 Slave가 동일한 시간을 가지고 있지 않다고 하더라도, 이 시차 계산식은 동작하는데, slave의 I/O thread가 시작될때 계산된 값을 사용하여 시간차에 대한 값을 계산한다. NTP update를 포함하는 어떤 변경사항이라도 시간 왜곡이 발생할 수 있는데, 이것은 Seconds_Behind_Master를 좀 신뢰할 수 없게 만들 수 있다.

 

MySQL 5.6.9 이후에서, 이 필드는 만약, SQL thread가 동작하지 않거나, SQL thread가 모든 relay log를 다 적용하였는데도, slave I/O thread가 동작하지 않은 상황이 되면 NULL로 표시된다. 전에, 이 필드는 SQL thread나 I/O thread가 동작하지 않거나, master에 연결되지 않으면 NULL로 설정되었다. (Bug #12946333) 예를 들어, MySQL Ver.5.6.9 이전인 경우에, I/O thread가 master에 연결되지 않거나, 대기상태임에도 불구하고, 실행중이면, 그 값이 NULL로 보였었다. 이제는 이러한 경우는 Master에 연결테스트가 되지 않는 것이다. 대신에, 만약, I/O thread가 relay log를 다 적용하고도 실행중에 있다면, Seconds_Behind_Master는 0으로 설정된다.

 

Seconds_Behind_Master의 값은 replicated되는 이벤트에 저장된 timestamps의 값을 기초로 한다. 이것은 즉, m1이 m0의 slave라면, m0으로 부터 받은 m1의 바이너리 로그의 이벤트는 m0의 timestamp 값을 가진다. 이것은 MySQL이 TIMESTAMP을 성공적으로 replicate하게 enable한다.

그러나, 만약, M1이 클라이언트로 부터 직접 update를 받는다면,  Seconds_Behind_Master의 값이 불규칙하게 변한다는데에  Seconds_Behind_Master의 문제가 있다. 때문에, m0으로 부터 받은 이벤트가 나올수도 있고, m1이 직접 생성한 이벤트가 나올수도 있기 때문이다.

 

MySQL Version 5.6.3 이상에서 multi-threaded slave를 사용할 때, 사용자는 이 값이 Exec_Master_Log_Pos를 기본으로 하여 만들어 진다는 것을 기억해야 한다. 그리고, 가장 최근에 커밋한 트랜잭션의 위치를 반영하지 않을 수도 있다는 것도 기억해야 한다.

 

반응형
반응형

http://mysqldba.tistory.com/172


MySQL Version 5.5 부터는 MySQL을 실행 할때 malloc() library 대신에 사용할 수 있는 라이브러리를 설정할 수 있다.  

MySQL을 어떤 시스템에서 사용하느냐에 따라 성능에 큰 차이가 나는데...다음의 url은 그것을 테스트한 외국 사이트의 자료이다.

http://www.mysqlperformanceblog.com/2013/03/08/mysql-performance-impact-of-memory-allocators-part-2/

 

결과로만 얘기하면,

"cpu core가 8 이상이 되는 시스템 에서는 기본 library보다는 tcmalloc이나 jemalloc을 사용하는것이 성능에 더 좋다."

고 나와있다.

 

그럼 그와 관련된 설정 정보를 알아보자.

다음의 mysql reference에 나와있는 설정 정보이다.

관련 url

http://dev.mysql.com/doc/refman/5.6/en/mysqld-safe.html#option_mysqld_safe_malloc-lib

 

mysqld_safe 프로그램의 설정 파라메터 중의 하나

 

--malloc-lib=[libnm]

 

시스템의 malloc() 라이브러리 대신에 사용할 라이브러리를 지정할 수 있다. 어떤 라이브러리든 pathname을 지정하여 사용할 수 있으나, tcmalloc의 경우 MySQL의 내부에 포함되어 있어서 그것을 사용할 수도 있다. (Ver. 5.6의 리눅스 배포본에 한해서만 그렇다.) 만약, tcmalloc을 지정하였는데, 제대로 동작하지 않는다면, 대신에 path name을 작성하여 그것을 사용하게 할 수도 있다.

--malloc-lib  mysqld 실행 시 메모리 할당을 위한 library를 찾기위한 loader를 enable하기 위한 dynamic link에 영향을 줄 수 있는 LD_PRELOAD 환경 변수를 수정하여 동작한다.

  • 만약 환경 변수값이 없거나, --malloc-lib에 아무 것도 주어지지 않는다면, LD_PRELOAD 는 수정되지 않고, tcmalloc을 사용하려고 시도하지 않는다.
  • --malloc-lib=tcmalloc이라고 값이 주어진다면,  mysqld_safe /usr/lib 와 MySQL의 pkglibdir(일반적으로 /usr/local/mysql/lib)에서 tcmalloclibrary를 찾는다. 만약, tcmalloc을 찾으면 path name을 LD_PRELOAD 값에 추가한다. 그리고, 찾지 못하면  mysqld_safe는 에러를 발생하고 작동을 중지한다.
  • 만약 --malloc-lib=/path/to/some/library 로 지정한다면, full path를 LD_PRELOAD에 추가한다. 그리고, 그 패스가 정확하지 않거나, 읽을 수 없는 영역이면, mysqld_safe는 에러를 발생하고 작동을 중지한다.
  • mysqld_safe LD_PRELOAD에 path name을 추가하는 모든 케이스에서 항상 이미 존재하는 값 앞에 해당 값을 추가한다.

 

리눅스 유저는 my.cnf에 다음과 같이 설정값을 추가하여 바이너리 패키지 안에 있는 libtcmalloc_minimal.so를 사용할 수 있다.

 

 [mysqld_safe]

malloc-lib=tcmalloc

tcmalloc이 /usr/lib 에 있다면 다음과 같이 설정할 수도 있다.

 

 [mysqld_safe]

malloc-lib=/opt/lib/libtcmalloc_minimal.so

 

 

반응형

+ Recent posts

반응형