Programing

테이블에서 데이터 행을 삭제 한 후 MySQL InnoDB가 디스크 공간을 공개하지 않음

crosscheck 2020. 7. 5. 08:05
반응형

테이블에서 데이터 행을 삭제 한 후 MySQL InnoDB가 디스크 공간을 공개하지 않음


InnoDB 스토리지 엔진을 사용하는 하나의 MySQL 테이블이 있습니다. 약 2M 개의 데이터 행을 포함합니다. 테이블에서 데이터 행을 삭제해도 할당 된 디스크 공간이 해제되지 않았습니다. optimize table명령 을 실행 한 후 ibdata1 파일의 크기도 줄어들지 않았습니다 .

MySQL에서 디스크 공간을 회수 할 수있는 방법이 있습니까?

나는 나쁜 상황에 처해있다. 이 응용 프로그램은 약 50 개의 다른 위치에서 실행되고 있으며 디스크 공간 부족 문제가 거의 모든 장소에 나타납니다.


MySQL은 ibdata1의 크기를 줄이지 않습니다. 이제까지. optimize table삭제 된 레코드에서 사용 된 공간을 비우는 데 사용하더라도 나중에 다시 사용합니다.

다른 방법은 서버를 사용하도록 구성하는 innodb_file_per_table것이지만 백업, 데이터베이스 삭제 및 복원이 필요합니다. 긍정적 인 측면은 테이블의 .ibd 파일이 optimize table.


나 자신도 같은 문제가 있었다.

데이터베이스를 삭제하더라도 innodb는 여전히 디스크 공간을 해제하지 않습니다. 내보내고, mysql을 중지하고, 파일을 수동으로 제거하고, mysql을 시작하고, 데이터베이스와 사용자를 작성한 다음 가져와야했습니다. 200MB의 행만 있었지만 250GB의 innodb 파일을 절약했습니다.

의도적으로 실패합니다.


innodb_file_per_table을 사용하지 않으면 디스크 공간을 되 찾을 수는 있지만 지루하며 상당한 가동 중지 시간이 필요합니다.

방법은 꽤 깊이있는 -하지만 나는 아래의 관련 부분을 붙여.

덤프에 스키마 사본도 보관하십시오.

현재 시스템 테이블 스페이스에서 데이터 파일을 제거 할 수 없습니다. 시스템 테이블 스페이스 크기를 줄이려면 다음 절차를 수행하십시오.

mysqldump를 사용하여 모든 InnoDB 테이블을 덤프하십시오.

서버를 중지하십시오.

ibdata 및 ib_log 파일을 포함하여 기존 테이블 스페이스 파일을 모두 제거하십시오. 정보의 백업 사본을 유지하려면 MySQL 설치에서 파일을 제거하기 전에 모든 ib * 파일을 다른 위치로 복사하십시오.

InnoDB 테이블의 .frm 파일을 제거하십시오.

새 테이블 스페이스를 구성하십시오.

서버를 다시 시작하십시오.

덤프 파일을 가져옵니다.


공간 회수 문제를 해결하는 다른 방법은 테이블 내에서 다중 파티션 생성-범위 기반, 값 기반 파티션을 사용하여 파티션을 삭제 / 잘라서 공간을 회수하여 특정 파티션에 저장된 전체 데이터가 사용하는 공간을 해제하는 것입니다.

고유 키, 파티션 열을 포함하는 인덱스 등과 같이 테이블 파티셔닝을 도입 할 때 테이블 스키마에 일부 변경이 필요합니다.


10 년 후 나는 같은 문제를 겪었다. 나는 다음과 같은 방식으로 해결했다.

  • 남은 모든 데이터베이스를 최적화했습니다.
  • 서비스에서 컴퓨터와 MySQL을 다시 시작했습니다 (Windows + r-> services.msc).

그게 다야 :)


MySQL Inodb 엔진의 테이블에서 데이터를 삭제 한 후 디스크 공간을 확보하는 방법에는 여러 가지가 있습니다

처음부터 innodb_file_per_table을 사용하지 않으면 모든 데이터를 덤프하고 모든 파일을 삭제하고 데이터베이스를 다시 작성하고 데이터를 다시 가져 오는 것이 유일한 방법입니다 (위의 FlipMcF 답변 확인)

innodb_file_per_table을 사용하는 경우 시도해 볼 수 있습니다

  1. 모든 데이터를 삭제할 수 있으면 truncate 명령은 데이터를 삭제하고 디스크 공간을 확보합니다.
  2. 테이블 변경 명령은 디스크 공간을 확보 할 수 있도록 테이블을 삭제하고 다시 작성합니다. 따라서 데이터를 삭제 한 후 hardisk를 해제하기 위해 아무것도 변경하지 않는 alter table을 실행하십시오 (예 : table TBL_A에는 charset uf8이 있고, delete data run 후 ALTER TABLE TBL_A charset utf8->이 명령은 테이블에서 아무것도 변경하지 않지만 mysql은 테이블을 다시 작성하고 다시 얻습니다. 디스크 공간
  3. TBL_A와 같은 TBL_B를 작성하십시오. TBL_A에서 유지하려는 선택 데이터를 TBL_B에 삽입하십시오. TBL_A를 삭제하고 TBL_B의 이름을 TBL_A로 바꾸십시오. 이 방법은 TBL_A와 삭제해야하는 데이터가 큰 경우에 매우 효과적입니다 (MySQL innodb의 delete 명령은 성능이 매우 떨어짐)

참고 : https://stackoverflow.com/questions/1270944/mysql-innodb-not-releasing-disk-space-after-deleting-data-rows-from-table

반응형