MySQL InnoDB-innodb_file_per_table 단점?


32

기본적으로 MySQL InnoDB는 모든 DB의 모든 테이블을 하나의 전역 파일에 저장합니다. 구성에서 innodb_file_per_table을 설정하여이를 변경할 수 있습니다. 그러면 각 테이블마다 하나의 데이터 파일이 작성됩니다.

innodb_file_per_table기본적으로 활성화되어 있지 않은지 궁금 합니다. 그것을 사용하는 데 단점이 있습니까?

답변:


32

나는 이것에 대한 완전한 대답을 가지고 있습니다.

일단 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파일은 일반적으로 정보의 네 가지 유형의 주택

다음은 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 %인지 확인하십시오.

  • STEP 05) ibdata1, ib_logfile0 및 ib_logfile1 을 삭제합니다 (삭제하기 전에 아래 업데이트 참조! )

이 시점에서 / var / lib / mysql에는 mysql 스키마 만 있어야합니다.

  • STEP 06) mysql 재시작

이렇게하면 10MB에서 ibdata1을 다시 만들고 (옵션을 구성하지 않음) ib_logfile0 및 ib_logfile1을 각각 1G로 다시 만듭니다.

  • STEP 07) SQLData.sql을 mysql로 ​​리로드

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.mytableALTER TABLE mydb.mytable ENGINE=InnoDB;/var/lib/mysql/mydb/mytable.ibd

나는 그 후 하나의 문제없이 MySQL DBA로 경력에서 이것을 여러 번 수행했습니다. 실제로 처음이 작업을 수행 할 때 50GB ibdata1 파일을 50MB로 축소했습니다.

시도 해봐. 이에 대한 추가 질문이 있으면 저에게 이메일을 보내십시오. 날 믿어. 이것은 단기적으로 그리고 장기적으로 작동합니다.

업데이트 2013-07-02 15:08 EDT

이 점에서 다른 게시물에서 업데이트했다는주의 사항이 있지만 이것을 놓쳤습니다 .mysql 을 다시 시작하고 mysql을 중지하기 위해 innodb_fast_shutdown으로 답변을 조금 더 업데이트하고 있습니다. 커밋되지 않은 모든 트랜잭션에 InnoDB 트랜잭션 로그 내부 및 외부의 다른 이동 부분이있을 수 있으므로이 한 단계는 매우 중요합니다 ( InnoDB 인프라 참조 ).

innodb_fast_shutdown 을 2로 설정 하면 로그도 정리되지만 더 많은 움직이는 부분이 여전히 존재하며 mysqld가 시작되는 동안 Crash Recovery에서 선택됩니다. 0으로 설정하는 것이 가장 좋습니다.


훌륭한 정보-감사합니다! 50GB >> 50MB-정말 인상적입니다!
UpTheCreek

안녕하세요, 나는 당신이 여기에 쓴대로 정확하게하려고 노력했지만 '유일한'문제는 서버가 나중에 시작되지 않는다는 것입니다. 내가 mysql 서비스를 시작하면 거기에 멈 춥니 다. 이전 cnf 파일을 다시 전환하면 모든 것이 정상입니다. 이것에 대한 단서가 있습니까?
Nicola Peluchetti

이 질문은 니콜라에 관한 것입니다 : 당신은 5 단계를 했습니까 ???
RolandoMySQLDBA

@Nicola에 대한 또 다른 질문 : 시스템에 얼마나 많은 RAM이 있습니까?
RolandoMySQLDBA

2
조심해! innodb_fast_shutdown=0로그 파일을 삭제하기 위해 종료하기 전에 MySQL에서 옵션 을 설정해야합니다! ( ib_logfile0ib_logfile1) 그렇지 않으면 데이터가 손실 될 수 있습니다!
Totor

12

버그를 참조하십시오 .

그것을 사용하는 데 단점이 있습니까?

  • 더 열린 파일
  • 열기 / 다시 열기 오버 헤드
  • .ibd 파일이 축소되지 않습니다 ( 1 , 2 참조 )

나는 항상 큰 데이터베이스에서 innodb_file_per_table을 사용합니다.


사용하지 않더라도 ibdata 파일은 축소되지 않습니다 :(
minaev

1
감사. 또한 db-file 당 옵션이없는 이유가 궁금합니다.
UpTheCreek의

1
@UpTheCreek, 테이블은 엔티티입니다. 데이터베이스는 그 자체의 엔티티가 아닌 논리 엔티티 그룹입니다. 데이터베이스가 디렉토리이고 테이블이 파일 인 MyISAM의 경우 더 분명합니다.
John Gardeniers

.ibd 파일은 자동으로 축소 되지 않으며 ibdata1테이블 당 파일에 대한 대안이 아니라는 점을 지적하고 싶었습니다 . 적어도 optimize tableibdata1 축소에 비해 사소한 .ibd를 축소하는 것이 가능합니다 .
RomanSt

8

innodb_file_per_table은 MariaDB에서 기본적으로 활성화되어 있습니다.


1
내 것이 아닙니다 (CentOS 7의 기본 버전). MySQL 5.6.6 이상의 버전이 필요합니다. 그렇지 않으면 기본값은 해제 입니다.
Monica

2

내가 사용하지 않기로 선택한 이유 innodb_file_per_table는 각 테이블이 자체 파일에 저장되어 있기 때문에 각 테이블이 자체적이고 별도의 오버 헤드 (파일 서명 등)를 가져와 MySQL디렉토리 의 전체, 전체 크기가 발생 하기 때문입니다. 공유 테이블 스페이스를 사용하는 경우보다 큽니다. 또한 하나의 큰 파일 대신 여러 개의 작은 파일이있을 때 클러스터 여유로 인해 더 많은 공간이 낭비됩니다.

물론 추가 오버 헤드는 대규모 계획에서 막대한 양 이 아니며 , 특히 큰 드라이브를 사용하거나 거대한 데이터베이스를 보유하고있는 경우에는 나 자신 (그리고 아마도 많은 "홈 사용자")에게 모두 추가되고 MySQL 저장소를 유지하는 큰 클러스터가있는 작은 드라이브에는 여전히 너무 많았습니다.

예를 들어, WordPress 데이터베이스와 다른 작은 데이터베이스 (phpBB, dev, 일부 AMP 테스트 등)가있는 데이터베이스 저장소를 테이블 단위로 변환하면 32MB에서 50MB로 변경되었으며 ibdata1여전히 데이터베이스를 포함하지 않습니다. 필요 최소 10MB 의 총, 적어도 60메가바이트을.

내가 말했듯이, 이것은 일부 사람들, 특히 기업에게는 큰 문제가되지 않을 수 있지만 사이트, 블로그 등 만 호스팅하는 홈 사용자 인 경우 실제로 선택하는 것과 같은 요인이 될 수 있습니다 많은 호스트가 총 디스크 사용량 외에 데이터베이스 크기를 제한하기 때문에 호스트 제공자.


1
나는 당신이 호스팅 제공 업체의 엄격한 할당량에 대한 요점을 얻을 때까지 당신이 견과류 (약 10 메가 바이트를 돌보는가 ???)라고 생각했습니다. 그런 생각은하지 않았을 것입니다.
Dan Pritts

@DanPritts, 특히 무료 호스트. 게다가, 당신 은 거대한 운전을 수 있지만, 모든 사람이하지는 않습니다. 작년에 메인 데이터 파티션을 1GB에서 2GB로 확장했지만 너무 빡빡했기 때문에 여기에서 10MB와 10MB (특히 로그 파일 포함)까지도 빨리 먹을 수 있습니다. 또한 클러스터 폐기물 추가도 잊지 마십시오. 마지막으로 하드 드라이브 일 필요는 없습니다 . 예를 들어, 현재 모든 웹 사이트에서 웹 사이트를 호스팅 할 수 있도록 웹 사이트를 "포팅"하고 있으므로 2GB 플래시 드라이브는 이미 제한되어 있습니다. 따라서 크기를 작게 유지하고 쓰기를 피하는 것이 중요합니다. 그리고 임베디드 시스템이 있습니다!
Synetech

또한 10MB가 아닙니다 (의 절대 최소 크기 IBDATA1). 30MB에서 ~ 85MB로 증가했습니다. 전체를 삭제하고 덤프를 처음부터 가져옴으로써 이전 30MB 대신 69MB로 끝났습니다 (어떤 데이터베이스가 절반 이상을 차지했는지 추측합니다). 어떤 이유로 테이블 당 사용에도 불구하고 ibdata1여전히 18MB입니다. ☹
Synetech

32M vs. 50M의 파일 크기로 판단하여 selinux를 사용하지 않고 vs.로 CMS를 설치했을 때의 것과 비슷합니다. 나는 숫자를 믿을 수 없으며, 일부 파일의 메타 데이터가 동일한 시스템에서 크기가 MEGABYTES까지 증가 할 수있는 데이터베이스 수는 몇 개인가?
sjas

2

조금만 더 정보를 추가하면

mysql 5.6.6부터는 기본적으로 활성화되어 있습니다.


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