용도

DBA 업무를 하다보면  db 상태라든지 점검을 위한  sql 문들을  많이들 갖고 있을 텐데  필요한 순간마다 매번 찾아서  쿼리 실행기(mysql cli 나 기타 gui tool등) 를 통해서  copy 후 실행하는 방식은  좀 불편하였다.

이를 간편하게 하기 위해서 평소 활용도가 높거나 유용한  쿼리들을 번호만 입력하면 쉽게 실행할 수 있고  Enter 키만 치면 반복해서 실행하도록 하는 shell script 를 작성하였다.

본인들이 소장하고 있는  쿼리문을   shell script 에  계속 추가해 나갈 수 있다.

 

실행방법 

$ sh mymon.sh

 

실행 화면

 

서브메뉴 실행화면

 

소스 다운로드

https://github.com/bsshin71/mymon

 

GitHub - bsshin71/mymon: shell script for monitoring MySQL

shell script for monitoring MySQL. Contribute to bsshin71/mymon development by creating an account on GitHub.

github.com

 

지원 기능 상세

기능대분류 메뉴명 호출 sql파일 기능 비고
1.GENERAL 11 - Instance/Database Info 1_instance.sql
  • db 버전
  • uptime
  • character set
  • 간단한 db 부하 load
 
   12 - Parameter Info (innodb buffer)     1_parameters.sql
  • innodb_buffer_pool 관련 파라미터 값
 
  13 - Memory Usage by each module  1_memoryusage.sql
  • thread 당 메모리 사용량
  • event 별 메모리 사용량
 
 2.Cache & Latch    21 - Buffer Hit Ratio 2_bufferhitratio.sql
  • buffer hit ratio
 
 3.SESSION 31 - Current Session Info  3_current_session.sql
  • 현재 세션 통계
    • 호스트별
    • 유저별
    • processlist 정보
 
   32 - Current Running Session Info  3_run_session.sql
  • 현재 실행중인 세션정보
 
  33 - Current Wait Session Info 3_wait_session.sql
  • lock wait 으로 대기중인 세션정보
 
  34 - Running Session SQL Info 3_run_session_sql.sql
  • 현재 쿼리 실행중 상태인 세션의 쿼리 수행 정보
 
4.LOCK 41  - Current Transaction 4_current_transaction.sql
  • 현재 executing 상태( wait commit ) 상태인 statement / 세션 정보
 
   42  - Current Lock status  of Grant and Wait  4_lock_grant_wait.sql
  • Lock grant 및 Lock wait 상태인 statement 관계 표시
 
  43  - Waiting commit session info  4_waiting_commit_session.sql
  • commit 대기중인 세션/statement 정보
sys.session 의 trx_state가 'ACTIVE' 인 세션정보
   44  - Waiting commit Transaction info (require time)  4_waiting_commit_transaction.sql
  • 지정된 시간이상 commit wait 상탳인 세션/statement 정보
지정시간 입력값 필요
  45  - Meta Locking Session Info 4_meta_lock_session.sql
  • Meta lock 을 잡고 있는 세션/statement 정보
 
  46  - Waiting Session by table lock 4_wait_session_by_tablelock.sql
  • Metal lock 에 의해서 blocking 된 상태인 세션/statement 정보
 
  47  - All Lock Wait stat by table (sort by avg)  4_all_lockwait_stat_by_table_sortby_avg.sql
  • avg lock wait time 상위 20개인 테이블 및 lock wait time 정보
 
   48  - All Lock Wait stat by table (sort by sum) 4_all_lockwait_stat_by_table_sortby_sum.sql
  • sum lock wait time 상위 20개인 테이블 및 lock wait time 정보
 
  49  - Write Lock Wait stat by table (sort by avg) 4_write_lockwait_stat_by_table_sortby_avg.sql
  • write lock wait 타임중 average write lock time이 상위 20인 테이블 및 lock wait 시간 정보
 
  491 - Write Lock Wait stat by table (sort by sum) 4_write_lockwait_stat_by_table_sortby_sum.sql
  • write lock wait 타임중 sum write lock time이 상위 20인 테이블 및 lock wait 시간 정보
 
 5.Wait Event 51 - Most time used Wait Event by AvgTime  5_most_timeused_waitevent_avg.sql
  • wait event 중 average wait 시간이 상위 10인 event 정보
 
  52 - Most time used Wait Event by SumTime 5_most_timeused_waitevent_sum.sql
  • wait event 중 sum wait 시간이 상위 10인 event 정보
 
  53 - Most time used Wait Event by MaxTime 5_most_timeused_waitevent_max.sql
  • wait event 중 max wait 시간이 상위 10인 event 정보
 
6.I/O  61 - Event I/O by avg WaitTime 6_fileio_by_eventname_avg.sql
  • file I/O 관련 event 중 avg wait time 이 상위 15개인 event 정보
디스크 병목시 원인 추적시 활용
  62 - Event I/O by sum WaitTime 6_fileio_by_eventname_sum.sql
  • file I/O 관련 event 중 sum wait time 이 상위 15개인 event 정보
 
  63 - File I/O by avg WaitTime 6_fileio_by_instance_avg.sql
  • instance Level 에서 i/O average wait time 이 상위 20인 파일 파일 정보
 
  64 - File I/O by sum WaitTime 6_fileio_by_instance_sum.sql
  • instance Level 에서 i/O sum wait time 이 상위 20인 파일 파일 정보
 
  65 - Table I/O by avg WaitTime 6_tableio_by_table_avg.sql
  • i/O average wait time 이 상위 20인 테이블정보
 
  66 - Table I/O by sum WaitTime 6_tableio_by_table_sum.sql
  • i/O sum wait time 이 상위 20인 테이블정보
 
  67 - Index I/O by avg WaitTime 6_indexio_by_index_avg.sql
  • i/O average wait time 이 상위 20인 테이블/ INDEX 정보
 
   68 - Index I/O by sum WaitTime 6_indexio_by_index_sum.sql
  • i/O sum wait time 이 상위 20인 테이블/ INDEX 정보
 
7.DML statistics   71 - Top slow query-digest by avg of exec time 7_topslow_query_digest_by_avg.sql
  • average 수행시간 상위 20인 쿼리 ( digest 형식)
 
  72 - Top slow query-digest by sum of exec time 7_topslow_query_digest_by_sum.sql
  • sum 수행시간 상위 20인 쿼리 ( digest 형식)
 
  73 - Top slow query history by duration  7_topslow_queryhistory_by_duration.sql
  • 전체 수행 시간 상위 20인 수행 완료된 쿼리
 
  74 - Most executed query  7_most_exec_query.sql
  • 수행 횟수 상위 20인 쿼리
 
  75 - Most row examined query  7_most_row_examined_query.sql
  • row 스캔(examined) 횟수 상위 20인 쿼리
 
8. Space & Usage 81 - Database Usage 8_database_usage.sql
  • 데이터베이스별 전체/data/index/free 공간 및 테이블 갯수
 
  82 - Top table Usage 8_top_table_usage.sql
  • 테이블 사용량 상위 20인 테이블 정보
 
   83 - Top index Usage 8_top_index_usage.sql
  • 인덱스 사용량 상위 30인 인덱스 이름 / 사용량 정보
 
  84 - Top partition table Usage 8_top_partition_table_usage.sql
  • 사용량 상위 30 파티션테이블 이름 / 사용량 정보
 
  85 - Redo dir Disk Usage ( only possible local) 8_redolog_dir.sql 
sub-script:disk_usage.sh 
  • redo directory 의 vg 그룹 사용량 정보
 
  86 - Datafile dir Disk Usage ( only possible local) 8_datafile_dir.sql  sub-script:disk_usage.sh
  • data directory 의 vg 그룹 사용량 정보
 
  87 - Temp dir Disk Usage ( only possible local) 8_tmp_dir.sql  sub-script:disk_usage.sh 
  • temp directory 의 vg 그룹 사용량 정보
 
 9. Replication    91 - Connected Slave hosts 9_connected_slave_hosts.sql
  • master 서버에 접속한 slave 서버 정보 ( master 관점)
 
  92 - Master Server info  9_master_server_info.sql
  • master 서버 정보 ( slave 관점 )
 
  93 - Show slave status 9_show_slave_status.sql 
sub-script:slave_status.sh
  • replication slave 상태 정보 ( slave 기준)
 
  94 - Replication Lag (auto repeat)  9_show_slave_status.sql  sub-script:show_delta.sh  

  • replication lag 정보를 1 초 단위로 현재값 증가값을 반복해서 표시( slave 기준)
 
 10. Status 101 - Thread status 10_thread_status.sql
  • mysql connection thread 상태별 갯수 표시
 
  102 - Replication status  10_replication_status.sql
  • replication semi sync 관련 상태 정보
 
   103 - DML execution status (auto repeat)     10_dml_execution_status.sql  sub-script:show_multi_delta.sh  
  • dml 종류별 row 수행건수를 1초 단위로 현재값/증가값 반복패서 표시
 
20. Plan & Index 201 - Unused Index  20_unused_index_status.sql
  • 사용하지 않는 인덱스 명 출력
 
  202 - Tables with full table scan 20_tables_with_fullscan.sql
  • full table scan 이 일어나는 테이블이 fulls scan 횟수 및 수행시간
 
   203 - Statement with full table scan  20_statement_with_fullscan.sql
  • full scan 이 발생한 수행시간 상위 20개 쿼리정보
 
30. Performance_schema Configuration 301. Show Performance_schema variable 30_perf_variables.sql
  • performance_schema 테이블 관련 현재 설정 정보
 
  302. Show Performacne_schema setup_consumer 30_perf_setup_consumer.sql
  • Performacne_schema setup_consumer의 설정정보
  • 현재 수집되는 정보표시
 
  303. Enable Performance_schema support statement history_long   30_enable_history_long.sql
  • events_statements_history/history_long  테이블 수집기능 enable 함
 
  304. Disable Performance_schema support statement history_long 30_disable_history_long.sql
  •  events_statements_history_long 테이블 수집기능 disable 함
 
  305. flush status (=reset status )  30_flush_status.sql
  • flush status 수행해서 status 관련 정보를 reset함
 
  306. Truncate all performance_schema table( reset all) 30_ps_truncate_all_table.sql
  • performance_schema 관련 테이블을 truncate하여 reset 함
 

'DBMS > MySQL' 카테고리의 다른 글

최적화  (0) 2019.07.18

[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, Cluster

 

https://www.slideshare.net/ienvyou/day-2-mysql-tuning-replication-cluster

 

[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, Cluster

MySQL 최적화 ㅇ 최적화 간략 소개 ㅇ 파티셔닝 ㅇ Thread pool ㅇ 테이블 유지보수 ㅇ 테이블 검사, 최적화, 복구 MySQL Replication ㅇ Replication 소개 ㅇ Replication 구성방법 ㅇ Replication tuning 방법 …

www.slideshare.net

 

'DBMS > MySQL' 카테고리의 다른 글

mysql 모니터링을 위한 shell script  (0) 2024.08.21





'DBMS > DB 모델링' 카테고리의 다른 글

보이스코드 정규화  (0) 2018.08.13
3차 정규화 및 정규화 설명 잘된 곳  (0) 2018.08.13
2차 정규화  (0) 2018.08.13
1차 정규화  (0) 2018.08.13


보이스-코드 정규화 

데이블에 존재하는 식별자가 여러 개 존재할 경우 식별자가 중복되어 나타나는 현상을 제거 


정규화5.png


주식별자 후보 : 납품업체코드 + 제품코드

                       납품회사명 + 제품코드 

이 중 하나를 선택하면 3차 정규화까지 만족하게 된다. 


정규화6.png

'DBMS > DB 모델링' 카테고리의 다른 글

데이터모델링 과정  (0) 2019.03.14
3차 정규화 및 정규화 설명 잘된 곳  (0) 2018.08.13
2차 정규화  (0) 2018.08.13
1차 정규화  (0) 2018.08.13


http://databaser.net/moniwiki/wiki.php/%EC%A0%95%EA%B7%9C%ED%99%94%EC%9D%98%EC%9D%B4%ED%95%B4





 3차 정규화 

한 엔티티 안의 모든 주식별자가 아닌 속성들은 주식별자에 의존해야 한다. 속성에 종속적인(이전종속) 속성이 있다면 분리해야 한다. 




정규화3.png


고객번호 -->  수출여부 + 사업자번호+우선순위   종속적이다.

3차 정규화하면

정규화4.png



3차 정규화 다른 예




'DBMS > DB 모델링' 카테고리의 다른 글

데이터모델링 과정  (0) 2019.03.14
보이스코드 정규화  (0) 2018.08.13
2차 정규화  (0) 2018.08.13
1차 정규화  (0) 2018.08.13

1. 사례 



2. 사례



다른예





'DBMS > DB 모델링' 카테고리의 다른 글

데이터모델링 과정  (0) 2019.03.14
보이스코드 정규화  (0) 2018.08.13
3차 정규화 및 정규화 설명 잘된 곳  (0) 2018.08.13
1차 정규화  (0) 2018.08.13


1차 정규화

복수의 속성값을 갖는 속성을 분리



중복된 칼럼의 별도의 엔터티로 분리해 낸다.






다른 예






다른예












'DBMS > DB 모델링' 카테고리의 다른 글

데이터모델링 과정  (0) 2019.03.14
보이스코드 정규화  (0) 2018.08.13
3차 정규화 및 정규화 설명 잘된 곳  (0) 2018.08.13
2차 정규화  (0) 2018.08.13


모 프로젝트에서 개발자들로부터  튜닝 요청받은 쿼리 중에서  가장 많은  패턴중 하나가


아래와 같이  select target 절에   사용자 함수를 사용한 경우임.  


사용자 함수를 함부로 사용하지 못하도록 프로젝트 시작시 rule 을 만들어야 하는 게 아닌가 할 정도로  SQL 성능 저하의 주요 원인 중 하나였음.


DB : tibero


1. 유형

  사용자 함수를 아래와 같이 select 절에 사용하는 경우임.

select

             ....

           ,  JISA_NAME( A.JISA_code )   지사이름

             ....

from   자금지원이력 A

where   A.기간 between  sysdate -10/24/60  and  sysdate

group by  A.region



2. 병목 원인

  * 사용자 함수는  recursive call 로  느림

  * 최종 결과 건수에 상관없이 조건절에 부합하는 전체 레코드 건수 만큼 함수 호출이 발생함.

 


3. 튜닝방법

  1)   최종 결과 집합에서만  함수 호출이 일어나도록 하는 방법

     select  

                ...

               , JISA_NAME( jisa_code )  지사이름

     from (

                  select     /*+ no_merge */

                              A.region

                            , A.jisa_code

                            ....

                  from  자금지원이력 A

                 where   A.기간 between  sysdate -10/24/60  and  sysdate

                 group by  A.region

             )


 2)  decode  함수 또는 case 문으로 변환

       함수 로직이 계산식이 주일 경우

 3)  함수를 풀어서   inner join 또는 outer join 으로 변경

       select

                  B.JISA_NAME

       from 자금지원이력 A,  지사이름 B

       where  A.jisa_code = B.jisa_code

      and   A.기간 between  sysdate -10/24/60  and  sysdate

      group by  A.region


 4)  스칼라 서브쿼리 캐싱 효과를 이용

     oracle 은  select 함수명 from dual  구문으로 호출하면 서브쿼리 캐싱 효과를 얻을 수 있음.  

     tibero 의 경우는  from dual 구문을 사용하지 않아도 plan 상으로는  sub쿼리 caching 표시가 되나 실제도 캐싱되는지는 확실하지 않음.

     oracle 과 동일하게 구현되었다면   from dual 구문을 사용하면  성능 효과를 볼 수 있을 듯 하다.

     

     함수의 결과값의 종류가 적을 때 사용가능하다.

     from (

                select  /*+ NO_MERGE */

                       ( select JISA_NAME(A.JISA_code ) from dual ) 지사이름

       .....

 5) Deterministic 함수로 캐싱 효과

     오라클에서 지원함.

     함수 생성시  deterministic 구문 명시하면 서브쿼리 캐싱 효과를 낼 수 있음.


    함수 생성시   

      create   or replace funciton JISA_NAME( p_jisacode  varchar )  return varchar  DETERMINISTIC 

         ...    




'DBMS > SQL(쿼리튜닝)' 카테고리의 다른 글

선택적 검색 조건에 사용할 수 있는 기법  (0) 2018.05.01

1. 전체적인 lock 대기 상황 모니터링 쿼리

select l.session_id SID ,(case when lock_type = 'Transaction' then 'TX' when lock_type = 'DML' then 'TM' end) TYPE , mode_held , mode_requested mode_reqd ,(case when lock_type = 'Transaction' then to_char(trunc(lock_id1/power(2,16))) when lock_type = 'DML' then (select object_name from dba_objects where object_id = l.lock_id1) end) "USN/Table" ,(case when lock_type = 'Transaction' then bitand(lock_id1, to_number('ffff', 'xxxx')) + 0 end) "SLOT" ,(case when lock_type = 'Transaction' then to_number(lock_id2) end) "SQN" ,(case when blocking_others = 'Blocking' then ' <<<<<' end) Blocking from dba_lock l where lock_type in ('Transaction', 'DML' ) order by session_id, lock_type, lock_id1, lock_id2

2. 현재 유저의 lock 상태 조회쿼리

select username, v$lock.sid, id1, id2 , lmode, request, block, v$lock.type from v$lock, v$session where v$lock.sid = v$session.sid and v$session.username = USER



1.  불필요하게 커멋을 자주 수행하지 않는다.


2.  fetch across commit 형태의 프로그램 작성을 피해 다른 방식으로 구현한다. ANSI

표준에 따르면 커맛 이전에 열려 있던 커서는 더는 Fetch 하면 안 된다. 다른 방식으

로 구현하기 어렵다면 커빗 횟수를 줄여본다.


3.  트랜잭션이 몰리는 시간대에 오래 걸리는 쿼리가 같이 수행되지 않도록 시간을 조정

한다.


4. 큰 테이블을 일정 범위로 나누어 읽고 단계적으로 실행할 수 있도록 코딩한다.

Snapshot too old 발생 기능성을 줄일 뿐 아니라 문제가 발생했을 때 특정 부분부

터 다시 시작할 수도 있어 유리하다. 물론 그렇게 해도 읽기 일관성에 문제가 없을

때에만적용해야한다



5. 오랜 시간에 걸쳐 같은 블록을 여러 번 방문하는 Nested Loop 형태의 조인문 또는

인텍스를 경유한 테이블 액세스를 수반하는 프로그램이 있는지 체크하고, 이를 회피

할 수 있는 방법(조인 메소드 변경, F비I Table Scan 등)을 찾는다.



6. 소트 부하를 감수하더라도 order by 등을 강제로 삽입해 소트연산이 발생하도록 한

다. 많은 데이터를 오랜 시간에 걸쳐 Fetch 하는 동안 Undo 정보를 지속적으로 참

조하기 때문에 문제가 발생하는 것이므로, 서버 내에서 빠르게 데이터를 읽어 Temp

세그먼트에 저장하는 데에만 성공하면 이후에는 같은 블록을 아무리 재방문하더라

도 더는 에러가 발생할까 걱정하지 않아도 된다.


7. 만약 delayed 블록 클린아웃에 의해 Snapshot too old가 발생하는 것으로 의심되면

대량 업데이트 후에 곧바로 해당 테이블에 대해 Full Scan 하도록 쿼리를 날리는 것

도 하나의 해결방법이 될 수 있다


sel ect 1*+ ful l(t) *1 count(* ) from table name t


+ Recent posts