Upload
exem
View
187
Download
1
Embed Size (px)
Citation preview
EXEM seminar report no. 009 (2016.07.21)
Research & Contents Team
제 9회 수요 세미나 자료
EXEM technical report 011
Table of Agenda
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
제 9회 수요 세미나
1. [MySQL] Page와 Undo page deep internal 분석 (2차)
2. [MySQL] 서버 모니터링 (1차)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL] Page와 Undo page deep internal 분석 (2차)
발표자: 연구컨텐츠팀 이근오
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]History List
• Roll pointer에는“is insert”flag, rollback segment ID, page number, page offset of the undo log location
• 위 그림은 roll pointer의 rollback segment ID와 Page number를 History Structure에서 가리킴
History Structure
rollback segment ID
Page number
roll pointer
Roll pointer structure :1-bit “is insert” flag7-bit rollback segment ID4-byte page number2-byte page offset of the undo log location
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]History List
• InnoDB File에는 .ibd, .ibdata1, .frm이 있음.
InnoDB 파일구조
.ibd contain a single table and associated index data.
.frm A file containing the metadata, such as the table definition, of a MySQL table.
.ibdata1contain metadata about InnoDB tables, (the data dictionary), and the storage areas for one or more undo logs, the change buffer, and the doublewrite buffer.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]History List
• 테이블 덤프
• Roll pointer (38 00 00 01 79 22 98)를 예시로 함.
Update “C” 실행 후, 테이블 t1에 해당하는 t1.ibd 파일 Dump
Roll Pointer
• 1-bit : 0 (“is insert” flag)• 7-bit : 38 (rollback segment ID)• 4-byte : 00 00 01 79(page number)• 2-byte : 22 98 ( page offset )
0 : insert X1 : insert O
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]History List
• 5번 페이지 덤프
• 테이블 덤프에서 구한 rollback segment ID (38-hex)에 해당하는 슬롯 값을 구함(c4)
ibdata1 파일의 5번 Page(trx_sys) Dump
38번 slot
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]History List
• 5번 페이지에서 알아낸 언두 페이지 번호 ‘c4 page’의 덤프
• 테이블 덤프에 나온 페이지 번호와 동일한 Undo Segment Slot‘01 79’가 보임
Transaction System (5번 page) 38번 slot ‘c4’에 해당하는 Rollback Segment Page Dump
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]History List
• Undo Segment 179번 페이지 덤프
• 테이블 덤프에 나온 page offset(2298) 에 해당하는 주소에 이전 값인 “DD1001”, “B”가 보임.
Undo Segment 179번 Page Dump
5e4000+2298
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]
테스트 스크립트
create table exem_i.t1 ( c1 char(14), c2 char(2), c3 char(6), c4 char(3), primary key(c1) ) engine=innodb row_format=COMPACT ;create index t1_ix1 on exem_i.t1( c3,c4 ) ;
begin ;set @rownum := 1000;insert into exem_i.t1SELECT concat('DD',cast(@rownum:=@rownum+1 as char)) rownum ,'A','A','A'FROM (select a.* from information_schema.tables a, information_schema.tables b) tlimit 2;commit ;
begin ;update exem_i.t1 set c2='B' where c1='DD1001';commit ;
begin ;update exem_i.t1 set c2='C' where c1='DD1001';commit ;
History List
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL] 서버 모니터링 (1차)
발표자: 연구컨텐츠팀 이대덕
02. [MySQL] 서버 모니터링
2-1. SHOW STATUS (1차)
2-2. SHOW PROCESSLIST
2-3. Slow Query Log
2-4. Log Profiling
2-4. Performance_Schema
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]
SHOW [GLOBAL|SESSION] STATUS [LIKE ‘pattern’ | WHERE expr]
• 서버가 시작되거나 ‘FLUSH STATUS’ 커맨드가 실행된 시점부터 누적되는 서버의 상태 값
• Session레벨과 Server레벨의 각 상태(Variable_name)와 값(Value)을 볼 수 있음.
• 기본 설정으로 현재 Session정보가 나오므로 혼동을 피하기 위해 GLOBAL, SESSION을 붙일 것을 권장
(EX. SHOW GLOBAL STATUS)
• InnoDB의 Row Lock Wait시간을 제외한 대부분이 Response Time이 아닌 카운터 수치
• 해당 명령어를 실행할 때마다 'Created_tmp_tables’ 상태변수 증가
• 모니터링 방법 중 SHOW PROCESSLIST 커맨드와 함께 비교적 가볍고 간단한 방법
• 5.6버전까지는 Information_Schema.global_status 테이블에서 조회 가능
• 5.7버전부터는 Performance_schema.global_status 테이블에서 조회 가능
(show_compatibility_56 파라미터를 ON으로 설정할 경우 5.6버전과 동일)
2-1. Global Read Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]2-1. SHOW STATUS
mysql> select version();+-----------+| version() |+-----------+| 5.7.9 |+-----------+1 row in set (0.00 sec)
mysql> select count(*) from information_schema.global_status;ERROR 3167 (HY000): The 'INFORMATION_SCHEMA.GLOBAL_STATUS' feature is disabled; see the documentation for 'show_compatibility_56‘
mysql> select count(*) from performance_schema.global_status;+----------+| count(*) |+----------+| 206 |+----------+1 row in set (0.00 sec)
mysql> SHOW GLOBAL STATUS;...360 rows in set (0.00 sec)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]2-1. SHOW STATUS
mysql> SELECT count(*) FROM INFORMATION_SCHEMA.GLOBAL_STATUS;ERROR 3167 (HY000): The 'INFORMATION_SCHEMA.GLOBAL_STATUS' feature is disabled; see the documentation for 'show_compatibility_56‘
mysql> SHOW VARIABLES LIKE 'show_compatibility_56';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| show_compatibility_56 | OFF |+-----------------------+-------+1 row in set (0.00 sec)
mysql> SET GLOBAL show_compatibility_56=on;Query OK, 0 rows affected (0.01 sec)
mysql> select count(*) from information_schema.global_status;+----------+| count(*) |+----------+| 360 |+----------+1 row in set, 1 warning (0.00 sec)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]
Network
2-1. SHOW STATUS
상태변수 설명
Slow_launch_threads Slow_launch_time 변수보다 느리게 쓰레드를 생성 한 수
Threads_cached Thread_Cache에 캐시된 쓰레드 수
Threads_created 커넥션을 위해 새로 생성된 쓰레드 수 (Thread_Cache
Threads_connected 현재 연결된 커넥션 수
Threads_running sleeping 상태가 아닌 thread의 수
Max_used_connections 동시에 사용한 최대 사용자 수
Aborted_clients 클라이언트 커넥션이 비정상적으로 종료된 수
Aborted_connects MySQL 서버에 접속이 실패된 수
Bytes_received 모든 클라이언트로부터 받은 바이트 수
Bytes_sent 모든 클라이언트에게 보낸 바이트 수
Connections 연결이 시도 된 수
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]
Binlog
2-1. SHOW STATUS
상태변수 설명
Binlog_cache_use Binary Log Cache 영역을 사용하는 트랜잭션 수
Binlog_cache_disk_use 디스크의 임시파일을 사용한 트랜잭션 수(binlog_cache_size 초과)
Binlog_stmt_cache_disk_use 디스크의 임시파일을 사용한 문장 수(binlog_stmt_cache_size 초과)
Binlog_stmt_cache_use Binary Log Statement Cache 영역을 사용하는 문장 수
상태변수 설명
Created_tmp_disk_tables 문장 실행 시 디스크에 생성된 임시 테이블 수
Created_tmp_files 임시 파일이 만들어진 수
Created_tmp_tables 임시 테이블이 만들어진 수
Temporary Files & Tables
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]
Command Counters
2-1. SHOW STATUS
상태변수 설명
Questions 클라이언트가 서버에게 보낸 쿼리 수
Queries 서버가 실행 시킨 문장 수
Com_select SELECT 문장 실행 수
Com_delete DELETE 문장 실행 수
Com_insert INSERT 문장 실행 수
Com_update UPDATE 문장 실행 수
Com_replace REPLACE 문장 실행 수
Com_load Load 문장 실행 수
Com_delete_multi 여러 테이블 DELETE 문장 실행 수
Com_update_multi 여러 테이블 Update 문장 실행 수
Com_insert_select INSERT SELECT 문장 실행 수
Com_replace_select REPLACE SELECT 문장 실행 수
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]
Handler
2-1. SHOW STATUS
상태변수 설명
Handler_prepare Two-Phase Commit 작업의 Prepare Phase 카운터
Handler_read_firstIndex Full Scan이 발생할 때 해당 인덱스의 첫 번째 키 값을 Fetch한 횟수 이 값이높다면 IFS가높다는 것
Handler_read_keykey를 기반으로 맨 처음 row를 읽겠다는 요청의 횟수. 쿼리의 조건절이 Index Range Scan, Index Unique Scan이 가능한 조건이고 조건에 맞는 데이터가 처음 발견됐을 때 횟수가 증가.
Handler_read_next인덱스 키의 순서에 따라 다음 행을 읽은 횟수. (인덱스 스캔, 인덱스 컬럼을 범위제한을 가지고읽는 경우 횟수 증가)
Handler_read_prev 인덱스 키의 반대순서(order by .. desx)로 읽는 경우이고 나머지는 next와 동일함
Handler_read_rnd데이터 파일의 고정된 위치의 행을 읽는(랜덤 읽기) 횟수. 인덱스를 사용하지 않는쿼리, 정렬, Table Full Scan시 증가
Handler_read_rnd_next Handler_read_rnd와 함께 튜닝대상(인덱스를 활용하지 못한다는 것)
Handler_rollback 스토리지엔진에게 롤백을 요청한 횟수
Handler_update 테이블에 Update가 일어난 횟수
Handler_write 테이블에 Insert가 일어난 횟수
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]
SELECT TYPE
2-1. SHOW STATUS
상태변수 설명
Select_full_join인덱스를 사용하지 않고, 후행 테이블에서 테이블 스캔이 일어나는 join의 수. 이 값이 0이 아니면, 테이블의 인덱스를 check해 봐야 한다.
Select_full_range_join reference 테이블에서 범위로 search를 사용하는 조인의 수
Select_range첫 번째 테이블에서 range를 사용하는 조인의 수. 이것은 값이 크다고 해도 일반적으로critical한 이슈는 아니다.
Select_range_check 선행 테이블과 후행테이블의 JOIN 칼럼 비교 횟수
Select_scan 첫 번째 테이블의 full scan이 발생한 join의 수
상태변수 설명
Sort_range Range를 사용하여 수행됐던 Sort 수
Sort_rows Sort 된 Row 수
Sort_scan 테이블 스캔에 의해 Sort가 수행된 수
Sort_merge_passesSort 알고리즘에 의해 해야 했던 Merge Pass의 수, 이 값이 크다면 sort_buffer_size 변수값을 올리는 것을 고려
SORT
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]
Table Open Cache
2-1. SHOW STATUS
상태변수 설명
Open_files 오픈된 파일의 수 (최대 open_files_limit까지 open 가능)
Open_streams 로그를 위해 주로 사용되는 오픈된 stream의 수
Open_table_definitions 캐쉬된 .frm파일의 수. 5.1.3이후에 추가되었다.
Open_tables 오픈된 테이블의 수
Opened_files mysys의 library 함수인 my_open()을 사용하여 오픈된 파일의 숫자
Opened_table_definitions Table definition Cache에 오픈된 .frm파일의 수
Opened_tables과거부터 현재까지 계속 오픈되고 있는 테이블의 수. 이 값이 크다면table_open_cache의 값이작거나 캐시된 테이블이 자주 Close 된다는 것
Table_open_cache_hits Table Cache의 hit 횟수
Table_open_cache_misses Table Cache의 miss 횟수
Table_open_cache_overflows Table_open_cache의 사이즈를 초과한 횟수
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]2-1. SHOW STATUS
상태변수 설명
Qcache_free_blocks query cache안의 free 메모리 블럭 수
Qcache_free_memory query cache안의 free 메모리 사이즈
Qcache_hits query cache hit수
Qcache_inserts query cache에 추가되는 쿼리의 수
Qcache_lowmem_prunes 메모리 부족으로 자동으로 삭제되는 쿼리의 수
Qcache_not_cached 캐쉬되지 않은 쿼리의 수
Qcache_queries_in_cache cache안에 등록된 쿼리의 수
Qcache_total_blocks cache안의 총 블록의 수
Query Cache
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]2-1. SHOW STATUS
상태변수 설명
Key_blocks_not_flushed 아직 디스크로 flush 되지 않고, 데이터는 변경된 key cache안의 key block의 수.
Key_blocks_unusedkey cache안에 아직 사용되지 않은 블럭의 수. key cache가 지금 현재 얼만큼 사용중인지 확인할수 가 있다.
Key_blocks_usedKey cache에 사용된 블럭의 수 이 값은 High-Water Mark로 사용된 것 중 가장 숫자가 높은 블럭을 가르킨다.
Key_read_requests 캐쉬로 부터 key block을 읽기위해 요청한 숫자.
Key_readsdisk로 key block에 읽은 물리적인 read의 수. key_read의 수가 크면 key_buffer_size가 너무 작다는 것이다. cache miss rate는 key_reads / key_read_requests로 계산한다.
Key_write_requests 캐쉬에 있는 키 블럭에 write요청을 한 수
Key_writes Key Cache로부터 디스크에 key block을 물리적으로 write한 횟수
Key Cache
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]2-1. SHOW STATUS
상태변수 변수 타입 변수 범위 5.6 version 5.5 version 설명
Last_query_cost Numeric SESSION O O
• 쿼리 옵티마이저에 의해 computing 된 가장 최신의 쿼리에 대한 cost값
• 같은 쿼리에 대한 다른 쿼리 플랜에 대한 비교 분석 시 유용하게 쓰임• default값은 0인데, 값 0은 아직 한번도 컴파일 된 적이 없다는 뜻
• Subquery나 Union이 사용되지 않는 간단한 쿼리에 대한 computing된 값
Not_flushed_delayed_rows Integer GLOBAL O O deprecated (5.67 부터 Delayed Insert 기능이 삭제됨)
Ongoing_anonymous_gtid_violating_transaction_count
Integer GLOBAL X X디버그 빌드에서만 가능 gtid_next가 'anonymous'이고 GTID일관성을 위반하는 트랜잭션의 수
Ongoing_anonymous_transaction_count Integer GLOBAL X XAnonymouse 트랜잭션의 수, 앞으로 수행 될(대기중인) 트랜잭션이 없다는 걸확인하기 위해 사용할 수도 있음
Ongoing_automatic_gtid_violating_transaction_count
integer GLOBAL X X디버그 빌드에서만 가능 gtid_next가 'automatic'이고 GTID일관성을 위반하는트랜잭션의 수
Prepared_stmt_count integer GLOBAL O Oprepared statement에 대한 현재 수 ( max_prepared_stmt_count 의 수보다 더 클수는 없다. ) 5.1.14에서 추가되었다.
Slave_retried_transactions integer GLOBAL O O Slave에서 SQL Thread가 재시도 했던 트랜잭션 수
Slave_running boolean GLOBAL O O현재 서버가 Master 서버에 연결된 Slave서버이고, I/O와 SQL Thread 둘다Running중이면 ON 그렇지 않으면 OFF
Slow_launch_threads integerGLOBAL | S
ESSIONO O Slow_launch_time 변수보다 느리게 쓰레드를 생성 한 수
Slow_queries integerGLOBAL | S
ESSIONO O 슬로우 쿼리(long_query_time 변수 값 보다 높은 쿼리)의 수
Table_locks_immediate integer GLOBAL X O 테이블락을 즉시 획득한 수
Table_locks_waited integer GLOBAL X O 테이블 락을 wait 한 수
Uptime integer GLOBAL X O 서버의 업타임
Uptime_since_flush_status integer GLOBAL X O FLUSH STATUS명령어를 실행시킨 후 경과시간
그 외 주요 상태변수들
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]2-1. SHOW STATUS
상태변수 변수 타입 변수 범위 5.6 version 5.5 version 설명
Delayed_errors integer GLOBAL O O deprecated (5.67 부터 Delayed Insert 기능이 삭제됨)
Delayed_insert_threads integer GLOBAL O O deprecated (5.67 부터 Delayed Insert 기능이 삭제됨)
Delayed_writes integer GLOBAL O O deprecated (5.67 부터 Delayed Insert 기능이 삭제됨)
Innodb_available_undo_logs integer GLOBAL O X 사용 가능한 InnoDB undo logs의 총 수
Innodb_buffer_pool_bytes_data integer GLOBAL O O데이터를 가지고 있는 페이지의 총 바이트 수(dirty, clean 버퍼 포함) 압축된 테이블이 버퍼풀에 캐시되어 정확한 사이즈 파악을 위해Innodb_buffer_pool_pages_data보다 해당 값을 사용
Innodb_buffer_pool_bytes_dirty integer GLOBAL O O 현재 버퍼풀에 있는 Dirty페이지의 바이트 수
Innodb_buffer_pool_pages_data integer GLOBAL O O 데이터를 포함한 dirty 또는 clean된 페이지의 수
Innodb_buffer_pool_pages_dirty integer GLOBAL O O 현재 버퍼풀에 있는 Dirty페이지 수
Innodb_buffer_pool_pages_flushed integer GLOBAL O O buffer pool 에 있는 페이지의 flush 요청 수
Innodb_buffer_pool_pages_free integer GLOBAL O O free pages의 수
Innodb_buffer_pool_pages_latched integer GLOBAL O O
InnoDB buffer pool안의 latched된 페이지의 수. 이 페이지들은 현재읽고 있거나, 쓰고 있거나, flushed될 수 없는 상태이거나, 다른 이유들로 삭제될 수 없는 페이지들을 말한다. 이 값의 계산비용이 무척 비싸기 때문에 5.1.28이후에 추가되었다.
Innodb_buffer_pool_pages_misc integer GLOBAL O O
row lock이나 adaptive hash index와 같은 작업으로 인해 관리에 overhead가 발생하여 할당된 바쁜 페이지들의 수. 이 수는 Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free - Innodb_buffer_pool_pages_data와 같다.
Innodb_buffer_pool_pages_total integer GLOBAL O O Buffer Pool의 총 사이즈(페이지 수)
Innodb_buffer_pool_read_ahead_rnd integer GLOBAL O OInnoDB에 의해 시작된 무작위의 read-ahead 수. 쿼리가 넓은 부분에서 random으로 테이블을 스캔하고자 할때 발생한다.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]2-1. SHOW STATUS
상태변수 변수 타입 변수 범위 5.6 version 5.5 version 설명
Innodb_buffer_pool_read_requests integer GLOBAL O O InnoDB가 진행한 Logical read의 request의 수
Innodb_buffer_pool_reads integer GLOBAL O OInnoDB가 buffer pool로 부터 채울 수 없고, single-page read를 해야 하는 logical read의 수
Innodb_buffer_pool_wait_free integer GLOBAL O O• InnoDB buffer pool의 사용할 페이지가 없는 경우 flush된 페이지
를 기다려야 할 필요있다. 이런 waiting을 counting한 수
• buffer pool size가 적당히 세팅되어있다면, 이 값은 작을 것이다.
Innodb_buffer_pool_write_requests integer GLOBAL O O InnoDB buffer pool에 쓰여진 횟수
Innodb_data_fsyncs integer GLOBAL O O fsync() 함수가 호출된 수( innodb_flush_method 시스템변수)
Innodb_data_pending_fsyncs integer GLOBAL O O fsync()함수가 pending된 현재 숫자.
Innodb_data_pending_reads integer GLOBAL O O pending된 읽기의 현재 수.
Innodb_data_pending_writes integer GLOBAL O O pending된 쓰기의 현재 수.
Innodb_data_read integer GLOBAL O O 서버가 시작될 때부터 읽은 데이터의 총 사이즈 (bytes)
Innodb_data_reads integer GLOBAL O O data read의 총 수
Innodb_data_writes integer GLOBAL O O data write의 총 수
Innodb_data_written integer GLOBAL O O 바이트 단위로 현재까지 읽혀진 데이터의 총 사이즈
Innodb_dblwr_pages_written integer GLOBAL O O Doublewrite Buffer로 쓰여진 페이지 수
Innodb_dblwr_writes integer GLOBAL O O Doublewrite 오퍼레이션이 수행된 횟수
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]2-1. SHOW STATUS
상태변수 변수 타입 변수 범위 5.6 version 5.5 version 설명
Innodb_log_waits integer GLOBAL O O Log buffer크기가 모자라서 Flush될 때까지 wait한 시간
Innodb_log_write_requests integer GLOBAL O O Redo Log의 write 요청수
Innodb_log_writes integer GLOBAL O O Redo log 파일에 물리적으로 write 한 횟수
Innodb_os_log_fsyncs integer GLOBAL O O Redo log 파일에 fsync()작업을 수행한 횟수
Innodb_os_log_pending_fsyncs integer GLOBAL O O 로그 파일에 fsync() 작업이 pending된 수
Innodb_os_log_pending_writes integer GLOBAL O O 로그 파일에 대한 쓰기 작업이 pending된 수
Innodb_os_log_written integer GLOBAL O O 로그 파일에 쓰여진 byte 수
Innodb_page_size integer GLOBAL O O컴파일된 InnoDB의 페이지 사이즈 (기본은 16kb) 많은 값들이 페이지에서 계산된다. 페이지 사이즈는 그들이 바이트단위로 convert되기 쉽게 한다.
Innodb_pages_created integer GLOBAL O O 생성된 페이지의 수
Innodb_pages_read integer GLOBAL O O 읽혀진 페이지의 수
Innodb_pages_written integer GLOBAL O O 쓰여진 페이지의 수
Innodb_row_lock_current_waits integer GLOBAL O O 현재 발생하고 있는 Row Lock 대기 수
Innodb_row_lock_time integer GLOBAL O O Row lock을 획득하면서 소요된 시간 총합 (milliseconds)
Innodb_row_lock_time_avg integer GLOBAL O O Row lock을 획득하면서 소요된 시간 평균 (milliseconds)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL]참조
http://mysqldba.tistory.com/161
http://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html#statvar_Select_range_check
http://blog.daum.net/joanney/16086031
DBA를 위한 MySQL 운영기술
MySQL, 4TH Edtion
Research & Contents
Blog
Video
NAVER http://cafe.naver.com/playexem
ITPUB http://blog.itpub.net/31135309/
Wordpress https://playexem.wordpress.com/
Slideshare http://www.slideshare.net/playexem
Youtube https://www.youtube.com/channel/UC5wKR_-A0eL_Pn_EMzoauJg
Tudou http://www.tudou.com/home/maxgauge/
교육문의:연구컨텐츠팀김숙진
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.