MySQL 대용량 import 주의 binary log

요약하자면

  • 대용량 데이터를 import 할 때는 binary log 보관 기간을 최소화 하자. 
  • MySQL 기본 설정으로 import 하면, 대략 그만큼의 디스크 용량이 필요하기 때문이다. 
  • import 후에는 binary log 보관 기간을 적절히 변경한다. 


MySQL 버전이다. 

1
2
3
user@dev:~$ mysql --version
mysql  Ver 8.0.32-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))
user@dev:~$
cs


가상서버호스팅 이전 중 문제 발생

가상서버호스팅 변경하고, 서버 이전을 하고 있다. MySQL 데이터를 import 하다가 실패했다. 원인은 디스크 풀, 용량이 많기는 하지만 꽉 찰 정도는 아니었다.

원인은 MySQL에서 생성하는 binary log 였다. MySQL은 수행 기록을 저장하는데, 기본 설정은 30일간 보관이다. 그러니 import 를 제대로 수행하려면 디스크 용량을 충분히 확보하자. 최소한 복원할 자료의 두배 이상이어야 한다. 여의치 않다면 binary log 보관 기간을 최소화하고, 수행하는 것도 방법이다. 


이렇게 작업했다. 

먼저 기존의 binary log를 삭제했다. 

1
2
3
4
5
6
7
8
9
10
11
12
mysql> purge binary logs before now();
Query OK, 0 rows affected, 1 warning (0.02 sec)
 
mysql> show binary logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000109 |  31231733 | No        |
+---------------+-----------+-----------+
1 row in set (0.00 sec)
 
mysql>
cs


binary log 보관 기간을 30분으로 설정했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> show global variables like 'binlog_expire_logs_seconds';
+----------------------------+---------+
| Variable_name              | Value   |
+----------------------------+---------+
| binlog_expire_logs_seconds | 2592000 |
+----------------------------+---------+
1 row in set (0.05 sec)
 
mysql> set global binlog_expire_logs_seconds=1800;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show global variables like 'binlog_expire_logs_seconds';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| binlog_expire_logs_seconds | 1800  |
+----------------------------+-------+
1 row in set (0.00 sec)
 
mysql>
cs


MySQL import 를 실행했다. 

1
2
3
4
5
user@dev:~$ nohup mysql -uUser -pPassword MyDatabase < MysqlDump.sql > MysqlDump.log &
[121046
user@dev:~$ nohup: redirecting stderr to stdout
 
user@dev:~$
cs


잘 끝났다.

1
2
3
user@dev:~$
[1]+  Done                    nohup mysql -uUser -pPassword MyDatabase < MysqlDump.sql > MysqlDump.log &
user@dev:~$
cs


binary log 보관 기간을 30일로 변경했다.

1
2
3
4
5
6
7
8
9
10
11
12
mysql> set global binlog_expire_logs_seconds=2592000;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show global variables like 'binlog_expire_logs_seconds';
+----------------------------+---------+
| Variable_name              | Value   |
+----------------------------+---------+
| binlog_expire_logs_seconds | 2592000 |
+----------------------------+---------+
1 row in set (0.05 sec)
 
mysql>
cs


댓글 쓰기

0 댓글