EXEM seminar report no. 008 (2016.07.12)
Research & Contents Team
제 8회 수요 세미나 자료
Table of Agenda
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
제 8회 수요 세미나
1. [PostgreSQL] Vacuum의 거의 모든 것 (4차)
2. [MySQL] Lock (1차)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL] Vacuum의 거의 모든 것 (4차)
발표자: 연구컨텐츠팀 이근오
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
Page Layout ( 1/2 )
 Dump
0.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
 SELECT * from heap_page_items(get_raw_page('t2', 0));
Page Layout ( 1/2 )
 Dump
0.
00 7c 9f c0 00 7c 9f 80
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
 SELECT * from heap_page_items(get_raw_page('t2', 0));
create table t2 ( c1 char(19),c2 char(8),c3 char(8) );
insert into t2 values('A1001','A','A');
insert into t2 values('A1002','A','A');
 Dump
all line pointers on a heap page
1.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
 SELECT * from heap_page_items(get_raw_page('t2', 0));
update t2 set c2='B' where c1 = 'A1001' ;
 Dump
2.
새로운 위치에
변경데이타 “B” 레코드를 추가.
ItemIdData 부분도 추가됨.
“A1001” 원본은 “xmax” 값을 변경
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
update t2 set c2='B' where c1 = 'A1001' ;
 tab.sql
2.
select xmin,xmax,ctid,* from t1;
 select txid_current() ;
select xmin,xmax,ctid,* from t2;
“A1001” item 의 xmin 변경됨.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
 SELECT * from heap_page_items(get_raw_page('t2', 0));
vacuum t2 ;
 Dump
3.
“순서가 변경됨”
• A1002가 제일 아래로 내려감
• A1001 위치도 아래로 변경
• A1001 원래 위치의 데이터는 그대로
두고 ItemIdData만 삭제.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
vacuum t2 ;
 tab.sql
3.
select xmin,xmax,ctid,* from t1;
 select txid_current() ;
select xmin,xmax,ctid,* from t2;
변경안됨
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
vacuum freeze t2 ;
 tab.sql
4.
select xmin,xmax,ctid,* from t1;
select xmin,xmax,ctid,* from t2;
1807012522에서 변경됨
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
vacuum full t2 ;
 tab.sql
5.
select xmin,xmax,ctid,* from t1;
select xmin,xmax,ctid,* from t2;
136677에서 변경됨 변경안됨
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
vacuum full t2 ;
 Dump
5.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
autovacuum_analyze_scale_factor = 0.1
autovacuum_analyze_threshold = 50
6.
1. 1000건 insert
2. autovacuum_naptime=60s 이상 wait 후 확인 : autoanalyze OK.
3. autovacuum_analyze_scale_factor=0.1 인 100건 insert  wait 후 확인 : autoanalyze NOT OK.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
autovacuum_analyze_scale_factor = 0.1
autovacuum_analyze_threshold = 50
6.
4. autovacuum_analyze_threshold=50 인 50건 insert  wait 후 확인 : autoanalyze NOT OK.
5. Only 1건 insert  wait 후 확인 : autoanalyze OK.
autovacuum analyze 대상 조건
변경건수(insert포함) > ( reltuples * 0.1(autovacuum_analyze_scale_factor) )
+ 50(autovacuum_analyze_scale_factor)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
autovacuum_vacuum_scale_factor = 0.2
autovacuum_vacuum_threshold = 50
7.
1. 1000건 insert  wait 후 확인 : autovacuum NOT OK.
2. autovacuum_vacuum_scale_factor=0.2 인 200건 update  wait 후 확인 : autovacuum NOT OK.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[PostgreSQL]
Vacuum의 거의 모든 것(4차)
autovacuum_vacuum_scale_factor = 0.2
autovacuum_vacuum_threshold = 50
7.
3. autovacuum_vacuum_threshold=50 인 50건 update  wait 후 확인 : autovacuum NOT OK.
4. Only 1건 update  wait 후 확인 : autovacuum OK.
autovacuum vacuum 대상 조건
변경건수(insert제외) > ( reltuples * 0.2(autovacuum_vacuum_scale_factor) )
+ 50(autovacuum_vacuum_threshold)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
[MySQL] Lock (1차)
발표자: 연구컨텐츠팀 이대덕
02. [MySQL] MySQL Lock
2-1. Global Read Lock
2-2. Table Lock
2-3. String Lock
2-4. Name Lock
Table of Agenda
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;
• 서버 전체(모든 스토리지 엔진)에 Global Read Lock획득
• Table Cache에 있는 테이블을 Flush (기존의 문장이 Table Lock을 가지고 수행 중이라
면 대기함)
• SELECT문을 제외한 문장은 Global Read Lock이 해제될 때까지 대기 (State: Waiting
for global read lock)
• 주로 DB전체의 일관성 있는 백업을 받기 위해 사용
2-1. Global Read Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
(root@localhost)[(none)] 13:48:51>show status like 'open_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 54 |
+---------------+-------+
1 row in set (0.00 sec)
(root@localhost)[(none)] 13:48:53>flush tables with read lock;
Query OK, 0 rows affected (9.06 sec)
(root@localhost)[(none)] 13:49:10>show status like 'open_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 1 |
+---------------+-------+
1 row in set (0.00 sec)
(root@localhost)[(none)] 14:00:20>unlock tables;
Query OK, 0 rows affected (0.00 sec)
2-1. Global Read Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
(root@localhost)[exem_i] 13:32:41>select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 14286 |
+-----------------+
1 row in set (0.00 sec)
(root@localhost)[exem_i] 13:33:16>lock table foo write;
Query OK, 0 rows affected (10.97 sec)
2-1. Global Read Lock
(root@localhost)[(none)] 13:34:37>select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 13 |
+-----------------+
1 row in set (0.00 sec)
(root@localhost)[(none)] 13:34:44>flush tables with read lock;
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
2-1. Global Read Lock
(root@localhost)[exem_i] 13:33:34>show processlist;
+-------+------+-----------+--------+---------+------+------------------------------+----------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+------+-----------+--------+---------+------+------------------------------+----------------------------+
| 13 | root | localhost | NULL | Query | 20 | Waiting for global read lock | flush table with read lock |
| 14286 | root | localhost | exem_i | Query | 0 | starting | show processlist |
+-------+------+-----------+--------+---------+------+------------------------------+----------------------------+
2 rows in set (0.00 sec)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type...
UNLOCK TABLES
• Lock_type : READ [LOCAL] | [LOW_PRIORITY] WRITE
• MySQL레벨에서 테이블 단위로 설정되는 LOCK
• MyISAM, MEMORY Storage Engine에서는 데이터를 변경하는 즉시 묵시적으로 획득 후 변경 후 반환
• 해당 테이블에 LOCK_TABLE 권한 필요
• 서버 레벨이지만 MyISAM스토리지 엔진을 기준으로 한 LOCK이며 InnoDB에서는 사용을 권장하지 않음
• READ LOCK :
해당세션과 다른 세션 모두 Select문장만 수행가능하며 Local 옵션을 사용 하는 경우 Concurrent Insert가능
다른 세션에서 획득한 READ LOCK끼리 호환가능
• WRITE LOCK :
해당 세션에서만 DML,DDL이 가능하며 다른 세션의 읽기,쓰기, TABLE LOCK과 호환불가
LOW_PRIORITY 옵션을 사용하는 경우 Lock 요청 큐에서 낮은 우선순위를 갖게 됨
2-2. Table Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
(root@localhost)[exem_i] 15:20:06>select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 14286|
+-----------------+
1 row in set (0.00 sec)
(root@localhost)[exem_i] 14:36:22>lock table foo read;
Query OK, 0 rows affected (0.00 sec)
(root@localhost)[exem_i] 14:36:51>select * from foo;
+------+------+
| c1 | c2 |
+------+------+
| 31 | a |
| 2 | b |
| 123 | a |
+------+------+
3 rows in set (0.00 sec)
(root@localhost)[exem_i] 14:36:57>update foo set c1=1 where c2='a';
ERROR 1099 (HY000): Table 'foo' was locked with a READ lock and can't be updated
2-2. Table Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
(root@localhost)[exem_i] 15:20:06>select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 13 |
+-----------------+
1 row in set (0.00 sec)
(root@localhost)[exem_i] 15:28:07>select * from foo;
+------+------+
| c1 | c2 |
+------+------+
| 31 | a |
| 2 | b |
| 123 | a |
+------+------+
3 rows in set (0.00 sec)
(root@localhost)[exem_i] 15:28:11>update foo set c1=1 where c2='a';
(root@localhost)[exem_i] 15:27:31>show processlist;
+-------+------+-----------+--------+---------+------+---------------------------------+----------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+------+-----------+--------+---------+------+---------------------------------+----------------------------------+
| 13 | root | localhost | exem_i | Query | 15 | Waiting for table metadata lock | update foo set c1=1 where c2='a' |
| 14286 | root | localhost | exem_i | Query | 0 | starting | show processlist |
| 25063 | root | localhost | NULL | Sleep | 2833 | | NULL |
+-------+------+-----------+--------+---------+------+---------------------------------+----------------------------------+
3 rows in set (0.00 sec)
2-2. Table Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
(root@localhost)[exem_i] 15:20:06>select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 13 |
+-----------------+
1 row in set (0.00 sec)
(root@localhost)[exem_i] 15:34:08>lock table foo read;
Query OK, 0 rows affected (0.00 sec)
(root@localhost)[exem_i] 15:34:15>lock table foo write;
(root@localhost)[exem_i] 15:31:58>show processlist;
+-------+------+-----------+--------+---------+------+---------------------------------+----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+------+-----------+--------+---------+------+---------------------------------+----------------------+
| 13 | root | localhost | exem_i | Query | 5 | Waiting for table metadata lock | lock table foo write |
| 14286 | root | localhost | exem_i | Query | 0 | starting | show processlist |
| 31080 | root | localhost | NULL | Sleep | 147 | | NULL |
+-------+------+-----------+--------+---------+------+---------------------------------+----------------------+
3 rows in set (0.00 sec)
2-2. Table Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
mysql> lock tables foo read;
Query OK, 0 rows affected (0.00 sec)
mysql> show open tables from exem_i;
+----------+--------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+--------+--------+-------------+
| exem_i | t1 | 0 | 0 |
| exem_i | myisam | 0 | 0 |
| exem_i | foo | 1 | 0 |
+----------+--------+--------+-------------+
3 rows in set (0.00 sec)
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql> show open tables from exem_i;
+----------+--------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+--------+--------+-------------+
| exem_i | t1 | 0 | 0 |
| exem_i | myisam | 0 | 0 |
| exem_i | foo | 0 | 0 |
+----------+--------+--------+-------------+
3 rows in set (0.00 sec)
2-2. Table Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
GET_LOCK(str,timeout)
RELEASE_LOCK(str)
IS_USED_LOCK(str)
IS_FREE_LOCK(str)
• TABLE,ROW 단위가 아닌 Client간의 String에 대한 Lock
• Client들은 동일한 String에 Lock을 획득할 수 없음.
• GET_LOCK() : 해당 Lock 획득(획득에 성공하면 1리턴 실패하면 2를 리턴)
• RELEASE_LOCK() : 해당 Lock 해제(해제에 성공하면 1리턴, LOCK이 존재하지 않으면 NULL값 리턴)
• IS_USED_LOCK() : 해당 Lock을 누가 사용 중인지 확인(사용중인 세션의 Connection_id값 반환 or NULL)
• IS_FREE_LOCK() : 특정 String이 사용가능한지 확인(가능하면 1을 리턴, 사용 중이면 0을 리턴, Error발생시 NULL)
• 주로 특정 어플리케이션들에서 서로의 데이터 중복을 확인하기 위해 사용
2-3. User Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 243397 |
+-----------------+
1 row in set (0.00 sec)
mysql> select is_used_lock('locked_string');
+-------------------------------+
| is_used_lock('locked_string') |
+-------------------------------+
| NULL |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select is_free_lock('locked_string');
+-------------------------------+
| is_free_lock('locked_string') |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select get_lock('locked_string',600);
+-------------------------------+
| get_lock('locked_string',600) |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.00 sec)
2-3. User Lock
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
2-3. User Lock
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 243396 |
+-----------------+
1 row in set (0.00 sec)
mysql> select is_used_lock('locked_string');
+-------------------------------+
| is_used_lock('locked_string') |
+-------------------------------+
| 243397 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select is_free_lock('locked_string');
+-------------------------------+
| is_free_lock('locked_string') |
+-------------------------------+
| 0 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select get_lock('locked_string',600);
mysql> show processlist;
+--------+------+-----------+--------+---------+------+-----------+--------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+------+-----------+--------+---------+------+-----------+--------------------------------------+
| 243396 | root | localhost | exem_i | Query | 5 | User lock | select get_lock('locked_string',600) |
| 243397 | root | localhost | exem_i | Sleep | 179 | | NULL |
| 243555 | root | localhost | exem_i | Query | 0 | starting | show processlist |
+--------+------+-----------+--------+---------+------+-----------+--------------------------------------+
3 rows in set (0.00 sec)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
RENAME TABLE tbl_name1 TO tbl_name2
DROP TABLE tbl_name
• 테이블을 RENAME하거나 DROP할 경우 묵시적으로 테이블 명에 Name Lock
• RENAME할 경우 기존이름과 변경될 이름에 모두 Lock획득
• TABLE LOCK과 호환성 없음
• SHOW OPEN TABLES 커맨드로 Name_lock이 걸린 테이블 확인 가능
mysql> show open tables from exem_i;
+----------+--------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+--------+--------+-------------+
| exem_i | abc | 0 | 0 |
| exem_i | t1 | 0 | 0 |
| exem_i | myisam | 0 | 0 |
| exem_i | foo | 0 | 0 |
+----------+--------+--------+-------------+
4 rows in set (0.00 sec)
2-4. Name Lock
Research & Contents
THANK YOU
Blog
Video
E-mail
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/
교육 문의: 연구컨텐츠팀 김숙진
edu@ex-em.com
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.

제 8회 엑셈 수요 세미나 자료 연구컨텐츠팀

  • 1.
    EXEM seminar reportno. 008 (2016.07.12) Research & Contents Team 제 8회 수요 세미나 자료
  • 2.
    Table of Agenda ©Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved. 제 8회 수요 세미나 1. [PostgreSQL] Vacuum의 거의 모든 것 (4차) 2. [MySQL] Lock (1차)
  • 3.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것 (4차) 발표자: 연구컨텐츠팀 이근오
  • 4.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) Page Layout ( 1/2 )  Dump 0.
  • 5.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차)  SELECT * from heap_page_items(get_raw_page('t2', 0)); Page Layout ( 1/2 )  Dump 0. 00 7c 9f c0 00 7c 9f 80
  • 6.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차)  SELECT * from heap_page_items(get_raw_page('t2', 0)); create table t2 ( c1 char(19),c2 char(8),c3 char(8) ); insert into t2 values('A1001','A','A'); insert into t2 values('A1002','A','A');  Dump all line pointers on a heap page 1.
  • 7.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차)  SELECT * from heap_page_items(get_raw_page('t2', 0)); update t2 set c2='B' where c1 = 'A1001' ;  Dump 2. 새로운 위치에 변경데이타 “B” 레코드를 추가. ItemIdData 부분도 추가됨. “A1001” 원본은 “xmax” 값을 변경
  • 8.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) update t2 set c2='B' where c1 = 'A1001' ;  tab.sql 2. select xmin,xmax,ctid,* from t1;  select txid_current() ; select xmin,xmax,ctid,* from t2; “A1001” item 의 xmin 변경됨.
  • 9.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차)  SELECT * from heap_page_items(get_raw_page('t2', 0)); vacuum t2 ;  Dump 3. “순서가 변경됨” • A1002가 제일 아래로 내려감 • A1001 위치도 아래로 변경 • A1001 원래 위치의 데이터는 그대로 두고 ItemIdData만 삭제.
  • 10.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) vacuum t2 ;  tab.sql 3. select xmin,xmax,ctid,* from t1;  select txid_current() ; select xmin,xmax,ctid,* from t2; 변경안됨
  • 11.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) vacuum freeze t2 ;  tab.sql 4. select xmin,xmax,ctid,* from t1; select xmin,xmax,ctid,* from t2; 1807012522에서 변경됨
  • 12.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) vacuum full t2 ;  tab.sql 5. select xmin,xmax,ctid,* from t1; select xmin,xmax,ctid,* from t2; 136677에서 변경됨 변경안됨
  • 13.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) vacuum full t2 ;  Dump 5.
  • 14.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) autovacuum_analyze_scale_factor = 0.1 autovacuum_analyze_threshold = 50 6. 1. 1000건 insert 2. autovacuum_naptime=60s 이상 wait 후 확인 : autoanalyze OK. 3. autovacuum_analyze_scale_factor=0.1 인 100건 insert  wait 후 확인 : autoanalyze NOT OK.
  • 15.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) autovacuum_analyze_scale_factor = 0.1 autovacuum_analyze_threshold = 50 6. 4. autovacuum_analyze_threshold=50 인 50건 insert  wait 후 확인 : autoanalyze NOT OK. 5. Only 1건 insert  wait 후 확인 : autoanalyze OK. autovacuum analyze 대상 조건 변경건수(insert포함) > ( reltuples * 0.1(autovacuum_analyze_scale_factor) ) + 50(autovacuum_analyze_scale_factor)
  • 16.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) autovacuum_vacuum_scale_factor = 0.2 autovacuum_vacuum_threshold = 50 7. 1. 1000건 insert  wait 후 확인 : autovacuum NOT OK. 2. autovacuum_vacuum_scale_factor=0.2 인 200건 update  wait 후 확인 : autovacuum NOT OK.
  • 17.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [PostgreSQL] Vacuum의 거의 모든 것(4차) autovacuum_vacuum_scale_factor = 0.2 autovacuum_vacuum_threshold = 50 7. 3. autovacuum_vacuum_threshold=50 인 50건 update  wait 후 확인 : autovacuum NOT OK. 4. Only 1건 update  wait 후 확인 : autovacuum OK. autovacuum vacuum 대상 조건 변경건수(insert제외) > ( reltuples * 0.2(autovacuum_vacuum_scale_factor) ) + 50(autovacuum_vacuum_threshold)
  • 18.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. [MySQL] Lock (1차) 발표자: 연구컨텐츠팀 이대덕
  • 19.
    02. [MySQL] MySQLLock 2-1. Global Read Lock 2-2. Table Lock 2-3. String Lock 2-4. Name Lock Table of Agenda
  • 20.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. FLUSH TABLES WITH READ LOCK; UNLOCK TABLES; • 서버 전체(모든 스토리지 엔진)에 Global Read Lock획득 • Table Cache에 있는 테이블을 Flush (기존의 문장이 Table Lock을 가지고 수행 중이라 면 대기함) • SELECT문을 제외한 문장은 Global Read Lock이 해제될 때까지 대기 (State: Waiting for global read lock) • 주로 DB전체의 일관성 있는 백업을 받기 위해 사용 2-1. Global Read Lock
  • 21.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. (root@localhost)[(none)] 13:48:51>show status like 'open_tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 54 | +---------------+-------+ 1 row in set (0.00 sec) (root@localhost)[(none)] 13:48:53>flush tables with read lock; Query OK, 0 rows affected (9.06 sec) (root@localhost)[(none)] 13:49:10>show status like 'open_tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 1 | +---------------+-------+ 1 row in set (0.00 sec) (root@localhost)[(none)] 14:00:20>unlock tables; Query OK, 0 rows affected (0.00 sec) 2-1. Global Read Lock
  • 22.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. (root@localhost)[exem_i] 13:32:41>select connection_id(); +-----------------+ | connection_id() | +-----------------+ | 14286 | +-----------------+ 1 row in set (0.00 sec) (root@localhost)[exem_i] 13:33:16>lock table foo write; Query OK, 0 rows affected (10.97 sec) 2-1. Global Read Lock (root@localhost)[(none)] 13:34:37>select connection_id(); +-----------------+ | connection_id() | +-----------------+ | 13 | +-----------------+ 1 row in set (0.00 sec) (root@localhost)[(none)] 13:34:44>flush tables with read lock;
  • 23.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. 2-1. Global Read Lock (root@localhost)[exem_i] 13:33:34>show processlist; +-------+------+-----------+--------+---------+------+------------------------------+----------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-------+------+-----------+--------+---------+------+------------------------------+----------------------------+ | 13 | root | localhost | NULL | Query | 20 | Waiting for global read lock | flush table with read lock | | 14286 | root | localhost | exem_i | Query | 0 | starting | show processlist | +-------+------+-----------+--------+---------+------+------------------------------+----------------------------+ 2 rows in set (0.00 sec)
  • 24.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type... UNLOCK TABLES • Lock_type : READ [LOCAL] | [LOW_PRIORITY] WRITE • MySQL레벨에서 테이블 단위로 설정되는 LOCK • MyISAM, MEMORY Storage Engine에서는 데이터를 변경하는 즉시 묵시적으로 획득 후 변경 후 반환 • 해당 테이블에 LOCK_TABLE 권한 필요 • 서버 레벨이지만 MyISAM스토리지 엔진을 기준으로 한 LOCK이며 InnoDB에서는 사용을 권장하지 않음 • READ LOCK : 해당세션과 다른 세션 모두 Select문장만 수행가능하며 Local 옵션을 사용 하는 경우 Concurrent Insert가능 다른 세션에서 획득한 READ LOCK끼리 호환가능 • WRITE LOCK : 해당 세션에서만 DML,DDL이 가능하며 다른 세션의 읽기,쓰기, TABLE LOCK과 호환불가 LOW_PRIORITY 옵션을 사용하는 경우 Lock 요청 큐에서 낮은 우선순위를 갖게 됨 2-2. Table Lock
  • 25.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. (root@localhost)[exem_i] 15:20:06>select connection_id(); +-----------------+ | connection_id() | +-----------------+ | 14286| +-----------------+ 1 row in set (0.00 sec) (root@localhost)[exem_i] 14:36:22>lock table foo read; Query OK, 0 rows affected (0.00 sec) (root@localhost)[exem_i] 14:36:51>select * from foo; +------+------+ | c1 | c2 | +------+------+ | 31 | a | | 2 | b | | 123 | a | +------+------+ 3 rows in set (0.00 sec) (root@localhost)[exem_i] 14:36:57>update foo set c1=1 where c2='a'; ERROR 1099 (HY000): Table 'foo' was locked with a READ lock and can't be updated 2-2. Table Lock
  • 26.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. (root@localhost)[exem_i] 15:20:06>select connection_id(); +-----------------+ | connection_id() | +-----------------+ | 13 | +-----------------+ 1 row in set (0.00 sec) (root@localhost)[exem_i] 15:28:07>select * from foo; +------+------+ | c1 | c2 | +------+------+ | 31 | a | | 2 | b | | 123 | a | +------+------+ 3 rows in set (0.00 sec) (root@localhost)[exem_i] 15:28:11>update foo set c1=1 where c2='a'; (root@localhost)[exem_i] 15:27:31>show processlist; +-------+------+-----------+--------+---------+------+---------------------------------+----------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-------+------+-----------+--------+---------+------+---------------------------------+----------------------------------+ | 13 | root | localhost | exem_i | Query | 15 | Waiting for table metadata lock | update foo set c1=1 where c2='a' | | 14286 | root | localhost | exem_i | Query | 0 | starting | show processlist | | 25063 | root | localhost | NULL | Sleep | 2833 | | NULL | +-------+------+-----------+--------+---------+------+---------------------------------+----------------------------------+ 3 rows in set (0.00 sec) 2-2. Table Lock
  • 27.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. (root@localhost)[exem_i] 15:20:06>select connection_id(); +-----------------+ | connection_id() | +-----------------+ | 13 | +-----------------+ 1 row in set (0.00 sec) (root@localhost)[exem_i] 15:34:08>lock table foo read; Query OK, 0 rows affected (0.00 sec) (root@localhost)[exem_i] 15:34:15>lock table foo write; (root@localhost)[exem_i] 15:31:58>show processlist; +-------+------+-----------+--------+---------+------+---------------------------------+----------------------+ | Id | User | Host | db | Command | Time | State | Info | +-------+------+-----------+--------+---------+------+---------------------------------+----------------------+ | 13 | root | localhost | exem_i | Query | 5 | Waiting for table metadata lock | lock table foo write | | 14286 | root | localhost | exem_i | Query | 0 | starting | show processlist | | 31080 | root | localhost | NULL | Sleep | 147 | | NULL | +-------+------+-----------+--------+---------+------+---------------------------------+----------------------+ 3 rows in set (0.00 sec) 2-2. Table Lock
  • 28.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. mysql> lock tables foo read; Query OK, 0 rows affected (0.00 sec) mysql> show open tables from exem_i; +----------+--------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+--------+--------+-------------+ | exem_i | t1 | 0 | 0 | | exem_i | myisam | 0 | 0 | | exem_i | foo | 1 | 0 | +----------+--------+--------+-------------+ 3 rows in set (0.00 sec) mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) mysql> show open tables from exem_i; +----------+--------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+--------+--------+-------------+ | exem_i | t1 | 0 | 0 | | exem_i | myisam | 0 | 0 | | exem_i | foo | 0 | 0 | +----------+--------+--------+-------------+ 3 rows in set (0.00 sec) 2-2. Table Lock
  • 29.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. GET_LOCK(str,timeout) RELEASE_LOCK(str) IS_USED_LOCK(str) IS_FREE_LOCK(str) • TABLE,ROW 단위가 아닌 Client간의 String에 대한 Lock • Client들은 동일한 String에 Lock을 획득할 수 없음. • GET_LOCK() : 해당 Lock 획득(획득에 성공하면 1리턴 실패하면 2를 리턴) • RELEASE_LOCK() : 해당 Lock 해제(해제에 성공하면 1리턴, LOCK이 존재하지 않으면 NULL값 리턴) • IS_USED_LOCK() : 해당 Lock을 누가 사용 중인지 확인(사용중인 세션의 Connection_id값 반환 or NULL) • IS_FREE_LOCK() : 특정 String이 사용가능한지 확인(가능하면 1을 리턴, 사용 중이면 0을 리턴, Error발생시 NULL) • 주로 특정 어플리케이션들에서 서로의 데이터 중복을 확인하기 위해 사용 2-3. User Lock
  • 30.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. mysql> select connection_id(); +-----------------+ | connection_id() | +-----------------+ | 243397 | +-----------------+ 1 row in set (0.00 sec) mysql> select is_used_lock('locked_string'); +-------------------------------+ | is_used_lock('locked_string') | +-------------------------------+ | NULL | +-------------------------------+ 1 row in set (0.00 sec) mysql> select is_free_lock('locked_string'); +-------------------------------+ | is_free_lock('locked_string') | +-------------------------------+ | 1 | +-------------------------------+ 1 row in set (0.00 sec) mysql> select get_lock('locked_string',600); +-------------------------------+ | get_lock('locked_string',600) | +-------------------------------+ | 1 | +-------------------------------+ 1 row in set (0.00 sec) 2-3. User Lock
  • 31.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. 2-3. User Lock mysql> select connection_id(); +-----------------+ | connection_id() | +-----------------+ | 243396 | +-----------------+ 1 row in set (0.00 sec) mysql> select is_used_lock('locked_string'); +-------------------------------+ | is_used_lock('locked_string') | +-------------------------------+ | 243397 | +-------------------------------+ 1 row in set (0.00 sec) mysql> select is_free_lock('locked_string'); +-------------------------------+ | is_free_lock('locked_string') | +-------------------------------+ | 0 | +-------------------------------+ 1 row in set (0.00 sec) mysql> select get_lock('locked_string',600); mysql> show processlist; +--------+------+-----------+--------+---------+------+-----------+--------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +--------+------+-----------+--------+---------+------+-----------+--------------------------------------+ | 243396 | root | localhost | exem_i | Query | 5 | User lock | select get_lock('locked_string',600) | | 243397 | root | localhost | exem_i | Sleep | 179 | | NULL | | 243555 | root | localhost | exem_i | Query | 0 | starting | show processlist | +--------+------+-----------+--------+---------+------+-----------+--------------------------------------+ 3 rows in set (0.00 sec)
  • 32.
    © Copyrights 2001~2016,EXEM CO.,LTD. All Rights Reserved. RENAME TABLE tbl_name1 TO tbl_name2 DROP TABLE tbl_name • 테이블을 RENAME하거나 DROP할 경우 묵시적으로 테이블 명에 Name Lock • RENAME할 경우 기존이름과 변경될 이름에 모두 Lock획득 • TABLE LOCK과 호환성 없음 • SHOW OPEN TABLES 커맨드로 Name_lock이 걸린 테이블 확인 가능 mysql> show open tables from exem_i; +----------+--------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+--------+--------+-------------+ | exem_i | abc | 0 | 0 | | exem_i | t1 | 0 | 0 | | exem_i | myisam | 0 | 0 | | exem_i | foo | 0 | 0 | +----------+--------+--------+-------------+ 4 rows in set (0.00 sec) 2-4. Name Lock
  • 33.
    Research & Contents THANKYOU Blog Video E-mail 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/ 교육 문의: 연구컨텐츠팀 김숙진 edu@ex-em.com © Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.