InnoDB 아키텍처

InnoDB 아키텍처

안녕하세요. 저는 bacula를 사용하고 있는데 테이블 중 하나가 가득 찼습니다.

JobId 8946: Fatal error: sql_create.c:860 Fill File table Query failed: INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5, DeltaSeq) SELECT batch.FileIndex, batch.JobId, Path.PathId, Filename.FilenameId,batch.LStat, batch.MD5, batch.DeltaSeq FROM batch JOIN Path ON (batch.Path = Path.Path) JOIN Filename ON (batch.Name = Filename.Name): ERR=The table 'File' is full

그런 다음 다음을 실행합니다.

mysql> show table status from current_bacula like 'File';
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows     | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free  | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| File | InnoDB |      10 | Compact    | 52153488 |            142 |  7419723776 |               0 |   2593128448 | 2605711360 |      569929045 | 2013-04-15 21:03:59 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
1 row in set (0.31 sec)

my.cnf 파일에는 다음이 포함됩니다.

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:12800M

내가 이해하는 명령은 다음과 같습니다.

ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;

MyISAM 엔진에서만 작동하지 않나요? (틀렸다면 정정해주세요)

그래서 내 질문은: 수정할 수 있습니까?오직예를 들어 las autotextend:max는 다음과 같습니다.

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

서비스를 다시 시작하는 것 외에 다른 작업을 수행해야 합니까? 안전 해요? 나는 다른 ibdataN 파일을 정의할 수 있다는 것을 알고 있지만 현재 서버에서 실행 중인 다른 데이터베이스에 가능한 한 적은 영향을 미치고 싶습니다.

나에게 무엇을 추천합니까?

CentOS 6.4에 mysql-5.1.67-1.el6_3.x86_64가 있습니다.

미리 감사드립니다!

답변1

다른 ibdata 파일을 시작할 수 있습니다

ibdata1그러나 그렇게 하기 전에 및 을 차지하는 것이 무엇인지 알아야 합니다 ibdata2.

  • 테이블 데이터(만약innodb_file_per_table비활성화됨)
  • 테이블 인덱스(인 경우innodb_file_per_table비활성화됨)
  • MVCC(다중 버전 동시성 제어) 데이터
  • 테이블 메타데이터
  • 롤백 세그먼트
  • 실행 취소 로그
  • 이중 쓰기 버퍼

InnoDB 아키텍처

InnoDB 아키텍처

나는 과거에 이전 고용주의 고객 중 한 명과 함께 ibdata3을 추가하는 일을 처리했습니다(내 DBA StackExchange 게시물 참조)."innodb_file_per_table"로 "테이블이 꽉 찼습니다"를 해결하는 방법은 무엇입니까?). ibdata2가 ext3 바이트 한도에 도달했기 때문에 필요했습니다 2,196,875,759,616. 당신은 그런 상황이 없습니다.

당신은 당신의 아이디어를 가지고 갈 수 있습니다

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

하지만 최대값을 모두 제거하는 것이 좋습니다.

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend

경고

공간이 부족한 이유는 실행 취소 로그를 작성하기 때문입니다. ibdata 파일은 1023개의 실행 취소 로그를 보유합니다. 해당 로그를 작동하려면 흔들릴 공간이 필요합니다. 내부 변동 공간이 없으면 MVCC 정보는 롤백 시 데이터의 스냅샷을 보유할 수 없습니다. 귀하의 내부 흔들림 공간은 2605711360약 입니다 2.5G. 이는 분명히 충분하지 않습니다. 이전 고용주의 고객에게는 106G흔들릴 여지가 있었고그들에게는 충분하지 않았습니다.

제안

모든 데이터를 ibdata1및 안에 남겨두고 ibdata2설정을 다음으로 변경 하려면

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

흔들기 방을 모니터링해야합니다.

이렇게 모니터링 할 수 있어요

IBDATA_FILESIZE=8187281408
#
# 8187281408 is 7680M + 128M
#
SQL="SELECT SUM(data_length+index_length)"
SQL="${SQL} FROM information_schema.tables WHERE ENGINE='InnoDB'"
IBDATA_DATAINDEX=`mysql -uroot -p... -ANe"${SQL}"`
(( WIGGLE_ROOM = IBDATA_FILESIZE - IBDATA_DATAINDEX )))
echo ${WIGGLE_ROOM}

이것을 실행할 때마다 여유 공간이 얼마나 되는지 알 수 있습니다. 어떤 InnoDB 테이블이라도 흔들기 공간(실행 취소 정보를 위한 공간)이 없을 때 꽉 찼다고 불평할 가능성이 있기 때문에 어떤 테이블이 관련되어 있는지 알 필요가 없습니다.

관련 정보