보류중인 트랜잭션으로 MySQL 테이블 삭제


10

MySQL에서 보류중인 트랜잭션이있는 InnoDB 테이블 또는 데이터베이스를 삭제하는 방법이 있습니까 (바람직하게는 파일 시스템 수준에서)?

어떻게 된 거예요:

MySQL 5.5.28을 사용 LOAD DATA INFILE…하여 거대한 데이터 세트 (300M 행)를 InnoDB 테이블로 가져 왔습니다 . 나는 set autocommit = 0;전에 사용하지 않았다 . 불행히도 mysqld수입 도중에 중단되었습니다.

다시 시작 mysql하면 시스템 로그를 다음과 같은 메시지로 채우는 트랜잭션을 롤백하려고 시도합니다.

mysqld_safe [4433] : 121212 16:58:52 InnoDB : 1 개의 활성 트랜잭션이 완료되기를 기다리는 중

문제는 롤백이 25 시간 이상 동안 실행되어 mysqld소켓 연결을 수락하지 않는다는 것입니다.

/var/lib/mysql/*이 머신에는 다른 InnoDB 데이터베이스 / 테이블도 있기 때문에 삭제 하고 처음부터 시작할 수 없습니다 . 그러나 문제가되는 테이블은 별도의 데이터베이스에있는 유일한 테이블입니다. 나중에 모든 데이터를 다시 가져올 수 있으므로 전체 테이블 또는 전체 데이터베이스를 삭제해도 문제가되지 않습니다.

답변:


8

롤백이 ibdata1 내부의 UNDO 테이블 스페이스 를 통해 수행되고 있기 때문에 실제로 할 수있는 일은 없습니다 .

mysqld 프로세스를 종료하고 mysql을 다시 시작하면 응급 복구주기의 일부로 중단 된 부분 만 선택됩니다.

면책 조항 : 데이터 손실에 대한 책임이 없음

수행 할 수있는 작업으로 다른 테이블의 데이터가 손실 될 수 있지만 InnoDB의 정상적인 응급 복구주기를 우회하기 위해 수행 할 수있는 작업이 있습니다.

innodb_force_recovery 라는 시작 옵션이 있으며 이를 통해 다양한 단계의 InnoDB 응급 복구를 우회 할 수 있습니다.

InnoDB 복구 강제 에 대한 MySQL 문서에 따르면 설정 및 효과는 다음과 같습니다.

1 (SRV_FORCE_IGNORE_CORRUPT)

손상된 페이지가 감지 된 경우에도 서버를 실행하십시오. SELECT * FROM tbl_name이 손상된 인덱스 레코드 및 페이지를 뛰어 넘어 테이블 덤프에 도움이되도록하십시오.

2 (SRV_FORCE_NO_BACKGROUND)

마스터 스레드가 실행되지 않도록합니다. 제거 작업 중에 충돌이 발생하면이 복구 값으로 인해 충돌이 방지됩니다.

3 (SRV_FORCE_NO_TRX_UNDO)

응급 복구 후 트랜잭션 롤백을 실행하지 마십시오.

4 (SRV_FORCE_NO_IBUF_MERGE)

삽입 버퍼 병합 조작을 방지하십시오. 충돌이 발생하면하지 마십시오. 테이블 통계를 계산하지 마십시오.

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

데이터베이스를 시작할 때 실행 취소 로그를 보지 마십시오. InnoDB는 불완전한 트랜잭션조차 커밋 된 것으로 간주합니다.

6 (SRV_FORCE_NO_LOG_REDO)

복구와 관련하여 리두 로그 롤 포워드를 수행하지 마십시오.

UNDO 및 REDO 로그에 트랜잭션 변경 사항이 저장되면 다음과 같은 위험이 있습니다.

  • 기록 될 데이터 손실
  • 데이터를 삭제하도록 유지

부작용이 예상되는 경우 전체 / var / lib / mysql을 백업하고 ibdata1, ib_logfile0 및 ib_logfile1을 복사하고 정상적인 복구를 다시 시도하려는 경우를 대비하여 어딘가에 두십시오.

mysql이 모드 중 하나에서 완전히 가동 된 경우

  • 위반 테이블을 제외한 모든 데이터를 mysqldump
  • MySQL 종료
  • / var / lib / mysql / mysql을 제외하고 / var / lib / mysql에서 모든 것을 제거하십시오.
  • MySQL을 시작
  • mysqldump를 다시로드하십시오.

주의 사항 : 모든 것을 백업하십시오!

이게 도움이 되길 바란다 !!!


1

이번 주에도 비슷한 상황이 발생했습니다.

그리고 테스트 서버에 전체 백업을 복원하고 거대한 보류중인 트랜잭션으로 테이블을 삭제, 삭제 또는 종료하려고 시도한 후 4 회 반복 한 결과 결국 금요일 오후에 도착하여 실행하기로 결정했습니다. 3 일 동안 트랜잭션은 무시할 수있는 서버로드로 완료되었으며 데이터베이스에 문제가 없었습니다. 시도하고 실패한 .frm 파일 및 mysql 테이블에 대한 수동 작업보다 훨씬 낫습니다.

내 해결책 : 삭제하지 마십시오 . 며칠 동안 다른 작업을 중단하거나 어딘가에 디스크 공간을 찾거나 슬레이브 서버가로드를 수행해야하더라도 보류중인 트랜잭션이 완료되도록합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.