MySQL의 행 크기 오류


11

Macbook에서 테스트를 위해 MySQL 서버를 실행하고 있습니다. 버전은 Homebrew에서 5.6.20입니다. "행 크기가 너무 큼"오류가 발생하기 시작했으며이 테스트 사례로 줄일 수있었습니다. 표:

mysql> describe test;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| stuff | longtext | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+

테이블 상태 :

mysql> show table status where Name = 'test';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| 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 |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| test | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |            0 |   5242880 |              2 | 2014-08-28 23:51:12 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+

stuff열이 5033932 바이트를 초과 하는 테이블에 행을 삽입하려고 할 때 발생하는 오류 입니다.

mysql> select length(stuff) from test;
+---------------+
| length(stuff) |
+---------------+
|       5033932 |
+---------------+

mysql> update test set stuff = concat(stuff, 'a');
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.

이 오류를 검색했으며 대부분의 답변에 너무 많은 TEXT 열이 포함되어 있으며 각 열에 768 바이트가 인라인으로 저장되어 있습니다. 보시다시피, 그것은 나에게 해당되지 않습니다. 또한 숫자 5033932는 테이블에있는 열 수에 관계없이 동일하게 유지됩니다. 원래 응용 프로그램에는 5 개의 열이 있었으며 열 크기가 5033932를 초과하면 업데이트가 계속 실패했습니다.

또한 사람들이 행 형식을 전환하여 문제를 해결하는 것을 보았습니다.이 형식은 조금 시도하지만이 오류의 원인을 정확하게 이해하고 싶습니다.

미리 감사드립니다!

답변:


12

5.6.20 릴리스 정보의 변경 사항 :

큰 외부 저장 BLOB 필드에 대한 리두 로그 쓰기는 가장 최근의 검사 점을 덮어 쓸 수 있습니다. 5.6.20 패치는 리두 로그 BLOB 쓰기의 크기를 리두 로그 파일 크기의 10 %로 제한합니다. 5.7.5 패치는 제한없이 버그를 해결합니다. MySQL 5.5의 경우 버그는 알려진 제한 사항으로 남아 있습니다.

MySQL 5.6에 도입 된 리두 로그 BLOB 쓰기 제한의 결과로, innodb_log_file_size는 테이블 행에서 발견 된 가장 큰 BLOB 데이터 크기의 10 배보다 큰 변수 길이와 다른 가변 길이 필드 길이 (VARCHAR, VARBINARY)를 설정해야합니다. 및 TEXT 유형 필드). 그렇지 않으면 "행 크기가 너무 큼"오류가 발생할 수 있습니다.

(강조 광산)

기본값 innodb_log_file_size은 50331648입니다. 이는 데이터 유형에 관계없이 만들 수있는 가장 큰 BLOB / TEXT 값이 5033164에 가까우며 정확한 값이 5033932임을 발견했습니다. 내부적으로 계산에는 약간의 퍼지 요소가 포함되어 있다고 가정합니다.

innodb_log_file_size더 큰 BLOB / TEXT 데이터를 저장 하려면 증가시켜야 합니다. 다행히도 5.6에서는 로그 파일 크기를 변경하는 것이 이전 버전의 InnoDB보다 훨씬 쉽습니다. 새로운 값으로 my.cnf에 줄을 추가하고 mysqld를 다시 시작하십시오.


작은 통지, 변경 사항을 적용하려면 다시 시작하거나 중지 한 후 다시 시작해야합니다. 다시로드가 작동하지 않습니다
Hieu Vo

1
이 리두 크기 제한은 mysql 5.6.22에서 총 결합 된 innodb_log_file_size (innodb_log_file_size * innodb_log_files_in_group)의 10 %로 완화되었습니다. longblob의 최대 길이는 4294967295 (2 ^ 32-1) 자, 즉 4GB입니다. 이 longblob 값을 저장하려면 최소 40GB의 innodb_log_file_size (innodb_log_file_size * innodb_log_files_in_group)가 있어야합니다.
kasi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.