기본적으로 MySQL InnoDB는 모든 DB의 모든 테이블을 하나의 전역 파일에 저장합니다. 구성에서 innodb_file_per_table을 설정하여이를 변경할 수 있습니다. 그러면 각 테이블마다 하나의 데이터 파일이 작성됩니다.
왜 innodb_file_per_table
기본적으로 활성화되어 있지 않은지 궁금 합니다. 그것을 사용하는 데 단점이 있습니까?
기본적으로 MySQL InnoDB는 모든 DB의 모든 테이블을 하나의 전역 파일에 저장합니다. 구성에서 innodb_file_per_table을 설정하여이를 변경할 수 있습니다. 그러면 각 테이블마다 하나의 데이터 파일이 작성됩니다.
왜 innodb_file_per_table
기본적으로 활성화되어 있지 않은지 궁금 합니다. 그것을 사용하는 데 단점이 있습니까?
답변:
나는 이것에 대한 완전한 대답을 가지고 있습니다.
일단 innodb_file_per_table 이 제 위치에 놓이면 새로운 InnoDB 테이블을 사용하여 축소 할 수 있습니다. ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
이렇게하면 새 .ibd
파일 이 축소됩니다 .
ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
innodb_file_per_table을 사용하기 전에 생성 된 InnoDB 테이블에서 실행 하면 ibdata1 파일에서 해당 테이블의 데이터와 인덱스를 잡아 당겨 파일에 저장 .ibd
합니다. 이렇게하면 재사용 할 수없는 ibdata1에 영구 비둘기 전체가 남습니다. .
ibdata1
파일은 일반적으로 정보의 네 가지 유형의 주택
Pictorial Representation of ibdata1
다음은 ibdata1 파일을 거의 영원히 축소하는 보장 된 방법입니다.
STEP 01) MySQL 모든 데이터베이스를 SQL 텍스트 파일로 덤프 (SQLData.sql이라고 함)
STEP 02) 모든 데이터베이스 삭제 (mysql, information_schema 및 performance_schema 스키마 제외)
STEP 03) MySQL 종료
단계 04) /etc/my.cnf에 다음 줄을 추가하십시오
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
참고 : innodb_buffer_pool_size에 대한 설정이 무엇이든, innodb_log_file_size가 innodb_buffer_pool_size의 25 %인지 확인하십시오.
이 시점에서 / var / lib / mysql에는 mysql 스키마 만 있어야합니다.
이렇게하면 10MB에서 ibdata1을 다시 만들고 (옵션을 구성하지 않음) ib_logfile0 및 ib_logfile1을 각각 1G로 다시 만듭니다.
ibdata1
증가하지만 테이블 메타 데이터와 간헐적 인 MVCC 데이터 만 포함합니다.
각 InnoDB 테이블은 외부에 존재합니다 ibdata1
mydb.mytable이라는 InnoDB 테이블이 있다고 가정하십시오. 에 들어가면 /var/lib/mysql/mydb
테이블을 나타내는 두 개의 파일이 나타납니다.
mytable.frm
(저장소 엔진 헤더)mytable.ibd
(에 대한 테이블 데이터 및 테이블 인덱스의 홈 mydb.mytable
)ibdata1
더 이상 InnoDB 데이터 및 인덱스를 포함하지 않습니다.
innodb_file_per_table 옵션을 사용 하면 OR /etc/my.cnf
을 실행할 수 있으며 파일 이 실제로 줄어 듭니다.OPTIMIZE TABLE mydb.mytable
ALTER TABLE mydb.mytable ENGINE=InnoDB;
/var/lib/mysql/mydb/mytable.ibd
나는 그 후 하나의 문제없이 MySQL DBA로 경력에서 이것을 여러 번 수행했습니다. 실제로 처음이 작업을 수행 할 때 50GB ibdata1 파일을 50MB로 축소했습니다.
시도 해봐. 이에 대한 추가 질문이 있으면 저에게 이메일을 보내십시오. 날 믿어. 이것은 단기적으로 그리고 장기적으로 작동합니다.
이 점에서 다른 게시물에서 업데이트했다는주의 사항이 있지만 이것을 놓쳤습니다 .mysql 을 다시 시작하고 mysql을 중지하기 위해 innodb_fast_shutdown으로 답변을 조금 더 업데이트하고 있습니다. 커밋되지 않은 모든 트랜잭션에 InnoDB 트랜잭션 로그 내부 및 외부의 다른 이동 부분이있을 수 있으므로이 한 단계는 매우 중요합니다 ( InnoDB 인프라 참조 ).
innodb_fast_shutdown 을 2로 설정 하면 로그도 정리되지만 더 많은 움직이는 부분이 여전히 존재하며 mysqld가 시작되는 동안 Crash Recovery에서 선택됩니다. 0으로 설정하는 것이 가장 좋습니다.
innodb_fast_shutdown=0
로그 파일을 삭제하기 위해 종료하기 전에 MySQL에서 옵션 을 설정해야합니다! ( ib_logfile0
와 ib_logfile1
) 그렇지 않으면 데이터가 손실 될 수 있습니다!
ibdata1
테이블 당 파일에 대한 대안이 아니라는 점을 지적하고 싶었습니다 . 적어도 optimize table
ibdata1 축소에 비해 사소한 .ibd를 축소하는 것이 가능합니다 .
내가 사용하지 않기로 선택한 이유 innodb_file_per_table
는 각 테이블이 자체 파일에 저장되어 있기 때문에 각 테이블이 자체적이고 별도의 오버 헤드 (파일 서명 등)를 가져와 MySQL
디렉토리 의 전체, 전체 크기가 발생 하기 때문입니다. 공유 테이블 스페이스를 사용하는 경우보다 큽니다. 또한 하나의 큰 파일 대신 여러 개의 작은 파일이있을 때 클러스터 여유로 인해 더 많은 공간이 낭비됩니다.
물론 추가 오버 헤드는 대규모 계획에서 막대한 양 이 아니며 , 특히 큰 드라이브를 사용하거나 거대한 데이터베이스를 보유하고있는 경우에는 나 자신 (그리고 아마도 많은 "홈 사용자")에게 모두 추가되고 MySQL 저장소를 유지하는 큰 클러스터가있는 작은 드라이브에는 여전히 너무 많았습니다.
예를 들어, WordPress 데이터베이스와 다른 작은 데이터베이스 (phpBB, dev, 일부 AMP 테스트 등)가있는 데이터베이스 저장소를 테이블 단위로 변환하면 32MB에서 50MB로 변경되었으며 ibdata1
여전히 데이터베이스를 포함하지 않습니다. 필요 최소 10MB 의 총, 적어도 60메가바이트을.
내가 말했듯이, 이것은 일부 사람들, 특히 기업에게는 큰 문제가되지 않을 수 있지만 사이트, 블로그 등 만 호스팅하는 홈 사용자 인 경우 실제로 선택하는 것과 같은 요인이 될 수 있습니다 많은 호스트가 총 디스크 사용량 외에 데이터베이스 크기를 제한하기 때문에 호스트 제공자.
IBDATA1
). 30MB에서 ~ 85MB로 증가했습니다. 전체를 삭제하고 덤프를 처음부터 가져옴으로써 이전 30MB 대신 69MB로 끝났습니다 (어떤 데이터베이스가 절반 이상을 차지했는지 추측합니다). 어떤 이유로 테이블 당 사용에도 불구하고 ibdata1
여전히 18MB입니다. ☹
innodb_file_per_table = 1이면 삭제 테이블이 느려질 수 있습니다. 여기를 참조하십시오.