모든 데이터베이스를 덤프하지 않고 innodb 파일 ibdata1을 어떻게 축소합니까?


24

InnoDB는 모든 테이블을 하나의 큰 파일로 저장합니다 ibdata1.

큰 테이블을 삭제 한 후 파일 크기에 관계없이 파일 크기가 유지됩니다. 전체 데이터베이스 (총 수백 GB가 있음)를 덤프하고 다시 가져 오지 않고도 파일을 어떻게 축소 할 수 있습니까?

그 이유는 여전히 떨어지는 것을 롤백 할 수 있기 때문이라고 생각합니다. 제 경우에는 필요하지 않습니다.

답변:


30

이것은 MySQL DBA 및 DBA ​​StackExchange에서 수년에 걸쳐 다루어 왔던 가장 논란이 많은 주제 중 하나입니다.

온화하게 말하면, 단순히을 ibdata1을 축소 할 다른 방법이 없습니다 . 로 innodb_file_per_table 장애인 실행할 때마다 OPTIMIZE TABLEInnoDB의 테이블은을 ibdata1 빠르게 성장한다. 사용하여 삭제 DROP TABLE되고 DROP DATABASEDML이 아닌 DDL이므로 롤백 할 수없는 데이터 Oracle과 MSSQL이 DDL을 롤백 할 수 있다고 생각합니다. MySQL은 그렇게 할 수 없습니다.

ibdata1에 상주하는 여러 종류의 정보가 있습니다

  • 테이블 데이터
  • 테이블 인덱스
  • 테이블 메타 데이터
  • MVCC 제어 데이터
  • 이중 쓰기 버퍼 (OS 캐싱에 의존하지 않도록하는 백그라운드 쓰기)
  • 버퍼 삽입 (고유하지 않은 보조 인덱스에 대한 변경 관리)

를 사용 innodb_file_per_table=1하면 ibdata1 외부에서 생성되는 테이블 데이터 및 테이블 인덱스를 사용하여 새 테이블을 생성 할 수 있습니다. ALTER TABLE ... ENGINE=InnoDB;또는을 사용하여 ibdata1 내부에있는 테이블을 추출 할 수 OPTIMIZE TABLE있지만 ibdata1에서 사용 되지 않은 큰 공간이 남습니다.

그럼에도 불구하고 InnoDB 인프라를 정리해야합니다. 나는 이미 어떻게 그리고 왜 그렇게하는지에 대한 StackExchange 게시물을 작성했습니다.

좋은 소식

데이터를 덤프하고 한 번 더 다시로드 한 후이 문제를 다시 방문하지 않아도됩니다 . OPTIMIZE TABLE나중에 실행 하면 실제로 .ibdInnoDB 테이블 의 테이블 스페이스 파일이 줄어 듭니다 .


1
사소한 수정 : MSSQL 및 PostgreSQL은 DDL을 롤백 할 수 있습니다. 오라클은 할 수 없습니다. 실제로 Oracle은 DDL을 볼 때 암시 적 커밋을 발행합니다!
Chris Travers 8

1
@RolandoMySQLDBA MySQL의 어떤 버전부터 자동 축소의 "좋은 소식"이 작동합니까?
Gavriel

@Gavriel-당신이 잘못 읽은 것 같아요. 여전히 덤프해야합니다. ibdata1을 제거하고; 재시작; 다시로드하십시오. ibdata1의 자동 축소 없음. (iblog * 변경이 더 간단 해졌습니다.)
Rick James

2

my.cnf 기본 파일에서 다음 설정을 사용하지 않으면 InnoDB는 모든 InnoDB 테이블 만 ibdata1에 저장합니다.

innodb_file_per_table = 1

DROP TABLE (및 DROP DATABASE)은 롤백 할 수 없습니다.

이것이 ibdata1을 축소 할 수없는 이유는 아닙니다.

이것은 간략한 설명이지만 ibdata1에는 테이블 데이터 외에도 InnoDB 내부가 포함되어 있습니다. 내 이해에서 축소하려면 조각 모음이 필요하며 이는 지원되는 작업이 아닙니다.

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