Skip to main content

InnoDB Buffer Pool Dump

DB를 완전히 shutdown시켰다가 다시 재기동 하게 되는경우, DB 메모리상에 아직 아무것도 들어있지 않는 상태가 된다. 이 경우 처음으로 테이블이 사용되게 되면, 그 때 디스크로부터 메모리로 데이터를 읽어 올려줘야된다. 메모리 상에 어느정도 이런 테이블 데이터들이 차오르기 전까지는 InnoDB Buffer Cache Hit Rate가 매우 낮은 상태일 것이고, (메모리에 들어있는게 없으니..) 디스크에서 데이터를 계속 불러 올려야하기 때문에 I/O작업이 많고, 느리고, 부하도 늘어날 것이다.

따라서 DB를 재기동해주면 성능을 위해 캐쉬를 웜업해주는 경우들이 있었다. 예를들면, 사용자가 한참 많은 상황에 DB가 죽었던 것이면, DB를 재기동 하자마자 사용자가 몰리며 더 큰 부하로인해 다시 DB 장애를 겪게 될지도 모른다. 따라서 사용자에게 서비스를 오픈하기 전에, 자주 사용되던 테이블이나 쿼리등을 DBA가 사전에 한번 쭉 수행해줌으로써, 자주 사용될 것으로 예상되는 데이터들을 미리 메모리에 올려놓는 것이다. 그리고 서비스를 오픈한다면, 갑자기 몰려든 사용자들의 데이터를 디스크로부터 다시 가져와야되는 이중고 없이, 메모리상에서 I/O 처리가 가능할 것이다.

그리고 이러한 작업을 MySQL 인스턴스가 대신 처리해 주는 것이 InnoDB Buffer Pool Dump 기능이다. 이 기능을 사용하여 버퍼풀을 덤프받으면, 실제 메모리상에 사용중인 데이터 블록들의 메타 정보를 디스크에 백업 받는다. 백업은 간단히 innodb_buffer_pool_dump_now 변수값을 on 시켜주기만 하면 된다.

mysql> set global innodb_buffer_pool_dump_now=1;
Query OK, 0 rows affected (0.00 sec)

-- 덤프 완료 메세지는 에러로그에 찍힌다
2023-09-18T06:16:33.301106Z 0 [Note] InnoDB: Dumping buffer pool(s) to /data/mysql57/datadir/ib_buffer_pool
2023-09-18T06:16:33.306527Z 0 [Note] InnoDB: Buffer pool(s) dump completed at 230918 15:16:33

백업 받은 파일은 실제 메모리 사이즈보다 훨씬 작은 파일이다.

[mysql@MySQL5712 datadir]$ ls -l ib_buffer_pool 
-rw-r----- 1 mysql mysql 481 Sep 18 15:16 ib_buffer_pool
[mysql@MySQL5712 datadir]$ 
[mysql@MySQL5712 datadir]$ 
[mysql@MySQL5712 datadir]$ head ib_buffer_pool 
0,549
0,533
0,319
0,318
0,317
38,3
38,2
38,1
38,0
0,316

이렇게 백업받은 버퍼풀 정보는, innodb_buffer_pool_load_now 변수값을 on 시켜주면 메모리 상에 다시 로딩을 시작한다.

mysql> set global innodb_buffer_pool_load_now=1;
Query OK, 0 rows affected (0.00 sec)

-- 마찬가지로 로딩 완료 메세지는 에러로그에 찍힌다.
2023-09-18T06:29:51.975535Z 0 [Note] InnoDB: Loading buffer pool(s) from /data/mysql57/datadir/ib_buffer_pool
2023-09-18T06:29:51.978513Z 0 [Note] InnoDB: Buffer pool(s) load completed at 230918 15:29:51

로딩작업은 디스크에서 메모리로 데이터를 읽어올리는 작업이라, 시간도 오래걸리고 부하도 클 것이다. 그래서 로딩 작업은 도중에 취소할 수가 있다. innodb_buffer_pool_load_abort 변수값을 on 시켜주면, 진행 중이던 로딩 작업을 취소한다.

mysql> set global innodb_buffer_pool_load_abort=1;
Query OK, 0 rows affected (0.00 sec)

-- 취소한 내역도 에러로그에서 확인된다.
2023-09-18T06:34:03.728113Z 0 [Note] InnoDB: Buffer pool(s) load aborted on request

또한 innodb_buffer_pool_dump_at_shutdown 파라메터와 innodb_buffer_pool_load_at_startup파라메터가 설정되어 있다면, DB가 정상적으로 종료될 때 InnoDB Buffer Pool을 Dump할 것이며, 정상적으로 기동될 때 다시 InnoDB Buffer Pool을 로딩할 것이다.