1. MySQL hard/soft parse 

답)

1) mysql 5.7.19 에서 hard/soft parse에 대한 기능이 있는지 문의
 -  MySQL 은 ORACLE 에서 의미하는 hard/soft parse 에 대한 개념이 없습니다.
 -  모든 쿼리는 parse 단계 이후 (prepared statement 의 사용유무에 따라 다름), 실행계획을 세우는 단계를 모두 거친 후 실행이 됩니다.
    ○ MySQL 의 query cache 가 ORACLE 의 hard/soft parse 와 비슷한 기능 (parse 및 실행계획을 세우는 단계가 없이 결과를 바로 return) 을 가지고 있지만, MySQL 의 query cache 는 ORACLE 과 다르게 "결과값"도 저장하고 있어 완전히 다른 cache 임을 알려드립니다. MySQL query cache 는 테이블의 데이터가 한건이라도 변경되면 관련된 cache 를 모두 해제하게 됩니다.

2) mysql에서 쿼리 작성 시에 bind 변수 처리하여 작성하는 것과 static 변수로 작성하는 방법 간의 차이점이 있는지 문의
 -  쿼리는 일반적으로 MySQL 에 4가지 단계를 거치게 됩니다.
A) parsing
   SQL 구문을 문법에 맞게 분류하는 작업을 진행합니다. (SELECT, WHERE, GROUP BY...)
B) resolution
분류된 SQL 에 대한 정합성을 체크합니다. (관련 table 에 column 이 존재하는지에 대한 유무, subquery 혹은 join 되는 쿼리의 컬럼 정합성 체크)
C) optimization
실제 실행계획은 세우는 단계
D) execution
실제 쿼리가 실행되는 단계

위와 같은 과정에서, prepared statement (bind 변수 처리) 를 사용하신다면 A),B) 의 단계를 스킵할 수 있습니다.

 

2. MySQL 파티션 테이블 생성시 주의사항

답)
1) auto_increment 설정시, 주의사항 (복합 key를 사용할 경우)
     - InnoDB : 복합 primary key 생성시에 첫번째 컬럼으로만 사용 가능 
     - MyISAM : 복합 primary key 생성시에 두번째 컬럼으로도 사용 가능

2) virtual column 생성 및 주의사항
     - 아래와 같은 문법으로 테이블 생성시 사용 가능
     - virtual column으로 partition key로 잡아 사용할 수 없음
예)
 # `emp_dt` int(8) generated always as (DATE_FORMAT(emp_date, '%Y%m%d')) virtual
 #comment 'emp_dt 가상컬럼',

3) auto_increment + partition table 생성시, 주의사항
     - auto_increment 컬럼이 primary key의 첫번째로 오는 것이 기본
     - auto_increment 컬럼을 첫번째에 두지 않을 경우에는 key(인덱스)를 별도로 생성해서 테이블을 만들어야함

4) partiton table에서 date, datetime으로 partiton key를 잡을 경우, 주위사항
     -아래와 같이 2가지 형태로 사용이 가능
     -partition by range (to_days()) ~ partition emp values less than (to_days('2017-08-01 00:00:00')),..
     -partition by range columns () ~ partition emp values less than ('20170801'),..

 

3. MySQL metadata lock과 일반 lock의 차이관련

답)
 - 일반 잠금은 row level lock, table level lock 등
 - 메타 데이터 잠금은 DDL 문만 허용금지 (물리적 블록에 look을 거는 것이 아님)


4. MySQL 5.7.19 SQL HINT 사용

답)
 - use index (IX_EMP01)" 인덱스를 지정하는 hint(USE|FORCE|IGNORE Index)를 사용할 떄
 - 기존에 IX_EMP01 인덱스가 생성되어 있지 않으면 쿼리 수행시 error code: 1176(not exist)이 발생된다.


5. MySQL open_files_limit 파라미터 설정
(8.0.22-commercial MySQL Enterprise Server)

1) /etc/security/limits.conf

mysql hard nofile 65535
mysql soft nofile 65535

2)
[mysql_m:/mysql_data/tmp]$ulimit -Sn
65535
[mysql_m:/mysql_data/tmp]$ulimit -Hn
65535

3) my.cnf

[mysqld_safe]
open_files_limit = 8192

위와 같이 mysql 파라미터가 8192로 설정되어 있습니다.

해당 DB로 접근하여 조회해보면 65535으로 확인되는데
open_files_limit를 설정할 때 my.cnf 를 보고 세팅되지 않고 os 세팅을 기준으로 설정되는 것인지 문의드립니다.

mysql> show global variables like 'open%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 65535 |
+------------------+-------+

답)
-> root로 기동할 경우, my.cnf 에 적용된 값에 따라서 open_files_limit 값이 적용되나 아래의 조건을 따르게 됨
우선적으로는 my.cnf 에 명시된 값으로 설정되지만 그 값이 아래 조건보다 낮으면 아래 조건 중 큰 수로 설정이 됨 
- 10 + max_connections + (table_open_cache * 2)
- max_connections * 5
- open_files_limit value specified at startup, 5000 if none

-> mysql 유저로 기동할 경우 my.cnf 관계없이 OS설정값으로 설정됨(버그여부확인 필요)

 

#Oracle MySQL Q&A Summary (2020)

#Resumen de preguntas y respuestas de Oracle MySQL (2020)

#Oracle MySQL Q&Aまとめ(2020)

#Oracle MySQL问答摘要(2020)

#Oracle MySQL Q & A सारांश (2020)

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 디비버(DBeaver) Tool은 다양해지고 있는 DBMS(Oracle/MySQL/PostgreSQL), NOSQL/Big DATA DB 들에 하나의 SW로 접근하여 개발시에 편리하게 질의를 수행할 수 있도록 도와주는 SW이다.  

 DB의 종류가 달라질때마다 해당되는 SW를 다운로드하여 사용하는 불편함을 디비버는 해결해주고 있으며 가볍고 간단한 사용방법으로 많은 IT종사자들이 사용중인 것으로 알고 있다. 디비버는 커뮤니티 버전과 엔터프라이즈 버전이 존재하며 무료로 커뮤니티 버전을 제공함으로써 많은 사람들에게 열려있고 SW의 패치도 활발하여 빠르게 성장하는 SW이다.

 커뮤니티 버전에 경우에는 튐김현상이나 세션이 자동으로 끊어졌을때 재연결하는 부분등 불편한 부분이 남아있고 DB에 접근할수 있는 항목들이 제한적인 부분과 UI나 데이터 추출 및 확인시에 불편한점이 존재하는데 엔터프라이즈 버전에서는 이러한 부분을 추가적으로 제공하여 더욱 편리하게 사용할 수 있도록 하고 있다.

 엔터프라이즈 버전은 유료로 달러로 금액을 지불해야 다운로드가 가능한데 해외 사이트에서 해당 SW를 크렉하여 무료로 사용할수 있도록 제공하여 소개하려한다.

 

디비버 엔터프라이즈 무료사용방법 (DBeaver Enterprise Free Download)

 

1. 설치파일 다운로드

 - 디비버 Community Edition은 아래 공식사이트를 통하여 무료로 받아 사용할수 있다. 

dbeaver.io/download/

 - 디비버 Enterprise Edition은 Community Edition보다 더 다양한 NoSQL, BigDATA DB에 접근하여 사용이 가능하며 데이터 뷰나 수정, ERD등의 추가적인 기능을 제공한다.

 - 디비버 Enterprise Edition 유로로 다운로드하여 사용할 수 있는 SW인데 크렉을 통하여 무료로 사용가능하도록 제공하는 사이트가 존재한다. 아래 절차대로 다운로드하여 사용하면 된다.                                                           

getintopc.com/softwares/management/dbeaver-enterprise-free-download/

해당 프로그램에 대한 최소 스펙정보가 있으니 참고하여 설치가 필요
위 이미지 절차대로 수행하면 불필요한 광고 없이 다운로드 가능

 

2. 설치 파일 실행 및 설치 완료

 - 다운로드가 완료되면 아래와 같이 패스워드(123)을 입력하여 압축을 풀어준다. 그후에 32비트/64비트에 맞는 설치 파일을 수행하여 설치를 진행한다.

설치 파일확인, Readme에 세팅 방법참고
설치 진행시 설치경로를 기록해 두어야 crack 작업시 수월함

 

3. DBeaver Enterprise 사용인증(crack)

 - 설치 경로 확인 (C:\Users\Invest\AppData\Local\DBeaverEE)

 - 설치파일에 있던 Crack폴더의 dbeaver-agent.jar 파일을 설치 경로로 복사 붙여넣기 한다.

 - 해당 설치경로의 dbeaver.ini 파일을 열어 dbeaver-agent.jar이 위치하고 있는 경로와 파일명을 지정하여 넣고 저장한다.

 - dbeaver.exe 실행파일을 실행하여 SW를 사용한다.

dbeaver-agent.jar 파일을 복사 붙여넣기
dbeaver.ini 파일을 수정
dbeaver 파일 실행

 

해당 설치 파일은 DBeaver Enterprise 6.3 버전으로 최신 버전보다는 낮은 버전이지만 사용하는데 큰 문제는 없는 것 같다.

 

#DBeaver Enterprise

#How to use Debugger Enterprise for free

Oracle
MySQL
PostgreSQL
Ms-SQL
MongoDB
Cassandra
InfluxDB
Redis
Amazon DynamoDB
Google Bigtable
Couchbase
CouchDB

 

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,



Adding MySQL Cluster Data Nodes Online

   

  • MySQL 클러스터 온라인 데이터 노드 추가가 가능하도록 지원을 시작하고 있다.
  • MySQL Cluster Data Nodes Online 추가가 가능한 버전은 MySQL Cluster NDB 6.4.0 (This capability is available in MySQL Cluster NDB 7.0 (beginning with MySQL Cluster NDB 6.4.0) and later MySQL Cluster release series.) 이상부터 가능한 것으로 확인되며 공식문서를 참고하여 문서를 정리하였습니다.

       

Step 1: Update configuration file.

the cluster uses a config.ini file

   

[ndbd default]

…..

[ndbd]

….

Id = 7

HostName = *.*.*.4 (TEST IP)

datadir=/usr/local/mysql-cluster/ndbd-data

ArbitrationRank=3

   

Id = 8

HostName = *.*.*.5 (TEST IP)

datadir=/usr/local/mysql-cluster/ndbd-data

ArbitrationRank=4

   

Step 2: Restart the management server

1) Stop the management server using the management client STOP command, as shown here:

   

ndb_mgm> 10 STOP

Node 10 has shut down.

Disconnecting to allow Management Server to shutdown

   

shell>

   

2) Because shutting down the management server causes the management client to terminate, you must start the management server from the system shell.

shell> ndb_mgmd -f config.ini --reload

2008-12-08 17:29:23 [MgmSrvr] INFO -- NDB Cluster Management Server. 5.1.73-ndb-7.1.36

2008-12-08 17:29:23 [MgmSrvr] INFO -- Reading cluster configuration from 'config.ini'

   

3) status check

   

ndb_mgm> show

Cluster Configuration

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

[ndbd(NDB)] 2 node(s)

id=3 @*.*.*.1 (mysql-5.1.34 ndb-6.3.25, Nodegroup: 0)

id=4 @*.*.*.2 (mysql-5.1.34 ndb-6.3.25, Nodegroup: 0, Master)

id=7 (not connected, accepting connect from 10.0.0.4)

id=8 (not connected, accepting connect from 10.0.0.5)

   

[ndb_mgmd(MGM)] 1 node(s)

id=1 @*.*.*.3 (mysql-5.1.34 ndb-6.3.25)

   

[mysqld(API)] 2 node(s)

id=5 @*.*.*.1 (mysql-5.1.34 ndb-6.3.25)

id=6 @*.*.*.2 (mysql-5.1.34 ndb-6.3.25)

 

Step 3: Perform a rolling restart of the existing data nodes.

ndb_mgm> 1 RESTART

Node 1: Node shutdown initiated

Node 1: Node shutdown completed, restarting, no start.

Node 1 is being restarted

   

ndb_mgm> Node 1: Start initiated (version 7.1.36)

Node 1: Started (version 7.1.36)

   

ndb_mgm> 2 RESTART

Node 2: Node shutdown initiated

Node 2: Node shutdown completed, restarting, no start.

Node 2 is being restarted

   

ndb_mgm> Node 2: Start initiated (version 7.1.36)

   

ndb_mgm> Node 2: Started (version 7.1.36)

   

Step 4: Perform a rolling restart of all cluster API nodes.

shell> mysqladmin -uroot -ppassword shutdown

081208 20:19:56 mysqld_safe mysqld from pid file

/usr/local/mysql/var/tonfisk.pid ended

   

shell> mysqld_safe --ndbcluster --ndb-connectstring=*.*.*.3 &

081208 20:20:06 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.

081208 20:20:06 mysqld_safe Starting mysqld daemon with databases

from /usr/local/mysql/var

   

Step 5: Perform an initial start of the new data nodes.

shell> ndbd -c 10.0.0.3 --initial

ndb_mgm> show

Cluster Configuration

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

[ndbd(NDB)] 2 node(s)

id=3 @*.*.*.1 (mysql-5.1.34 ndb-6.3.25, Nodegroup: 0)

id=4 @*.*.*.2 (mysql-5.1.34 ndb-6.3.25, Nodegroup: 0, Master)

id=7 @*.*.*.7 (mysql-5.1.34 ndb-6.3.25, no nodegroup)

id=8 @*.*.*.8 (mysql-5.1.34 ndb-6.3.25, no nodegroup)

   

[ndb_mgmd(MGM)] 1 node(s)

id=1 @*.*.*.3 (mysql-5.1.34 ndb-6.3.25)

   

[mysqld(API)] 2 node(s)

id=5 @*.*.*.1 (mysql-5.1.34 ndb-6.3.25)

id=6 @*.*.*.2 (mysql-5.1.34 ndb-6.3.25)

   

Step 6: Create a new node group

ndb_mgm> CREATE NODEGROUP 7,8

Nodegroup 1 created

   

ndb_mgm> show

Cluster Configuration

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

[ndbd(NDB)] 2 node(s)

id=3 @*.*.*.1 (mysql-5.1.34 ndb-6.3.25, Nodegroup: 0)

id=4 @*.*.*.2 (mysql-5.1.34 ndb-6.3.25, Nodegroup: 0, Master)

id=7 @*.*.*.7 (mysql-5.1.34 ndb-6.3.25, 1)

id=8 @*.*.*.8 (mysql-5.1.34 ndb-6.3.25, 1)

   

[ndb_mgmd(MGM)] 1 node(s)

id=1 @*.*.*.3 (mysql-5.1.34 ndb-6.3.25)

   

[mysqld(API)] 2 node(s)

id=5 @*.*.*.1 (mysql-5.1.34 ndb-6.3.25)

id=6 @*.*.*.2 (mysql-5.1.34 ndb-6.3.25)

   

Step 7: Redistribute cluster data.

ndb_mgm> all report mem

  Node 2: Data usage is 5%(176 32K pages of total 3200)

  Node 2: Index usage is 0%(76 8K pages of total 12832)

  Node 3: Data usage is 5%(176 32K pages of total 3200)

  Node 3: Index usage is 0%(76 8K pages of total 12832)

   

Node 7: Data usage is 0%(0 32K pages of total 192000)

Node 7: Index usage is 0%(0 8K pages of total 192032)

Node 8: Data usage is 0%(0 32K pages of total 192000)

Node 8: Index usage is 0%(0 8K pages of total 192032)

   

shell> ndb_desc -c *.*.*.3 -d n ips -p

- ips --

Version: 1

Fragment type: 9

K Value: 6

Min load factor: 78

Max load factor: 80

...

   

-- Per partition info --

Partition Row count Commit count Frag fixed memory Frag varsized memory

0 26086 26086 1572864 557056

1 26329 26329 1605632 557056

   

   

1) Table Redistribute

- 대상 테이블명 확인

SELECT TABLE_SCHEMA, TABLE_NAME

FROM INFORMATION_SCHEMA.TABLES

WHERE ENGINE = 'NDBCLUSTER';

   

- 테이블 복제

mysql> ALTER ONLINE TABLE [DB명].[테이블명] REORGANIZE PARTITION;

   

- Redistribute 확인

shell> ndb_desc -d [DB명] [테이블명] -c *.*.*.3:port -pn

shell> ndb_desc -c *.*.*.10 -d n ips -p

-- ips --

Version: 16777217

Fragment type: 9

K Value: 6

Min load factor: 78

Max load factor: 80

-- Per partition info --

Partition Row count Commit count Frag fixed memory Frag varsized memory

0 12981 52296 1572864 557056

1 13236 52515 1605632 557056

2 13105 13105 819200 294912

3 13093 13093 819200 294912

   

ndb_mgm> all report mem

Node 2: Data usage is 5%(176 32K pages of total 3200)

Node 2: Index usage is 0%(76 8K pages of total 12832)

Node 3: Data usage is 5%(176 32K pages of total 3200)

Node 3: Index usage is 0%(76 8K pages of total 12832)

Node 7: Data usage is 2%(80 32K pages of total 3200)

Node 7: Index usage is 0%(51 8K pages of total 12832)

Node 8: Data usage is 2%(80 32K pages of total 3200)

  Node 8: Index usage is 0%(50 8K pages of total 12832)

   

   

[참고 사이트]

원본 위치 <https://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-online-add-node.html>


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,



MySQL Monitor Tool Install

   

  • MySQL Cluster에 따른 node를 많이 생성(global Service의 경우에 3000개까지 구성하는 것을 본적이 있다.)하게 되면 관리적인 측면의 고민하게 된다.MySQL의 경우에 위 MySQL Monitor Tool을 통하여 통합 관리가 가능하도록 지원하고 있다.

  • 해당 Tool에서는 DB 상태 확인부터 성능에 대한 확인까지 다양한 정보를 확인할 수 있는데 Database Activity의 기능을 통하여 부하테스트를 진행할 때 성능 분석 및 개선을 진행한 적이 있었는데 오라클의 ASH(Active Session History)와 비슷한 기능으로 유용하게 사용했던 기억이 있다.

       

  • Manager와 Agent를 설치하여 IP 설정만 하면 어렵지 않게 구성할 수 있다. (아래 내역을 참고하여 진행)

   

0. MySQL 사용자 계정 생성

create user 'TEST'@'%' identified by 'TEST';

   

1. Monitor Manager Install

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

test-mysql-manager

*.*.*.10

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

root@mysql-manager:/mnt/TEST# ./mysqlmonitor-2.3.12.2175-linux-x86_64-installer.bin

Message from syslogd@ at Mon Jan 21 09:55:15 2013 …

   

2. Monitor Agent 1 Install

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

test-mysql1

*.*.*.1

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

root@mysql1:/mnt/TEST# ./mysqlmonitoragent-2.3.12.2174-linux-glibc2.3-x86-64bit-installer.bin --mode text

Language Selection

Please select the installation language

[1] English - English

[2] Japanese - ?¥訿

Please choose an option [1] : 1

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

Welcome to the MySQL Enterprise Monitor Agent Setup Wizard.

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

 ….

   

3. Monitor Agent 2 Install

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

TEST-mysql2

*.*.*.2

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

root@mysql2:/mnt/TEST# ./mysqlmonitoragent-2.3.12.2174-linux-glibc2.3-x86-64bit-installer.bin --mode text

Language Selection

   

Please select the installation language

[1] English - English

[2] Japanese - ?¥訿

Please choose an option [1] : 1

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

Welcome to the MySQL Enterprise Monitor Agent Setup Wizard.

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

Installation directory

   

[참고 사이트]

원본 위치 <http://dev.mysql.com/doc/mysql-monitor/2.3/en/mem-server-install-generic.html>


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,



InnoDB Storage Engine Architecture

   

1.InnoDB Storage Engine 기본 기능

프라이머리 키에 의한 클러스터링

InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링 되어 저장된다.

즉 프라이머리 키 값의 순서대로 디스크에 저장된다는 뜻이며, 이로 인해 프라이머리 키에 의한 레인지 스캔은 상당히 빨리 처리될 수 있다. 결론적으로 쿼리의 실행 계획에서 프라이머리 키는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정(쿼리의 실행 계획에서 다른 보조 인덱스보다 프라이머리 키를 선택될 확률이 높음)된다.

잠금이 필요 없는 일관된 읽기(Non-locking consistent read)

MVCC(Multi Version Concurrency Control)라는 기술을 이용해 락을 걸지 않고 읽기 작업을 수행(Undo 활용)

외래 키 지원

MyISAM이나 Memory 테이블에서는 사용할 수 없다.

부모, 자식 테이블 간에 데이터 Check하는 작업으로 인하여 락, 데드락이 발생될 때가 많다.

자동 데드락 감지

그래프 기반의 데드락 체크 방식을 사용하기 때문에 데드락이 발생함과 동시에 바로 감지되고, 감지된 데드락은 관련 트랙잭션 중에서 Rollback이 가장 용이한 트랜잭션을 자동적으로 강제 종료해 버린다. => 실제로는 완벽하지는 않을 듯.

자동화된 장애 복구

Mysql서버가 시작될 때, 완료되지 못한 트랜잭션이나 디스크에 일부만 기록된 데이터 페이지(Partial Write)등에 대한 일련의 복구 작업이 자동으로 진행된다. (SMON,PMON과 비슷한 역할을 내역이 있는 듯)

오라클의 아키텍처 적용

Oracle DBMS와 비슷한 부분이 많다.(UNDO, SYSTEM TBS, TBS 등)

   

   

2.InnoDB Architecture

Oracle VS MySQL

  • Oracle과 흡사한 형태이지만 MySQL은 Storage의 선택에 따라 세부 구조가 달라진다. 주로 RDBMS로 InnoDB가 사용되는데 Oracle 구조와 비슷한 형태인 것을 확인할 수 있다. (아래 상세 구성도 확인)

   

MySQL InnoDB 상세구조

1) InnoDB 전체 구성도

  • 사용자는 mysqld를 통하여 InnoDB에 접근하게 되며 Buffer Pool, Storage의 Access를 통하여 RDBMS의 Transaction이 발생됩니다.

 

   

2) Buffer Pool & 기타 Caching 영역

  • Buffer Pool

    가장 핵심적인 부분으로 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간 MyISAM 키 캐시가 인덱스의 캐시만을 주로 처리하는데 비해 InnoDB의 버퍼 풀은 데이터와 인덱스 모두 캐시하고 쓰기 버퍼링의 역할까지 모두 처리함.

    Innodb_buffer_pool_size 설정 중요

    OS를 고려하여 50~80%수중으로 메모리 크기 설정

    Oracle과 비슷하게 바로 변경된 사항에 대하여 디스크에 반영하지 않고 메모리에만 변경를 먼저 변경한 뒤, 디스크에 기록되지 않는 변경된 데이터를 가지고 있다(더티 페이지)

    체크포인트가 발생되면 Write 스레드가 필요한 만큼 디스크로 기록 진행

    Oracle Buffer Cache 영역과 비슷한 기능

       

  • Undo log

    트랜잭션의 롤백 대비용

    트랜잭션의 격리 수준을 유지하면서 높은 동시성을 제공하는 데 사용된다.

    Oracle 과 다르게 별도의 TBS가 아닌 System TBS에서 관리하는 것으로 구조상으로는 확인됩니다.

    Oracle UNDO TBS 와 비슷한 기능

       

  • Insert Buffer

    Data Insert, Update에 따른 변경작업이 발생될 때 인덱스에도 해당 내역을 반영해야 하는데 해당 테이블에 인덱스가 많다면, 이 작업 시 랜덤하게 디스크를 읽은 작업을 하면서 상당히 많은 자원을 소모하기 때문에 별도의 Insert Buffer공간(임시공간)을 만들어 성능 향상

    Innodb_change_buffering 파라미터로 설정

    MySQL 5.5이전 버전은 Insert까지만 지원, 이후에는 Insert, Delete로 인해 키를 추가하거나 삭제하는 작업에 대해서도 버퍼링이 될 수 있도록 개선 => Update의 경우는 확인이 필요할 듯.

    0.인덱스 페이지가 버퍼 풀에 있으면 바로 업데이트 수행

    1. 임시 공간(Insert Buffer)에 필요한 데이터를 디스크에서 읽어 와서 데이터 변경작업 진행

    2. 인덱스 레코드가 조작된 조각은 이후 백그라운드 스레드에 의해 병합되는데 이 스레드를 버퍼 머지 스레드라고 한다.

    3. 완료 (Oracle의 PGA + TEMP와 비슷한 기능)

   

3) Log Buffer & Redo Log

   

  • Commit시 바로 Disk 에 변경된 데이터 조작을 하지않고 ACID(원자성,일관성,격리성,데이터 유지)를 보장하면서 체크포인트가 발생할 경우 일괄적으로 반영하는 형태로 부하를 줄이기 위한 기능
  • 자동화된 자동 복구시 해당 Redo log를 확인하여 복구 진행
  • 로그 버퍼의 크기는 일반적으로 1~8MB 수전으로 설정 (단, BLOB이나 TEXT와 같은 큰데이터를 자주 변경한다면 더 크게 설정하는 것이 좋다)
  • Oracle Redo log file과 log buffer 영역과 비슷한 기능

   

3. MySQL 기본 명령어

MySQL START / STOP

[root@localhost mysql]# /etc/init.d/mysqld stop

Stopping mysqld: [ OK ]

[root@localhost mysql]# /etc/init.d/mysqld start

   

MySQL Password 변경 및 Login

[root@localhost mysql]# mysqladmin -u root password 새비밀번호

[root@localhost mysql]# mysql -uroot -p => 패스워드 입력

   

MySQL 기본 정보 검색

show databases;

show variables like 'have_innodb';

select version();

show engines;

select @@innodb_version;

show plugins;

show variables where Variable_Name LIKE "innodb_buffer%";

show variables where Variable_Name LIKE "innodb_change_buffering%";

show variables where Variable_Name LIKE "innodb_log%";

show variables where Variable_Name LIKE "%innodb_write_io_threads%";

   

SHOW VARIABLES WHERE Variable_Name LIKE "%dir";

/var/lib/mysql

mysql 8350 8143 0 03:25 pts/1 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock

   

[접속 IP 권한 할당]

mysql> GRANT ALL PRIVILEGES ON *.* TO root@'ip주소' IDENTIFIED BY '비밀번호'' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO root@192.168.22.123 IDENTIFIED BY 'mysql' WITH GRANT OPTION;

   

mysql> show information_schema

mysql> SHOW TABLES;

mysql> DESC 테이블이름;

mysql> DESCRIBE 테이블이름;

mysql> EXPLAIN 테이블이름;

  

 

MySQL 기본 Dictionary 조회

[현재 DB 전체 Size 확인]

mysql> SELECT table_schema "Database Name",

-> SUM(data_length + index_length) / 1024 / 1024 "Size(MB)"

-> FROM information_schema.TABLES

-> GROUP BY table_schema;

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

| Database Name | Size(MB) |

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

| information_schema | 0.00390625 |

| mysql | 0.52499485 |

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

2 rows in set (0.04 sec)

   

mysql>

   

   

mysql> SELECT

-> count(*) NUM_OF_TABLE,

-> table_schema,concat(round(sum(table_rows)/1000000,2),'M') rows,

-> concat(round(sum(data_length)/(1024*1024*1024),2),'G') DATA,

-> concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx,

-> concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size,

-> round(sum(index_length)/sum(data_length),2) idxfrac

-> FROM information_schema.TABLES

-> GROUP BY table_schema

-> ORDER BY sum(data_length+index_length) DESC LIMIT 10;

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

| NUM_OF_TABLE | table_schema | rows | DATA | idx | total_size | idxfrac |

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

| 18 | mysql | 0.00M | 0.00G | 0.00G | 0.00G | 0.14 |

| 17 | information_schema | NULL | 0.00G | 0.00G | 0.00G | NULL |

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

2 rows in set (0.00 sec)

   

mysql>

[특정 Table 사이즈 확인]

mysql> SELECT

-> concat(table_schema,'.',table_name),

-> concat(round(table_rows/1000000,2),'M') rows,

-> concat(round(data_length/(1024*1024*1024),2),'G') DATA,

-> concat(round(index_length/(1024*1024*1024),2),'G') idx,

-> concat(round((data_length+index_length)/(1024*1024*1024),2),'G') total_size,

-> round(index_length/data_length,2) idxfrac

-> FROM information_schema.TABLES

-> where table_name = 'events_statements_current' ;

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

| concat(table_schema,'.',table_name) | rows | DATA | idx | total_size | idxfrac |

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

| mysql.TEST | 0.00M | 0.00G | 0.00G | 0.00G | 93.09 |

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

1 row in set (0.00 sec)

[특정 스키마 테이블 정보 확인]

mysql> SELECT table_name, table_type, engine

-> FROM information_schema.tables

-> WHERE table_schema = 'mysql'

-> ORDER BY table_name DESC;

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

| table_name | table_type | engine |

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

| user | BASE TABLE | MyISAM |

| time_zone_transition_type | BASE TABLE | MyISAM |

| time_zone_transition | BASE TABLE | MyISAM |

| time_zone_name | BASE TABLE | MyISAM |

| time_zone_leap_second | BASE TABLE | MyISAM |

| time_zone | BASE TABLE | MyISAM |

| TEST | BASE TABLE | MyISAM |

| tables_priv | BASE TABLE | MyISAM |

| procs_priv | BASE TABLE | MyISAM |

| proc | BASE TABLE | MyISAM |

| host | BASE TABLE | MyISAM |

| help_topic | BASE TABLE | MyISAM |

| help_relation | BASE TABLE | MyISAM |

| help_keyword | BASE TABLE | MyISAM |

| help_category | BASE TABLE | MyISAM |

| func | BASE TABLE | MyISAM |

| db | BASE TABLE | MyISAM |

| columns_priv | BASE TABLE | MyISAM |

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

18 rows in set (0.00 sec)

[성능 분석 Setting]

SHOW VARIABLES LIKE 'perf%';

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

| Variable_name | Value |

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

| performance_schema | OFF |

   

/etc/my.cnf

UPDATE performance_schema.setup_consumers SET enabled = 'YES' WHERE name like 'events_waits%';

   

SELECT * FROM INFORMATION_SCHEMA.ENGINES

WHERE ENGINE='PERFORMANCE_SCHEMA'\G;

SHOW ENGINES\G;

   

[TOP 5 Wait EVENT]

select event_name, count_star, sum_timer_wait from performance_schema.

events_waits_summary_global_by_event_name where event_name like

'wait/synch/mutex/innodb%' and count_star > 0 order by sum_timer_wait desc limit 5;

   

[Slow SQL 추출]

# vi /etc/my.cnf

[mysqld]

log-slow-queries = /usr/local/mysql/var/mysql-slow.log

long_query_time = 3

위 내용은 쿼리 타임이 '3초'를 초과 하는 쿼리에 대해 /usr/local/mysql/var/mysql-slow.log파일에 기록 한다는 뜻입니다.

my.cnf에 설정 및 mysql을 Restart 한 뒤 운영 하다 보면 아래와 같이 slow-query-log가 남게 됩니다.

[mysql-slow.log파일]

use iamroot;

select max(wr_comment) as max_comment from g4_write_ja

where wr_parent = '92' and wr_is_comment = 1;

# Time: 120809 16:08:15

# User@Host: iamroot[iamroot] @ []

# Query_time: 253 Lock_time: 0 Rows_sent: 1 Rows_examined: 419562

select max(wr_comment) as max_comment from test1

where wr_parent = '92' and wr_is_comment = 1;

# Time: 120809 16:08:17

# User@Host: iamroot[iamroot] @ []

# Query_time: 94 Lock_time: 0 Rows_sent: 0 Rows_examined: 640675

use iamroot;

SELECT count(*) from emp where boardcode=1045552594 and boardidx=274;

# Time: 120809 16:08:23

# User@Host: iamroot[iamroot] @ []

# Query_time: 183 Lock_time: 0 Rows_sent: 1 Rows_examined: 268576

   

[로그 내용 중 각 항목에 대한 설명]

Query_time : 쿼리 수행시간

Lock_time : 테이블 LOCK 이 걸린시간

Row_sent : 쿼리 처리 결과 ROW 수

Rows_examined : 쿼리 처리 대상의 ROW 수

   

[참고 자료 및 사이트]

https://www.mysql.com/

http://www.oracle.com/technetwork/database/mysql/index.html

http://www.slideshare.net/morgo/inno-db-presentation

Real MySQL Book

   


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,