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)
--> 장애복구완료
대용량 처리는 웬만하면 상용기에서 하지말자...
'RDB > mariadb' 카테고리의 다른 글
MariaDB 10.4.13 mysql계정으로 stop 안되는 현상 해결 (0) | 2020.10.22 |
---|---|
[튜닝] MariaDB where 조건절에 OR 연산인데 빠르게 가능할까? (0) | 2020.10.17 |
xtrabackup 백업 & 압축관련 검토(pigz) (0) | 2020.04.17 |
mariadb 10.2.x 이 프로세스 뭐냐? (0) | 2019.10.17 |
MariaDB 10.2.26 binary 설치 (0) | 2019.09.05 |