공부하다가 오라클의 Trace 의 개념으로 예상되는 부분을 찾았다.

show engine innodb status

 -> InnoDB 에 대한 현재 상태를 확인할 수 있는 명령어

  • Semaphores
  • Transactions
  • File I/O
  • Insert Buffer and Adaptive Hash Index
  • Buffer pool and memory
  • Row operations
  • Lastest Detected deadlock
    • Deadlock 발생 시 해당 항목 확인
    • Transaction 정보를 표시
    • Waiting for this lock to be Granted (트랜잭션이 실행하기 위해 lock 을 걸어야 하는 데이터에 대한 정보, row에 대한 정보를 표시
    • Holds the lock(s) (현재 잡고있는 lock 의 정보)
  • Lastest Foreign key error

이론도 중요하지만 당장 테스트 해 보았다.


2개의 Session 에 대해서 lock 을 걸어 보았다.


※ MySQL 5.7 InnoDB on Windows 이며, 전부 Default 로 설정 하였다.

 

Lock 을 발생하기 위해서는 autocommit 을 반드시 off 인지 확인해 보자


mysql> show variables like '%commit%';

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

| Variable_name                           | Value |

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

| autocommit                              | OFF   |

| binlog_group_commit_sync_delay          | 0     |

| binlog_group_commit_sync_no_delay_count | 0     |

| binlog_order_commits                    | ON    |

| innodb_api_bk_commit_interval           | 5     |

| innodb_commit_concurrency               | 0     |

| innodb_flush_log_at_trx_commit          | 1     |

| slave_preserve_commit_order             | OFF   |

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

8 rows in set, 1 warning (0.00 sec)


양쪽 session 에서 동일한 데이터에 update 를 하여 Lock 을 발생 후 확인해 보자


1번 session

mysql> update test1 set txt='4' where id =1;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from employees.test1;

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

| id | txt |

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

|  1 | 4   |

|  2 | 2   |

|  3 | 3   |

|  5 | 5   |

|  6 | 7   |

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

5 rows in set (0.00 sec)



2번 session

mysql> select * from test1;

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

| id | txt |

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

|  1 | 1   |

|  2 | 2   |

|  3 | 3   |

|  5 | 5   |

|  6 | 7   |

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

5 rows in set (0.00 sec)


mysql> update test1 set txt='3' where id=1;

mysql> show engine innodb status \G;

*************************** 1. row ***************************

  Type: InnoDB

  Name:

Status:

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

2016-06-02 15:41:56 0x2b84 INNODB MONITOR OUTPUT

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

Per second averages calculated from the last 24 seconds

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

BACKGROUND THREAD

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

srv_master_thread loops: 2 srv_active, 0 srv_shutdown, 421 srv_idle

srv_master_thread log flush and writes: 423

----------

SEMAPHORES

----------

OS WAIT ARRAY INFO: reservation count 15

OS WAIT ARRAY INFO: signal count 14

RW-shared spins 0, rounds 54, OS waits 5

RW-excl spins 0, rounds 0, OS waits 0

RW-sx spins 0, rounds 0, OS waits 0

Spin rounds per wait: 54.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx

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

TRANSACTIONS

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

Trx id counter 17161

Purge done for trx's n:o < 16713 undo n:o < 0 state: running but idle

History list length 60

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 17160, ACTIVE 32 sec starting index read

mysql tables in use 1, locked 1

LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)

MySQL thread id 2, OS thread handle 11152, query id 23 localhost ::1 root updating

update test1 set txt='3' where id=1

------- TRX HAS BEEN WAITING 32 SEC FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 80 page no 3 n bits 72 index PRIMARY of table `employees`.`test1` trx id 17160 lock_mode X locks rec but not gap waiting

Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

 0: len 4; hex 80000001; asc     ;;

 1: len 6; hex 000000004307; asc     C ;;

 2: len 7; hex 270000022302e9; asc '   #  ;;

 3: len 1; hex 34; asc 4;;


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

---TRANSACTION 17159, ACTIVE 94 sec

2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1

MySQL thread id 3, OS thread handle 11140, query id 24 localhost ::1 root starting

show engine innodb status

Trx read view will not see trx with id >= 17159, sees < 17159

--------

FILE I/O

--------

I/O thread 0 state: wait Windows aio (insert buffer thread)

I/O thread 1 state: wait Windows aio (log thread)

I/O thread 2 state: wait Windows aio (read thread)

I/O thread 3 state: wait Windows aio (read thread)

I/O thread 4 state: wait Windows aio (read thread)

I/O thread 5 state: wait Windows aio (read thread)

I/O thread 6 state: wait Windows aio (write thread)

I/O thread 7 state: wait Windows aio (write thread)

I/O thread 8 state: wait Windows aio (write thread)

I/O thread 9 state: wait Windows aio (write thread)

Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,

 ibuf aio reads:, log i/o's:, sync i/o's:

Pending flushes (fsync) log: 0; buffer pool: 0

507 OS file reads, 64 OS file writes, 15 OS fsyncs

0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s

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

INSERT BUFFER AND ADAPTIVE HASH INDEX

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

Ibuf: size 1, free list len 0, seg size 2, 0 merges

merged operations:

 insert 0, delete mark 0, delete 0

discarded operations:

 insert 0, delete mark 0, delete 0

Hash table size 34679, node heap has 0 buffer(s)

Hash table size 34679, node heap has 0 buffer(s)

Hash table size 34679, node heap has 0 buffer(s)

Hash table size 34679, node heap has 0 buffer(s)

Hash table size 34679, node heap has 0 buffer(s)

Hash table size 34679, node heap has 0 buffer(s)

Hash table size 34679, node heap has 0 buffer(s)

Hash table size 34679, node heap has 0 buffer(s)

0.00 hash searches/s, 0.00 non-hash searches/s

---

LOG

---

Log sequence number 345901173

Log flushed up to   345901173

Pages flushed up to 345901173

Last checkpoint at  345901164

0 pending log flushes, 0 pending chkp writes

15 log i/o's done, 0.00 log i/o's/second

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

BUFFER POOL AND MEMORY

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

Total large memory allocated 137297920

Dictionary memory allocated 673260

Buffer pool size   8192

Free buffers       7678

Database pages     514

Old database pages 209

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 479, created 35, written 41

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 514, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

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

ROW OPERATIONS

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

0 queries inside InnoDB, 0 queries in queue

1 read views open inside InnoDB

Process ID=4620, Main thread ID=10324, state: sleeping

Number of rows inserted 2, updated 1, deleted 0, read 26

0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s

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

END OF INNODB MONITOR OUTPUT

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


1 row in set (0.00 sec)


ERROR:

No query specified



이렇게 Lock 이 발생한 것을 확인 할 수 있고, 어떤 쿼리가 Lock 이 걸려 있는지 확인이 가능하다.


해당 쿼리에 대한 해석은 제대로 해야 될 듯 싶다.

그러면 튜닝 또는 장애 발생 시 정확한 원일을 알 수 있는 척도가 될 듯 싶다.


mysql> show engine innodb status \G;



[출처] http://dba-jadelee.blogspot.kr/2014/10/mysql-innodb-status-monitoring.html

MySQL INNODB Status Monitoring

-  해당 STATUS출력내역은 각 상세내역 설명을 위해 특정장비를 기준으로 특정시점의 결과를 샘플링  

세부적으로 설명한 부분도 있지만 직관적으로 상태정보를 보여주는 부분은 상세한 설명은 생략함. (이 부분들에 대한 추가적인 질문은 개인별로 문의하세요)

각 부분에 대한 간략한 기능적 설명이며 모니터링상 중요한 영역에 대한 코멘터리는 각 영역에 대한 설명 마지막 부분에 기재하였음.

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


SQL> SHOW ENGINE INNODB STATUS\G


=====================================
131129 12:58:12 INNODB MONITOR OUTPUT      <--- 분석시점에 대한 출력시간
=====================================
Per second averages calculated from the last 30 seconds   <--- 분석에 대한 대상시간범위 (출력시간으로부터 *초 전까지의 범위)


----------------------------
BACKGROUND THREAD      
----------------------------               
InnoDB 메인 백그라운드 스레드의 작업실행 통계 각 숫자는 Innodb Engine이 시작된 이후부터의 카운트 값

srv_master_thread loops: 18613866 1_second, 18613864 sleeps, 1861347 10_second, 1755 background, 1739 flush
<--- 순서대로 초당 루프횟수 / 초당 슬립횟수 / 10초당 루프횟수 / User Transaction이 없는 유휴시간대 백그라운드 연산의 루프횟수플러시 루프횟수를 의미

srv_master_thread log flush and writes: 18683584
<--- 로그 메시지를 기록하고 플러시한 횟수를 의미 (Redo + Undo)


-----------------
SEMAPHORES              
-----------------          
InnoDB 내부 세마포어(뮤텍스나 리드/라이트 락 세마포어를 기다리는 스레드에 대한 정보)  통계 : 각 숫자는 Innodb Engine이 시작된 이후부터의 카운트 값이며 각 카운트 값이 갑자기 높은 시간대에 대해서는 DISK I/O 성능 및 InnoDB 엔진경합을 의심

OS WAIT ARRAY INFO: reservation count 1206724952, signal count 3304987791
<--- 전역 대기 배열정보 : 배열이 생성된 후에 셀을 예약한 횟수 / 객체가 시그널을 받은 횟수를 의미

Mutex spin waits 39567225498, rounds 173270862365, OS waits 330572230
<--- 뮤텍스 대기 스핀정보 : 뮤텍스를 기다리는 스핀락의 호출횟수 / 스핀루프의 반복횟수 / OS의 호출을 기다린 횟수를 의미

RW-shared spins 2945944901, rounds 37722913141, OS waits 601963335
<--- 공유 리드락 스핀정보 : 공유 리드락이 걸린 시간동안 스핀락이 기다린 횟수 / 스핀루프의 반복횟수 / OS의 호출을 기다린 횟수를 의미                       

RW-excl spins 684786004, rounds 12265810889, OS waits 163680647
<--- 배타적 라이트락 스핀정보 : 배타적 라이트락이 걸린 시간동안 스핀락이 기다린 횟수 / 스핀루프의 반복횟수 / OS의 호출을 기다린 횟수를 의미

Spin rounds per wait: 4.38 mutex, 12.81 RW-shared, 17.91 RW-excl
<--- 각 뮤텍스에 대해 OS의 호출을 기다리며 스핀루프가 기다린 횟수를 의미


------------------------------------
LATEST FOREIGN KEY ERROR 
------------------------------------            
최근 발생한 트랜잭션별 참조키 에러내역 히스토리 : 제약조건에 위배되는 내역에 대한 트랜잭션 및 쿼리 정보 확인

세부 에러 내역은 생략


------------------------------------
LATEST DETECTED DEADLOCK
------------------------------------           
최근 발생한 트랜잭션별 데드락내역 히스토리 : 가장 최근 발생한 트랜잭션간 데드락 이슈에 대한 처리내역 확인 (경합된 트랜잭션간의 내역 및 데드락 해결을 위한 트랜잭션 처리내역)

세부 데드락 내역은 생략


-------------------
TRANSACTIONS  
-------------------           
현재 트랜잭션별 락모니터링 정보 : 실제 수행되고 있는 트랜잭션별 작업내역에 대한 락 핸들링 정보 및 락 사용 세부쿼리 내역을 확인

세부 트랜잭션 내역은 생략


----------
FILE I/O    
----------         
다양한 I/O 연산에 대한 Innodb 스레드 실행내역 및 통계 : 내부적인 I/O 스레드의 현재 상태 및 전체 통계값 제공하며 만약 I/O상의 부하나 상태이상이 의심될 때 참조될 수 있음.

I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
---> 현재 Innodb엔진이 사용중인 I/O 스레드들의 현재 상태 (각 스레드의 역할에 대한 명칭은 각 줄 끝 괄호내역 확인)

Pending normal aio reads: 0 [0, 0, 0, 0] , aio writes: 0 [0, 0, 0, 0] ,
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
---> 대기하는 연산에 대한 정보  (aio 는 비동기 입출력을 의미)

21113936456 OS file reads, 7012874230 OS file writes, 5248276317 OS fsyncs
---> Innodb 엔진이 시작된 이후 전체통계 카운트

670.33 reads/s, 16384 avg bytes/read, 387.61 writes/s, 196.80 fsyncs/s
---> 마지막으로 통계를 출력한 이후의 전체통계 값에 대한 초단위 처리 카운트


------------------------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX      
------------------------------------------------------        
인서트 버퍼와 적응형 해시에 대한 정보 : 버퍼와 해시의 효율에 대한 통계정보 확인

Ibuf: size 38747, free list len 48247, seg size 86995, 183927359 merges
---> 페이지에 있는 삽입버퍼의 인덱스트리 사이즈 / 사용가능한 프리리스트의 길이 / 삽입버퍼트리와 헤더를 갖고 있는 파일에 할당된 페이지수 / 합병된 페이지수 를 의미

merged operations:
 insert 1037160756, delete mark 902047899, delete 260585507
---> 인덱스 페이지에 합병한 각 DML연산의 횟수를 의미

discarded operations:
 insert 110253, delete mark 5399, delete 2043
---> 테이블스페이스나 인덱스가 삭제되어 합병하지 않고 버려진 각 DML연산의 횟수를 의미

Hash table size 4425293, node heap has 1037 buffer(s)
---> 적응형 해시 인덱스 테이블에 있는 셀의 개수와 예약된 버퍼프레임의 개수를 의미

1057.94 hash searches/s, 1352.65 non-hash searches/s
---> 검색한 적응형 해시 인덱스 검색에 성공한 횟수 / 적응형 해시 인덱스를 사용할 수 없을때 B-tree 인덱스를 검색한 횟수를 의미


-------
LOG
-------
Innodb Log 활동에 대한 통계

Log sequence number 7804454235313     
---> 현재 로그 일련번호 (lsn)

Log flushed up to   7804454234099
---> 로그파일에서 플러시된 항목의 개수

Last checkpoint at  7804369829116
---> 가장 최근의 체크포인트된 lsn 정보

0 pending log writes, 0 pending chkp writes
4882215617 log i/o's done, 153.85 log i/o's/second

log switch 이슈와 관련
VIEW POINT : (Log flushed up to - Last checkpoint at) 값은 체크포인트가 얼마나 오래되었는지를 확인할 수 있음.
체크 포인트값이 (innodb_log_file_size * innodb_log_files_in_group) 77% 이상이 되지 않게 모니터링하고 유지되어야 함. (권장된 모니터링수치)
만약 이 비율에 가깝거나 큰 비율 값이 나온다면 Innodb엔진은 공격적으로 플러싱을 시도하게 되며 이로 인한 DB연산이 멈출 수 있음.


------------------------------------
BUFFER POOL AND MEMORY
------------------------------------            
Innodb 버퍼풀과 메모리 사용량에 대한 통계정보 : Innodb 버퍼에 대한 LRU 관리방법에 의한 할당내역 및 사용내역(byte단위)  버퍼사용율에 대한 세부통계수치 확인

Total memory allocated 2197815296; in additional pool allocated 0
---> 버퍼로 할당된 메모리 전체사이즈 / 추가풀에 할당된 메모리사이즈를 의미

Dictionary memory allocated 8409400
---> 데이터딕셔너리 테이블과 인덱스에 할당된 메모리사이즈를 의미

Buffer pool size   131072
Free buffers       21
---> 버퍼풀 사이즈를 페이지 단위로 알려주고 / 버퍼풀에 있는 해재된(free) 버퍼의 개수를 의미 : 프리버퍼가 없는 경우가 잦으면 버퍼사이즈를 늘려주는 것을 권장.

Database pages     130014
Old database pages 47973
Modified db pages  5660
---> 버퍼의 현재 LRU큐의 길이 / 과거 LRU큐의 길이 / 플러시해야할 페이지의 개수를 의미 : 기본적으로 Innodb는 버퍼풀을 LRU로 관리하며 할당과 해제에 대해서 페이지단위로 관리됨.

Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
---> 대기하고 있는 읽기연산의 개수 / LRU 관리방식에 따른 플러시하기 위해 대기하고 있는 페이지의 개수 / Buf_flush_list에서 플러시하기위해 기다리고 있는 페이지의 개수 / Buf_flush_single_page 리스트에서 플러시하기 위해 기다리고 있는 페이지의 개수를 의미

Pages made young 47722254403, not young 0
3258.74 youngs/s, 0.00 non-youngs/s
---> 최근에 접근한 페이지의 개수 / 최근에 접근하지 않은 페이지의 개수를 의미

Pages read 25295158134, created 95903681, written 2392506665
670.33 reads/s, 2.00 creates/s, 235.76 writes/s
---> 페이지의 읽기 연산 카운트 버퍼풀에 생성했지만 읽지않은 페이지의 개수 / 쓰기 연산 카운트를 의미

Buffer pool hit rate 997 / 1000, young-making rate 19 / 1000 not 0 / 1000
---> 획득한 버퍼풀 페이지 수와 비교하여 읽은 페이지 수의 비율 / 획득한 버퍼풀 페이지 수와 비교 및 접근한 페이지 수의 비율 / 획득한 버퍼풀 페이지 수와 비교 및 접근하지 않은 페이지 수의 비율을 의미

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
---> 미리 읽기 비율 / 접근하지 않아서 제거된 미리 읽기 페이지수의 비율 / 랜덤 미리 읽기 비율

LRU len: 130014, unzip_LRU len: 0
I/O sum[108645]:cur[907], unzip sum[0]:cur[0]


----------------------
ROW OPERATIONS
----------------------
메인 스레드의 행 연산에 대한 통계 정보

2 queries inside InnoDB, 0 queries in queue
5 read views open inside InnoDB
---> 현재 실행중인 쿼리 / innodb_thread_concurrency 큐에 있는 쿼리의 개수 / 읽은 뷰의 개수를 의미

Main thread process no. 16530, id 140226923562752, state: sleeping
---> 메인 스레드의 ID 및 상태정보를 의미 (첫번째 no. OS의 프로세스ID)

Number of rows inserted 3941662945, updated 2611269253, deleted 1052306048, read 11030869627676
39.96 inserts/s, 57.94 updates/s, 2.00 deletes/s, 908015.98 reads/s
---> innodb 엔진 시작된 이후의 각 DML연산의 총합계 카운트 / 초당 각 DML연산의 횟수 카운트를 의미

--------------------------------------------------------
END OF INNODB MONITOR OUTPUT

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


[출처] http://intomysql.blogspot.kr/2010/12/innodb-lock.html

  • 우선 각 트랜잭션은 “TRANSACTION 999999 999999”으로 시작된다. (TRANSACTION ID는 8바이트 숫자 값인데, 이러한 형태의 8바이트 숫자 값은 모두 상위 4바이트와 하위 4바이트 두 영역으로 나뉘어서 출력된다.)
  • 그러므로, 여기 예제에서는 현재 3개의 트랜잭션 (09번 라인, 13번 라인, 23번 라인)이 존재한다는 것을 확인할 수 있다.
  • 각 TRANSACTION 라인에는 현재 해당 트랜잭션이 어떤 작업을 하고 있는지 어떤 상태인지를 알려 주는 키워드가 표시되며, 해당 트랜잭션이 몇 초 동안 진행 중인지도 보여 준다.- 09번 라인 : not started è 현재 트랜잭션이 진행 중이지 않음을 의미- 13번 라인 : ACTIVE è 현재 트랜잭션이 4초 동안 활성화된 상태임 (경우에 따라 문장 끝에 어떤 작업 중인지를 표시해 줌 : starting index read)- 23번 라인 : ACTIVE è 현재 트랜잭션이 17251초 동안 활성화된 상태임
  • 각각의 트랜잭션들은 “MySQL thread id”라는 항목(10, 16, 24번 라인)을 가지는데, 이 thread id값은 MySQL에서 “SHOW PROCESSLIST” 명령의 결과에 보여지는 “id”와 동일한 값을 가지게 된다. 즉, 현재 트랜잭션 목록에서 제일 밑 트랜잭션 (TRANSACTION 0 1809458)을 종료하고자 하면, “kill 4”명령으로 트랜잭션을 종료시킬 수 있다.
  • 13번 라인의 트랜잭션은 “TRX HAS BEEN WAITING 4 SEC FOR THIS LOCK TO BE GRANTED:”이라는 항목을 가지고 있는데, 이는 현재 트랜잭션 (TRANSACTION 0 1809460)이 다른 트랜잭션이 이미 점유한 Lock 때문에 Blocking(대기) 상태임을 표시하며, 어떤 Lock을 기다리고 있는지 상세히 보여 준다. 하지만, 안타깝게도 이 결과로는 어떤 트랜잭션이 그 Lock을 가지고 있는지는 알아낼 수 없다. 대략 짐작해 보건데 그 밑에 있는 트랜잭션이 지금 17251초 동안 트랜잭션이 ACTIVE 상태인 것으로 보아서 문제를 유발하고 있을 것이라는 것 정도는 짐작해 볼 수 있게 된다. 조금 더 자세히 확인하기 위해서는 “innodb_lock_monitor” 가 필요한데, 이 내용은 하단의 “InnoDB Lock monitoring” 을 참조 바란다.
  • 19번 라인을 보면, 레코드 Lock에 관련된 정보가 나오는데, 이것은 현재 트랜잭션이 대기 중인 레코드(인덱스)를 의미하며, 그 인덱스의 정보를 20, 21번 라인에 걸쳐서 보여 주고 있다. 19번 라인에는 지금 대기하고 있는 Lock이 Shared-lock인지 Exclusive-lock인지를 그리고 Gap까지 잠그고 있는지 아닌지를 보여 준다. 일반적으로 Gap lock이 아니라고 표현되는 경우를 제외하고는 거의 모두 Gap까지 잠그고 있다고 생각하면 될 듯 하다. (Gap을 잠그고 있는지 아닌지 판단하는 또 다른 방법은 “undo entries” 항목의 수가 “row lock(s)”의 수보다 작으면 대부분 Gap lock 으로 판단할 수 있다. 하지만 이 방법도 정확한 것은 아니다. 예를 들어서 한 트랜잭션에서 하나의 레코드만 계속 업데이트하게 되면 undo entries가 row locks보다 커질 수 있기 때문이다.)
  • 21번 라인을 보면, 드디어 이해 불가능의 단어들이 출력되는데, 사실 이 부분이 의외로 문제 해결에 도움이 될 수 있다. 우선 이 라인에 표시되는 내용은 인덱스 레코드의 필드 값들을 출력해서 보여 주는데, HEX값과 ASCII값을 동시에 보여 준다. 21번 라인의 내용을 정리해 보면 아래와 같이 잘라서 생각해 볼 수 있다. (구분자는 ;; 임)- 0: len 1; hex 70; asc p;;- 1: len 1; hex 02; asc  ;;- 2: len 4; hex 00000009; asc     ;;- 3: len 4; hex 00000000; asc     ;;각 라인은 [인덱스상에서의 번호 : 필드 길이 : 16진수 필드 값(HEX) : ASCII 필드 값(ASC) ] 포맷으로 구성되어 있다. 그리고 이 필드들의 개수는 20번 라인의 n_fields와 동일한 값을 가지게 된다.이 값들과 19번 라인의 테이블 및 인덱스 명을 이용하면 어느 테이블의 어떤 레코드를 지금 기다리고 있는지를 알아낼 수 있다.
  • "SHOW ENGINE INNODB STATUS"의 "DEADLOCK" 섹션에 출력되는 내용도 지금까지의 설명한 내용과 동일한 패턴으로 출력되므로, DEADLOCK 정보를 확인할 때에도 이와 같은 방식으로 해석할 수 있다.

지금까지 간단히 트랜잭션의 내용을 읽는 방법을 확인해 보았다.


InnoDB Lock monitoring
우선 InnoDB의 Lock을 모니터링 하기 위해서는 아래와 같은 테이블을 생성해야 한다.

Create table innodb_lock_monitor (fd1 int) engine=innodb;

  • 이 테이블을 생성하면, 매 몇 초 단위로 SHOW ENGINE INNODB STATUS 결과를 MySQL 에러 로그 파일에 기록하므로 모니터링이완료되면 테이블을 삭제 해주는 것이 좋다.
  • 위의 테이블을 생성 후, “SHOW ENGINE INNODB STATUS” 명령을 실행하면 아래와 같은 좀 더 상세한 트랜잭션 정보를 확인할 수 있다.
  • 어떤 트랜잭션이 다른 트랜잭션의 처리를 Blocking(막고) 하고 있는지를 판단하기 위해서는, 각 트랜잭션에서 가지고 있거나 또는 기다리고 있는 테이블 및 인덱스 그리고 그 인덱스 페이지 번호로 추적해 볼 수 있다. (물론 이 방법도 정확하게 찾을 수 있는 방법은 아니다. 하지만 더 자세히는 지금의 InnoDB 에서는 무리일지도 모른다)
  • 아래 빨간색으로 표기된 부분을 비교해 봄으로써 두 개의 트랜잭션이 서로 Racing 상태임을 확인할 수 있다. (동일 테이블의 동일 인덱스에서 같은 인덱스 페이지 번호 4를 참조하고 있음)

------------
TRANSACTIONS
------------
01 Trx id counter 0 1809465
02 Purge done for trx's n:o < 0 1809462 undo n:o < 0 0
03 History list length 22
04 LIST OF TRANSACTIONS FOR EACH SESSION:
05 ---TRANSACTION 0 0, not started, process no 5975, OS thread id 1099274560
06 MySQL thread id 10, query id 442 localhost root
07 show engine innodb status
08
09
10 ---TRANSACTION 0 1809464, ACTIVE 12 sec, process no 5975, OS thread id 1281038656 starting index read
11 mysql tables in use 1, locked 1
12 LOCK WAIT 2 lock struct(s), heap size 368, 1 row lock(s)
13 MySQL thread id 9, query id 400 localhost root Updating
14 update article set article_title='xx' where article_category=112 and article_type='general'
15 ------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:
16 RECORD LOCKS space id 88 page no 4 n bits 88 index ix_category_type_id_user of table test.article trx id 0 1809464 lock_mode X locks rec but not gap waiting
17 Record lock, heap no 10 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
18  0: len 1; hex 70; asc p;; 1: len 1; hex 02; asc  ;; 2: len 4; hex 00000009; asc     ;; 3: len 4; hex 00000000; asc     ;;
19
20 TABLE LOCK table test.article trx id 0 1809464 lock mode IX
21 RECORD LOCKS space id 88 page no 4 n bits 88 index ix_category_type_id_user of table test.article trx id 0 1809464 lock_mode X locks rec but not gap waiting
22 Record lock, heap no 10 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
23  0: len 1; hex 70; asc p;; 1: len 1; hex 02; asc  ;; 2: len 4; hex 00000009; asc     ;; 3: len 4; hex 00000000; asc     ;;
24
25
26 ---TRANSACTION 0 1809463, ACTIVE 21 sec, process no 5975, OS thread id 1099008320
27 3 lock struct(s), heap size 368, 2 row lock(s), undo log entries 1
28 MySQL thread id 8, query id 355 localhost root
29 TABLE LOCK table test.article trx id 0 1809463 lock mode IX
20 RECORD LOCKS space id 88 page no 4 n bits 88 index ix_category_type_id_user of table test.article trx id 0 1809463 lock_mode X locks rec but not gap
21 Record lock, heap no 10 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
22  0: len 1; hex 70; asc p;; 1: len 1; hex 02; asc  ;; 2: len 4; hex 00000009; asc     ;; 3: len 4; hex 00000000; asc     ;;
23
24 RECORD LOCKS space id 88 page no 6 n bits 80 index PRIMARY of table test.article trx id 0 1809463 lock_mode X locks rec but not gap
25 Record lock, heap no 11 PHYSICAL RECORD: n_fields 10; compact format; info bits 0

26  0: len 4; hex 00000009; asc     ;; 1: len 6; hex 0000001b9c37; asc      7;; 2: len 7; hex 000000002d1f51; asc     - Q;; 3: len 1; hex 70; asc p;; 4: len 2; hex 7878; asc xx;; 5: len 30; hex 3c703e3c7370616e207374796c653d22666f6e742d73697a653a20313470; asc

반응형

조언으로 항상 체크해 봐야겠다.

[출처] https://blog.lael.be/post/370#comments

*MySQL 쓰면서 하지 말아야 할 것 17가지*

권장사항이다. 이것을 이해하면 당신의 어플리케이션이 더 나은 성능을 발휘할 것이다.

다만 이것이 사람의 실력을 판단하는 척도로 사용되서는 안 될 것이다.

 

작게 생각하기

- 조만간 규모가 커질거라면 MySQL ecosystem을 봐야된다.
- 그리고 캐싱 빡시게 안 하는 메이저 웹사이트는 없다.
- develooper.com의 Hansen PT랑 Ilia 튜토리얼 볼 것
- 처음부터 확장 가능하게 아키텍처 잘 쪼개놔야된다.
- 복제랑 파티셔닝 어떻게 할지 미리 계획 세워놔라.
- 파일 기반 세션 좀 쓰지마 -_-
- 그렇다고 너무 쓸데없이 크게 생각하지도 말 것
- 특히 성능하고 확장성 구분 못 하면 난감함

 

EXPLAIN 안 써보기

- SELECT 앞에 EXPLAIN 이라고 붙이기만 하면 되는 것을 (..)
- 실행 계획 확인
- 타입 컬럼에 index 써있는거랑 Extra 컬럼에 index 써있는거랑 “매우 큰” 차이 있음
* 타입에 있으면 Full 인덱스 스캔 (안 좋다.)
* Extra 컬럼에 있으면 Covering 인덱스 찾았다는 의미임 (좋다!)
- 5.0 이후부터는 index_merge 최적화도 한다.

 

잘못된 데이터 타입 선택

- 한 메모리 블럭 단위에 인덱스 레코드가 많이 들어갈수록 쿼리가 빨리 실행될 것이다. (중요)
- 아.. 정규화 좀 해 -_-… (이거 정말 충격과 공포인 듯)
- 가장 작은 데이터 타입을 써.. (진짜 BIGINT가 필요하냐고..)
- 인덱스 걸리는 필드는 정말 최소한으로 데이터 크기를 써야된다고.
- IP는 INT UNSIGNED로 저장해!! (아주 공감)
* 이럴 때 쓰라고 INET_ATON 함수가 아예 내장되어 있음.

 

PHP에서 pconnect 쓰는 짓

- 아파치에서 좀비 프로세스라도 생기면 그 커넥션은 그냥 증발하는거야..
- 어차피 MySQL 접속 속도는 Oracle이나 PostgreSQL 보다 10~100배 빠르다고.

너무 과도한 DB 추상화 계층을 두는 것
- 어디 포팅 열심히 할 거 아니면 추상화 계층 쓰지마 (ADODB, MDB2, PearDB 등)
- scale out 가능한걸 쓰라고.

 

스토리지 엔진 이해 못 하는 것

- 단일 엔진만으로 전체 아키텍처를 결정했다면 대부분 최적이 아님
- 엔진 별 장단점을 공부할 것
- ARCHIVE : zlib으로 압축해주고 UPDATE 안 되고 로그 Bulk Insert에 유용함.
- MEMORY : 서버 재시작하면 증발. 인덱스가 HASH나 BTREE로 가능함. 임시, 요약 데이터에 사용.
* 주간 top X 테이블 같은 것.
* 하여튼 메모리에 박아넣고 싶은 데이터 있으면..

 

인덱스 레이아웃 이해 못 하는 것

- 제대로 인덱스랑 스토리지 엔진 선택하려면 공부 좀 해
- 엔진은 데이터와 인덱스 레코드를 메모리나 디스크에 레이아웃하는 걸 구현한 것
- clustered 구성은 데이터를 PK 순서에 따라 저장함.
- non-clustered 구성은 인덱스만 순서대로 저장하고 데이터는 순서 가정하지 않음.
- clustered에서는 인덱스만 타면 추가적인 조회 없이 바로 데이터 가져오는 것임.
- 그래서 clustered PK는 작은 놈으로 할 필요가 있다는거
* 다른 인덱스는 각 레코드마다 PK를 앞에 더 붙이게 되니까.
* PK 지정 안 하면 아무렇게나 해버림

 

쿼리 캐시 이해 못 하는 것

- 어플리케이션 read/write 비율은 알고 있어야지
- 쿼리 캐시 설계는 CPU 사용과 읽기 성능 간의 타협
- 쿼리 캐시 크기를 늘린다고 읽기 성능이 좋아지는게 아님. heavy read라도 마찬가지.
- 과도한 CPU 사용을 막기 위해 무효화 할 때는 캐시 항목들을 뭉텅이로 날려버림
- 한마디로 SELECT가 참조하는 테이블 데이터 하나라도 변경되면 그 테이블 캐시는 다 날라간다는 얘기임
- 수직 테이블 파티셔닝으로 처방
* Product와 ProductCount를 쪼갠다든지..
* 자주 변하는 것과 변하지 않는 것을 쪼개는게 중요하다 이 말임.

 

Stored Procedure를 쓰는 것

- 무조건 쓰면 안 된다는게 아니고..
- 컴파일 할 때 무슨 일이 일어나는지 이해 못 하고 쓰면 재앙이 된다 이 말.
- 다른 RDBMS랑 다르게 connection thread에서 실행 계획이 세워짐.
- 이게 뭔 얘기냐 하면 데이터 한 번 가져오고 연결 끊으면 그냥 CPU 낭비 (7~8% 정도)하는 꼴이라는 것.
- 웬만하면 Prepared 구문과 Dynamic SQL을 써라.. 아래 경우를 제외하고
* ETL 타입 프로시저
* 아주아주 복잡하지만 자주 실행되지는 않는 것
* 한 번 요청할 때마다 여러번 실행되는 간단한 것 (연결한 상태로 여러번 써야 된다니까)

 

인덱스 컬럼에 함수 쓰는 것

- 함수에 인덱스 컬럼 넣어 호출하면 당연히 인덱스 못 탄다
- 함수를 먼저 계산해서 상수로 만든 다음에 = 로 연결해야 인덱스 탈 수 있다.
* 여기 실행 계획 보면 LIKE도 range type 인덱스 타는 것 보임

 

인덱스 빼먹거나 쓸모없는 인덱스 만들어 놓는 것

- 인덱스 분포도(selectivity)가 허접하면 안 쓴다.
- S = d/n
* d = 서로 다른 값의 수 (# of distinct values)
* n = 테이블의 전체 레코드 수
- 쓸모없는 인덱스는 INSERT/UPDATE/DELETE를 느리게 할 뿐..
- FK는 무조건 인덱스 걸어라. (물론 FK 제약 걸면 인덱스 자동으로 생긴다.)
- WHERE나 GROUP BY 표현식에서 쓰이는 컬럼은 인덱스 추가를 고려할 것
- covering index 사용을 고려할 것
- 인덱스 컬럼 순서에 유의할 것!

 

join 안 쓰는 짓

- 서브쿼리는 join으로 재작성해라
- 커서 제거해라
- 좋은 Mysql 성능을 내려면 기본
- 집합 기반으로 생각해야지 루프 돌리는거 생각하면 안 된다.

 

Deep Scan 고려하지 않는 것

- 검색엔진 크러울러가 쓸고 지나갈 수 있다.
- 이 경우 계속해서 전체 집합을 정렬한 다음 LIMIT로 가져와야 하니 무진장 느려진다.
- 어떻게든 집합을 작게 줄인 다음 거기서 LIMIT 걸어 가져올 것

 

InnoDB 테이블에서 WHERE 조건절 없이 SELECT COUNT(*) 하는 짓

- InnoDB 테이블에서는 조건절 없이 COUNT(*) 하는게 느리다.
- 각 레코드의 transaction isolation을 유지하는 MVCC 구현이 복잡해서 그렇다는..
- 트리거 걸어서 메모리 스토리지 엔진 쓰는 테이블에 통계를 별도로 유지하면 된다.

 

프로파일링이나 벤치마킹 안 하는 것

- 프로파일링 : 병목 찾아내기
- 벤치마킹 : 시간에 따른 성능 변화 추이 평가, 부하 견딜 수 있는지 테스트
- 프로파일링 할 때는 실제 데이터를 옮겨와서 할 것
- 어디가 병목이냐~ Memory? Disk I/O? CPU? Network I/O? OS?
- 느린 쿼리 로그로 남기기
* log_slow_queries=/path/to/log
* log_queries_not_using_indexes
- 벤치마킹 시에는 다 고정시키고 변수 하나만 바꿔가면서 해야 함. (쿼리 캐시는 끌 것.)
- 도구를 써라~~
* EXPLAIN
* SHOW PROFILE
* MyTop/innotop
* mysqlslap
* MyBench
* ApacheBench (ab)
* super-smack
* SysBench
* JMeter/Ant
* Slow Query Log

 

AUTO_INCREMENT 안 쓰는 것

- PK를 AUTO_INCREMENT로 쓰는건 무진장 최적화 되어 있음
* 고속 병행 INSERT 가능
* 잠금 안 걸리고 읽으면서 계속 할 수 있다는!
- 새 레코드를 근처에 놓음으로써 디스크와 페이지 단편화를 줄임
- 메모리와 디스크에 핫 스팟을 생성하고 스와핑을 줄임

 

ON DUPLICATE KEY UPDATE를 안 쓰는 것

- 레코드가 있으면 업데이트하고 없으면 인서트하고 이런 코드 필요없다!! 다 날려버려라!!
- 서버에 불필요하게 왔다갔다 할 필요가 없어짐
- 5-6% 정도 빠름
- 데이터 입력이 많다면 더 커질 수 있음
하지 말아야 할 것 총정리
Thinking too small
Not using EXPLAIN
Choosing the wrong data types
Using persistent connections in PHP
Using a heavy DB abstraction layer
Not understanding storage engines
Not understanding index layouts
Not understanding how the query cache works
Using stored procedures improperly
Operating on an indexed column with a function
Having missing or useless indexes
Not being a join-fu master
Not accounting for deep scans
Doing SELECT COUNT(*) without WHERE on an InnoDB table
Not profiling or benchmarking
Not using AUTO_INCREMENT
Not using ON DUPLICATE KEY UPDATEK

반응형

출처 : https://mariadb.com/kb/ko/mariadb-mysql/#mariadb와-mysql-proxy의-비호환성

MariaDB는 MySQL을 즉시 교체할 수 있는 바이너리이다

모든 실용적인 목적에서 MariaDB는 동일한 MySQL 버전을 즉시 교체할 수 있다. (예를 들어 MySQL 5.1은 MariaDB 5.1MariaDB 5.2MariaDB 5.3과 호환되며, MySQL 5.5은 MariaDB 5.5와 호환된다.) 이는 다음과 같은 것을 의미한다.

  • 데이터와 테이블 정의 파일 (.frm) 파일들이 호환된다
  • 모든 클라이언트 API, 프로토콜 및 구조가 동일하다
  • 모든 파일이름, 바이너리, 경로, 포트, 소켓이 모두 동일해야 한다
  • 모든 MySQL 커넥터(PHP, Perl, Python, Java, .NET, MyODBC, Ruby, MySQL C connector 등)는 아무런 변화없이 MySQL에서 잘 작동한다
  • 몇몇 PHP5에서의 설치 이슈가 존재한다. (오래된 PHP 클라이언트가 라이브러리 호환성을 검사하는 데서 발생하는 버그이다)
  • 클라이언트 공유 라이브러리는 MySQL 클라이언트 라이브러리와 호환된다.

이는 대부분의 경우에서 MySQL을 언인스톨한 뒤, MariaDB를 설치해도 잘 작동한다는 것을 의미한다. (동일한 메인 버전에서는 데이터 파일을 변환할 필요없다.)

우리는 월간 주기로 MySQL 코드를 병합하여 호환성을 보장하며 오라클이 추가하는 기능 및 버그 수정도 MariaDB에 포함된다.

우리는 업그레이드 스크립트에 많은 작업을 완료하여 MySQL 5.0에서 MySQL 5.1로 업그레이드하는 것보다 MySQL 5.0에서 MariaDB 5.1로 업그레이드하는 것이 더 쉽도록 하였다.

하지만, MariaDB는 MySQL에 없는 새로운 옵션, 확장, 저장 엔진, 버그 수정도 많이 포함하고 있다. 서로 다른 MariaDB 버전별 기능은 MariaDB 릴리즈별 차이 에서 확인할 수 있다.

MariaDB 5.1과 MySQL 5.1의 비호환성

일부 경우 MariaDB는 MySQL보다 더 많은 정보를 보여주기 위하여 비호환성을 허용하고 있다.

다음 목록은 MySQL 5.1 대신 MariaDB 5.1을 사용하는 경우에 알려진 모든 사용자 레벨의 비호환성 목록이다.

  • 설치 패키지 이름은 MySQL 대신 MariaDB로 시작한다.
  • Timings may be different as MariaDB is in many cases faster than MySQL.
  • MariaDB의 mysqld는 my.cnf에서 [mariadb] 섹션을 읽는다.
  • You can't use a binary only storage engine library with MariaDB if it's not compiled for exactly the same MariaDB version. (This is because the server internal structure THD is different between MySQL and MariaDB. This is common also between different MySQL versions). This should not be a problem as most people don't load new storage engines and MariaDB comes with more storage engines than MySQL.
  • CHECKSUM TABLE은 다른 결과를 출력할 수 있다. MariaDB는 NULL을 무시하지 않지만, MySQL 5.1은 NULL을 무시하기 때문에 이러한 차이가 발생한다. (향후 MySQL은 MariaDB가 계산하는 방식대로 체크섬을 계산해야 할 것이다) 옛날 방식의 체크섬을 얻길 원한다면 --old 옵션으로 MariaDB를 실행하면 된다. 하지만, MariaDB의 MyISAM과 Aria 저장 에닌은 내부적으로 새로운 체크섬을 이용한다. 따라서 --old 옵션을 이용하는 경우 CHECKSUM 명령은 매 레코드마다 체크섬을 계산하기 때문에 속도가 느릴 것이다.
  • 슬로우 쿼리 로그는 쿼리에 대한 더 많은 정보를 제공하는데, 이는 슬로우 쿼리 로그를 직접 파싱하는 경우 문제가 될 수 있다.
  • MariaDB는 내부에서 사용하는 임시 테이블을 기본으로 Aria 저장 엔진을 사용하기 때문에 MySQL보다 메모리를 좀 더 사용한다. MariaDB가 최소한의 메모리만 더 사용하길 원하는 경우 aria_pagecache_buffer_size 를 1M 로 설정하면 된다. (기본 값은 128M).
  • 만약 새로운 명령 옵션MariaDB의 새로운 기능 혹은 새로운 저장 엔진, 을 사용하는 경우 더 이상 MySQL과 MariaDB 사이를 오갈 수 없다.

MariaDB 5.2와 MySQL 5.1의 비호환성

Incompatibilities between MariaDB 5.2 and MySQL 5.1

MariaDB 5.1과 MySQL 5.1의 비호환성과 동일하며 1가지가 추가된다.

SQL_MODE에 새로운 값이 추가되었다. 새롭게 추가된 값은 IGNORE_BAD_TABLE_OPTIONS이며, 이 값이 설정되지 않은 경우, 현재 사용 중인 저장 엔진에서 지원되지 않는 테이블, 필드, 인덱스의 속성을 사용하는 경우 에러를 발생한다. 이런 변화로 인해 에러 로그에는 다음과 같은 경고 메시지가 발생할 수 있다. "mysql 데이터베이스에 잘못 정의된 테이블이 있음. mysql_update를 이용하려 수정하시오"

모든 실용적인 목적에서 MySQL 5.2는 MariaDB 5.1과 MySQL 5.1을 즉시 대체 가능하다.

MariaDB 5.3, MySQL 5.1, MariaDB 5.2의 비호환성

  • 잘못된 변환에 관련된 일부 에러 메시지가 MariaDB에서 좀 더 자세히 제공된다.
  • MariaDB에 특화된 오류 번호는 1900번부터 시작하여 MySQL 오류 번호와 충돌되지 않는다.
  • MySQL은 일부 문맥에서 datetime과 time에서 마이크로초를 손실했지만, MariaDB는 모든 문맥에서 마이크로초가 잘 작동한다.
  • UNIX_TIMESTAMP (상수 날짜 문자열)은 MariaDB에서는 마이크로초 단위까지 표현이 가능히지만 MySQL은 그렇지 못하다. 이는 UNIX_TIMESTAMP()를 파티션 함수로 사용하는 경우 문제가 될 수 있는데, FLOOR(UNIX_TIMESTAMP(..)) 를 이용하거나 날짜 문자열을 숫자형 (예를 들어 20080101000000 형식)으로 바꿔서 해결할 수 있다.
  • MariaDB는 date, datetime, timestamp 값에 대해 더 엄격한 검사 수행한다. 예를 들어 UNIX_TIMESTAMP('x') 는 0이 아닌 NULL을 반환한다.
  • --maria- 시작 옵션은 제거되었다. 대신에 --aria- prefix를 사용해야 한다. (MySQL 5.2는 --maria--와 --aria- 모두 지원함)
  • SHOW PROCESSLIST는 Progress라는 추가적인 컬럼이 존재하며 일부 명령에 대해 진행 상황을 보여준다. 이 기능은mysqld 시작 시 --old 옵션을 이용하여 끌 수 있다.
  • INFORMATION_SCHEMA.PROCESSLIST는 진행 보고를 위해 다음과 같은 3개의 추가적인 컬럼을 출력한다: STAGEMAX_STAGE, and PROGRESS.
  • /*M! 혹은 <<code>>/*!#<</code>로 시작하는 긴 주석은 주석이 아니라 실제 실행이 된다.
  • max_user_connections=0 는 연결 수를 제한 두지 않는 것을 의미하는데, mysqld 시작 시 이 옵션을 사용하는 경우 mysqld가 실행 중인 경우는 이 전역 변수를 수정할 수 없다. <<code>>max_user_connections=s<</code>로 mysqld가 시작된 경우 연결 개수를 위한 구조체를 할당하지 않기 때문이다. mysqld 실행 중에 이 값을 바꾸고 싶다면 0이 아닌 큰 값을 지정하는 것이 좋다.
  • max_user_connections를 -1로 설정하여 (전역 변수인 GRANT 옵션도 동시에) 사용자가 서버에 접속하는 것을 중지시킬 수 있다. 전역 변수 max_user_connections는 SUPER 권한을 가진 사용자에게는 영향을 미치지 않는다.
  • |IGNORE 지시자는 모든 오류를 무시하지 않는다 (예:FATAL 오류). 무시를 해도 안전한 오류만 무시한다.

MariaDB 5.3과 MySQL 5.3의 비호환성

XtraDB

XtraDB를 제공하는 Percona는 5.5 코드 기반에게 초기 기능의 모든 것을 제공하지 않았따. 따라서 MariaDB 5.5 또한 그 기능을 제공하지 못한다.

5.5에 없는 XtraDB 옵션들

다음의 옵션들은 XtraDB 5.5에서 지원되지 않는다. 만약 당신이 my.cnf에서 아래의 옵션을 사용 중이라면 5.5로 업그레이드 전에 제거해야 한다.

  • innodb_adaptive_checkpoint ; Use innodb_adaptive_flushing_method instead.
  • innodb_auto_lru_dump ;Use innodb_buffer_pool_restore_at_startup instead.
  • innodb_blocking_lru_restore ; Use innodb_blocking_buffer_pool_restore instead.
  • innodb_enable_unsafe_group_commit
  • innodb_expand_import ; Use innodb_import_table_from_xtrabackup instead.
  • innodb_extra_rsegments ; Use innodb_rollback_segment instead.
  • innodb_extra_undoslots
  • innodb_fast_recovery
  • innodb_flush_log_at_trx_commit_session
  • innodb_overwrite_relay_log_info
  • innodb_pass_corrupt_table ; Use innodb_corrupt_table_action instead.
  • innodb_use_purge_thread
  • xtradb_enhancements

기본 값이 변경된 XtraDB의 옵션

XtraDB options that has changed default value

옵션기존 값새로운 값
innodb_adaptive_checkpointTRUE?FALSE
innodb_change_bufferinginserts?all
innodb_flush_neighbor_pages1?area

XtraDB 5.5의 새로운 옵션

다음의 옵션들은 XtraDB / InnoDB 5.5에 새롭게 추가된 옵션이다. (Listed here just to have all XtraDB information in the same place)

  • innodb_adaptive_flushing_method
  • innodb_adaptive_hash_index_partitions
  • innodb_blocking_buffer_pool_restore
  • innodb_buffer_pool_instances
  • innodb_buffer_pool_restore_at_startup
  • innodb_change_buffering_debug
  • innodb_corrupt_table_action
  • innodb_flush_checkpoint_debug
  • innodb_force_load_corrupted
  • innodb_import_table_from_xtrabackup
  • innodb_large_prefix
  • innodb_purge_batch_size
  • innodb_purge_threads
  • innodb_recovery_update_relay_log
  • innodb_rollback_segments
  • innodb_sys_columns
  • innodb_sys_fields
  • innodb_sys_foreign
  • innodb_sys_foreign_cols
  • innodb_sys_tablestats
  • innodb_use_global_flush_log_at_trx_commit
  • innodb_use_native_aio

5.5로 업그레이를 위한 Percona의 가이드 도 참조하는 것이 좋다.

MariaDB 5.5MariaDB 5.3과 MySQL 5.5의 비호환성

  • 중복 키 오류에서 INSERT IGNORE 는 경고 메시지를 출력한다.

MariaDB 10.0과 MySQL 5.6의 비호환성

  • MySQL의 모든 바이너리 (mysqldmyisamchk 등)은 예를 들어 --big-tables 대신 --big-table 옵션을 사용하는 경우 경고 메시지를 출력하는 반면, MariaDB 바이너리는 다른 대부분의 유닉스 명령들과 동일한 방식으로 작동하며, 유일한 prefix로 사용될 경우 경고를 출력하지 않는다.

지원되지 않는 설정

my.cnf에서 다음의 옵션을 사용 중인 경우 해당 변수를 제거해야 한다. 이는 MySQL 5.1 및 그 이후 버전에서도 마찬가지다.

  • skip-bdb

MySQL RPM 교체

만약 MySQL RPM을 제거하고 MariaDB를 설치하고자 하는 경우 MySQL RPM은 /etc/my.cnf를 /etc/my.cnf.rpmsave로 이름을 변경한다.

MariaDB를 설치한 뒤에는 다음과 같이 MySQL RPM 당시의 my.cnf를 복원할 수 있다.

mv -vi /etc/my.cnf.rpmsave /etc/my.cnf

MariaDB와 MySQL-Proxy의 비호환성

MySQL 클라이언트 API는 MySQL-Proxy를 통하여 MariaDB에 연결할 수 있다. 그러나 MariaDB 클라이언트 API는 "진행 보고(progress reporting)"을 MySQL-Proxy가 지원하지 않는다는 정보를 받게 된다. 완벽한 호환성을 위해서는 "진행 보고"를 클라이언트 측이나 서버 측에서 중지시키면 된다.


반응형

+ Recent posts