replication 지연현상 병목 구간 확인 등을 위해 mysqlbinlog --verbose 옵션으로 로그파일을 변환시키는 경우가 종종 있는데
이때 사이즈가 큰 로그파일을 변환시킬 때 파일시스템 공간 부족 문제로 아래와 같은 에러가 발생하며 실패할 경우가 있습니다.
이번 글에서는 해당 이슈 해결방법에 대해 살펴보겠습니다.
 
mysqlbinlog: Error writing file '/tmp/tmp.Gr1pi5' (Errcode: 28 "No space left on device")
mysqlbinlog: Error writing file '/tmp/tmp.Gr1pi5' (Errcode: 28 "No space left on device")
mysqlbinlog: Error writing file '/tmp/tmp.Gr1pi5' (Errcode: 28 "No space left on device")
mysqlbinlog: Error writing file '/tmp/tmp.Gr1pi5' (Errcode: 28 "No space left on device")
mysqlbinlog: Error writing file '/tmp/tmp.JJ40Wu' (Errcode: 28 "No space left on device")
 

-1. slave replication 지연 현상 발생

 
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
              Master_Log_File: mysql-bin.000686
          Read_Master_Log_Pos: 139047504
               Relay_Log_File: relay-log.000265
                Relay_Log_Pos: 139047590
        Relay_Master_Log_File: mysql-bin.000683
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
          Exec_Master_Log_Pos: 139047303
        Seconds_Behind_Master: 26302

=> second behind master 26302 만큼 지연 발생

 

-2. mysqlbinlog 사용하여 병목구간 확인

[TESTSERVER:TESTUSER]/logs001/TESTUSER/TESTDB/binary] mysqlbinlog mysql-bin.000683 --verbose > test.sql


mysqlbinlog: Error writing file '/tmp/tmp.Gr1pi5' (Errcode: 28 "No space left on device")
mysqlbinlog: Error writing file '/tmp/tmp.Gr1pi5' (Errcode: 28 "No space left on device")
mysqlbinlog: Error writing file '/tmp/tmp.Gr1pi5' (Errcode: 28 "No space left on device")
mysqlbinlog: Error writing file '/tmp/tmp.Gr1pi5' (Errcode: 28 "No space left on device")
mysqlbinlog: Error writing file '/tmp/tmp.JJ40Wu' (Errcode: 28 "No space left on device")

=> 위에서 확인한 병목 구간 mysqlbinlog 커맨드로 확인 시도하나 용량부족 에러 발생

 

-3. 파일시스템 확인

[TESTSERVER:TESTUSER]/home/TESTUSER] df -k
Filesystem           1K-blocks     Used Available Use% Mounted on
/dev/mapper/rootvg-root_vg
                      26195836  7764356  17094136  32% /

/dev/mapper/NIP_8020_VG001-bkup_lv001
                     257899908 98129064 146665564  41% /bkup001
                     
/dev/mapper/NIP_8020_VG001-logs_lv001
                     103081248 38248652  59589716  40% /logs001

[TESTSERVER:TESTUSER]/logs001/TESTUSER/TESTDB/binary] du -sh mysql-bin.000683
6.1G    mysql-bin.000683

=>  위에서 사용한 mysqlbinlog 커맨드는 대상 binlog 파일을 --verbose로 변환 시킬 때 temp 파일들을 생성하며 변환시키는데 default 로 /tmp 디렉토리를 사용하게 되어있음

현재 /tmp 디렉토리가 속한 볼륨인 루트볼륨은 17GB 밖에 여유공간이 없고  변환 대상 로그파일의 사이즈가 6GB로 크기 때문에 변환과정에서 에러가 발생할 수 있음.

 

-4. default로 /tmp 를 사용하는 원인 파악

my_config.h


#define DEFAULT_MYSQL_HOME "/usr/local/mysql"
#define SHAREDIR "/usr/local/mysql/share"
#define DEFAULT_BASEDIR "/usr/local/mysql"
#define MYSQL_DATADIR "/usr/local/mysql/data"
#define DEFAULT_CHARSET_HOME "/usr/local/mysql"
#define PLUGINDIR "/usr/local/mysql/lib/plugin"
/* #undef DEFAULT_SYSCONFDIR */
#define DEFAULT_TMPDIR P_tmpdir

=> DB 엔진 영역의 my_config.h 등 구성파일을 살펴보면 DEFAULT_TMPDIR 이 P_tmpdir 로 설정되어 있음

 

/* Default path prefix for `tempnam' and `tmpnam'.  */
# define P_tmpdir       "/tmp"
=> 위 P_tmpdir은 OS 구성 파일 중 하나인 stdio.h 에 지정되어있음
 

-5. 해결방법 

[TESTSERVER:TESTUSER]/home/TESTUSER] export TMPDIR=/bkup001/TESTUSER/
[TESTSERVER:TESTUSER]/home/TESTUSER] echo $TMPDIR
/bkup001/TESTUSER/
=> OS 에서 TMPDIR 환경변수를 서버 내 파일시스템 중 가용공간이 많은 곳으로 지정함
 
[TESTSERVER:TESTUSER]/logs001/TESTUSER/TESTDB/binary] mysqlbinlog mysql-bin.000683 --verbose > test.sql
=> mysqlbinlog 커맨드 사용하여 binlog 변환 시작
 
[TESTSERVER:TESTUSER]/home/TESTUSER] df -k

Filesystem           1K-blocks     Used Available Use% Mounted on
/dev/mapper/rootvg-root_vg
                      26195836  7764356  17094136  32% /

/dev/mapper/TEST_VG001-bkup_lv001
                     257899908 98129064 146665564  41% /bkup001
                   
/dev/mapper/TEST_VG001-logs_lv001
                     103081248 38248652  59589716  40% /logs001
 
[TESTSERVER:TESTUSER]/home/TESTUSER] df -k
Filesystem           1K-blocks     Used Available Use% Mounted on
/dev/mapper/rootvg-root_vg
                      26195836  7764356  17094136  32% /

/dev/mapper/TEST_VG001-bkup_lv001
                     257899908 118724920 126069708  49% /bkup001
                     
/dev/mapper/TEST_VG001-logs_lv001
                     103081248 38715948  59122420  40% /logs001

=> /tmp 영역을 사용하지 않고 위에서 지정한 TMPDIR 환경변수 값대로 /bkup001 영역을 사용한 것을 확인