본문 바로가기

Database/mariaDB administrator

mysql ERROR 1118 row size too large 오류 해결 방안

mysql ERROR 1118 row size too large 오류 해결 방안

 

 

MySQL 운영 중 UPDATE 하는데 갑자기 툭 튀어나온 오류였습니다.

 

처음 대충 봤을때 또, 칼럼 사이즈가 문제구나 하고, TEXT 였던 칼럼 타입을 LONGTEXT로 바꾸었는데도 자꾸만 발생을 해서 당황하였었죠...

 

빨리 UPDATE 해야 하는데...ㅠㅠ

 

그래서 자세히 에러 코드를 살펴보았습니다.

 

ERROR 1118 row size too large....

ERROR 1118 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

응?? 좀 다르네...

 

그래서 이것저것 Google에서 찾아보다 해결책을 찾았습니다.

1. 우선 MySQL 내 InnoDB 스토리지 엔진은 한 레코드에 8000 bytes의 크기 제한이 있습니다.

 

2. 위 오류 메시지는 그것을 경고하고 있습니다.

 

3. 테이블 내 칼럼 타입을 TEXT나 BLOB으로 변경 하거나, ROW_FORMAT을 DYNAMIC이나 COMPRESSED 타입으로 변경 해야 합니다.

그런데... 음 이미 제가 UPDATE 하려는 테이블의 컬럼 데이터 타입은 TEXT입니다.

 

그래서 결국 ROW_FORMAT을 DYNAMIC이나 COMPRESSED 타입으로 변경해야 하는 상황이 되어 버렸습니다.

 

이를 변경하기 위해서는 MySQL 파라미터 중 innodb_file_format을 Barracuda로 설정하고, 테이블의 ROW_FORMAT을 DYNAMIC이나 COMPRESSED 타입으로 변경해야 하더군요.

 

우선 지금 데이터베이스의 innodb_file_format 값이 어떻게 설정되어 있는지 확인했습니다.

 

SHOW VARIABLES LIKE 'innodb_file_format';

결과는...

네.. 비어있네요.

 

이 값을 'Barracuda'로 설정하겠습니다.

SET GLOBAL innodb_file_format = barracuda;

설정을 하고 다시 확인을 했습니다. 

 

innodb_file_format 파라미터는 Dynamic 타입이라 이렇게 바로 설정이 됩니다.

그러고 나서 테이블의 ROW_FORMAT을 DYNAMIC이나 COMPRESSED 타입으로 변경하겠습니다.

ALTER TABLE <Table_name>
    ENGINE =InnoDB
        ROW_FORMAT = COMPRESSED
        KEY_BLOCK_SIZE = 8;

요렇게.. ALTER문을 날려줍니다.

 

그러고 나서 다시 UPDATE나 INSERT문을 실행하닌깐 에러 없이 잘 들어가는 것을 확인했습니다.

 

ERROR 1118 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 

 

이 에러에서 이젠 해방이 되었습니다~!!

 

오늘도 하나 배워 갑니다...

 

감사합니다.

 

 

 

by.sTricky