xtrabackup 장애사례

RDB/mariadb 2019. 11. 26. 16:15
반응형

1) xtrabackup 장애

- 사업팀의 긴급요청으로 테스트기를 구축할 여유없이 바로 상용기에 임시테이블 생성 및 대용량 FILE을 insert 할 수 밖에 없는 상황이 생김

 

xtrabackup은 일단위로 풀백업하는 상황이었고, 여기에 대용량 파일을 insert 하다가

xtrabackup과 충돌하여 행이 걸렸다.

 

추후에 테스트기에서 데이터 insert 성공후 확인한 정보는 해당 파일사이즈는 약 100G, insert시 인덱스까지 생성하다보니 실제 tablespace의 파일사이즈는 150G정도임 수행시간은 약 16시간정도였다.

 

2) Lock관련 로그

MariaDB [(none)]> SELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;
+-----------+-------------------------+---------------+---------------------+--------------+---------------------+
| THREAD_ID | LOCK_MODE               | LOCK_DURATION | LOCK_TYPE           | TABLE_SCHEMA | TABLE_NAME          |
+-----------+-------------------------+---------------+---------------------+--------------+---------------------+
|  20362137 | MDL_INTENTION_EXCLUSIVE | NULL          | Global read lock    |              |                     |
|  20362137 | MDL_SHARED_READ         | NULL          | Table metadata lock | MDLDB        | TB_COM_xxx_xxxx       |
|  20362137 | MDL_SHARED_READ         | NULL          | Table metadata lock | MDLDB        | TB_STA_MC_xxx_xxxx |
|  20310373 | MDL_SHARED_WRITE        | NULL          | Table metadata lock | MDLDB        | TMP_LOAD_xxx_xxxx   |
|  20362137 | MDL_SHARED_READ         | NULL          | Table metadata lock | MDLDB        | TB_MDL_xxx_xxxx     |
|  20362137 | MDL_SHARED_WRITE        | NULL          | Table metadata lock | MDLDB        | TB_STA_SVC_xxx_xxxx  |
+-----------+-------------------------+---------------+---------------------+--------------+---------------------+

 

select * from information_schema.innodb_trx;

MariaDB [(none)]> SELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;
+-----------+------------------+---------------+---------------------+--------------+-------------------+
| THREAD_ID | LOCK_MODE        | LOCK_DURATION | LOCK_TYPE           | TABLE_SCHEMA | TABLE_NAME        |
+-----------+------------------+---------------+---------------------+--------------+-------------------+
|  20310373 | MDL_SHARED_WRITE | NULL          | Table metadata lock | MDLDB        | TMP_LOAD_xxx_xxxx |
+-----------+------------------+---------------+---------------------+--------------+-------------------+
1 row in set (0.03 sec)

 

MariaDB [(none)]> select * from information_schema.innodb_trx;

----------+--------------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+------------------+----------------------------+
| trx_id   | trx_state    | trx_started         | trx_requested_lock_id | trx_wait_started | trx_weight | trx_mysql_thread_id | trx_query | trx_operation_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | trx_adaptive_hash_latched | trx_is_read_only | trx_autocommit_non_locking |
+----------+--------------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+------------------+----------------------------+
| 70509851 | ROLLING BACK | 2019-11-09 07:06:36 | NULL                  | NULL             |   52876634 |            20310373 | NULL      | rollback            |                 0 |                 1 |                1 |                  1136 |               0 |          52876633 |                       0 | READ COMMITTED      |                 1 |                      1 | NULL                       |                         0 |                0 |                          0 |
+----------+--------------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+------------------+----------------------------+
1 row in set (0.07 sec)

 

3) 장애원인파악

xtrabackup과 충돌로 행이걸려 제대로 insert가 안되고 innodb에서 자체 롤백중이었다.

 

show processlist; 에서 확인한 결과는 killed 상태였고 여기서 kill 명령어는 제대로 수행되지 않았다.

 

xtrabackup 로그를 확인해보니 apply_log 데이터를 쓰면서 백업물리파일의 sequence를 저장하다가 임시테이블의 트랜젝션이 끝나지 않아 무한대기에 루프를 돌고 있는 상황이었다.

 

xtrabackup apply_log)

InnoDB: Doing recovery: scanned up to log sequence number 7058198598656 (99%)
InnoDB: Doing recovery: scanned up to log sequence number 7058198892824 (100%)
InnoDB: 1 transaction(s) which must be rolled back or cleaned up in total 278336723 row operations to undo
InnoDB: Trx id counter is 70558720
InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percent: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
InnoDB: Apply batch completed
InnoDB: xtrabackup: Last MySQL binlog file position 7587824, file name ./mysql-bin.000001
InnoDB: Starting in background the rollback of uncommitted transactions
InnoDB: Creating shared tablespace for temporary tables
InnoDB: Rolling back trx with id 70509851, 278336723 rows to undo
InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...

InnoDB: Progress in percents: 1InnoDB: File './ibtmp1' size is now 12 MB.
InnoDB: 96 redo rollback segment(s) found. 1 redo rollback segment(s) are active.
InnoDB: 32 non-redo rollback segment(s) are active.
InnoDB: Waiting for purge to start
InnoDB: page_cleaner: 1000ms intended loop took 31280119ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)
InnoDB: 5.7.13 started; log sequence number 7058198892824
InnoDB: xtrabackup: Last MySQL binlog file position 7587824, file name ./mysql-bin.000001

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Waiting for 1 active transactions to finish
InnoDB: Waiting for 1 active transactions to finish
InnoDB: Waiting for 1 active transactions to finish
InnoDB: Waiting for 1 active transactions to finish
InnoDB: Waiting for 1 active transactions to finish
InnoDB: Waiting for 1 active transactions to finish
InnoDB: Waiting for 1 active transactions to finish

....

 

ps -ef에서 kill -9를 하고 싶었으나.. 구글링 결과 끔찍한 결과를 초래할 수 있다는 경고가 많았다. clean up까지는 최장 72시간이 걸릴수도 있다고 하였고, 시스템이 다운되는 것을 염려하여 일단 innodb 의 자체 롤백을 믿어보기로하고 기다렸다.

 

#주의점 : session을 Kill 하게 되면 SMON에 의해서 Clean-up되는 시간이 필요함

SQL에서 Session Kill 후에 OS에서 kill -9 명령어를 또 다시 날리게 되면 SMON을 Kill하게 되므로 DB가 Shutdown 됨

 

#참조사이트

https://otsteam.tistory.com/58

 

4) 장애해결

기다리고.. 기다렸다. 시스템 성능저하는 어쩔 수 없었고..다행이도 실시간 데이터 merge에는 문제없었다. 

50시간 정도 걸려 rollback이 끝났다. 기다리는 게 맞긴 맞다. ㅠ 살았다...

문제가 된 임시테이블은 Drop하였고, xtrabackup은 apply-log 프로세스는 innodb의 롤백이 완료되었으나 여전히 끝나지않고 행 걸려있어 Kill 시켰다.

 

 

MariaDB [(none)]> show processlist;
+----------+-------------+-----------------------+-------+---------+------+--------------------------+------------------+----------+
| Id       | User        | Host                  | db    | Command | Time | State                    | Info             | Progress |
+----------+-------------+-----------------------+-------+---------+------+--------------------------+------------------+----------+
|        3 | system user |                       | NULL  | Daemon  | NULL | InnoDB purge worker      | NULL             |    0.000 |
|        1 | system user |                       | NULL  | Daemon  | NULL | InnoDB purge coordinator | NULL             |    0.000 |
|        4 | system user |                       | NULL  | Daemon  | NULL | InnoDB purge worker      | NULL             |    0.000 |
|        2 | system user |                       | NULL  | Daemon  | NULL | InnoDB purge worker      | NULL             |    0.000 |
|        5 | system user |                       | NULL  | Daemon  | NULL | InnoDB shutdown handler  | NULL             |    0.000 |
| 18731450 | mdlbat      | 172.31.8.77:36718     | MDLDB | Sleep   |   11 |                          | NULL             |    0.000 |
| 20426479 | mdlbat      | 172.31.8.77:44052     | MDLDB | Sleep   |   84 |                          | NULL             |    0.000 |
20 rows in set (0.00 sec)

.....

 

+----------+-------------+-----------------------+-------+---------+------+--------------------------+------------------+----------+
20 rows in set (0.00 sec)

 

 

--> 장애복구완료

대용량 처리는 웬만하면 상용기에서 하지말자...

 

 

 

반응형
블로그 이미지

dung beetle

취미는 데이터 수집 직업은 MYSQL과 함께 일하는 DBA의 소소한 일상 이야기

,