Como posso mudar o limite
Tamanho da linha muito grande (> 8126). Alterar algumas colunas para TEXT ou BLOB ou usar ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
pode ajudar. No formato de linha atual, o BLOB
prefixo de 768 bytes é armazenado em linha.
Tabela:
id int(11) No
name text No
date date No
time time No
schedule int(11) No
category int(11) No
top_a varchar(255) No
top_b varchar(255) No
top_c varchar(255) No
top_d varchar(255) No
top_e varchar(255) No
top_f varchar(255) No
top_g varchar(255) No
top_h varchar(255) No
top_i varchar(255) No
top_j varchar(255) No
top_title_a varchar(255) No
top_title_b varchar(255) No
top_title_c varchar(255) No
top_title_d varchar(255) No
top_title_e varchar(255) No
top_title_f varchar(255) No
top_title_g varchar(255) No
top_title_h varchar(255) No
top_title_i varchar(255) No
top_title_j varchar(255) No
top_desc_a text No
top_desc_b text No
top_desc_c text No
top_desc_d text No
top_desc_e text No
top_desc_f text No
top_desc_g text No
top_desc_h text No
top_desc_i text No
top_desc_j text No
status int(11) No
admin_id int(11) No
No
sendo exibido?Respostas:
A pergunta foi feita no serverfault também.
O método que funcionou para o OP foi:
Adicione o seguinte ao
my.cnf
arquivo na[mysqld]
seção.ALTER
a mesa a ser usadaROW_FORMAT=COMPRESSED
.Existe a possibilidade de que o acima ainda não resolva seus problemas. É um bug conhecido (e verificado) com o mecanismo InnoDB , e uma correção temporária por enquanto é retornar ao mecanismo MyISAM como armazenamento temporário. Então, em seu
my.cnf
arquivo:fonte
innodb_file_per_table=1
para ativar esta opção.Corri para esse problema recentemente e resolvi de uma maneira diferente. Se você estiver executando o MySQL versão 5.6.20, há um bug conhecido no sistema. Veja a documentação do MySQL
Na minha situação, a tabela de blob problemática tinha cerca de 16 MB. Assim, resolvi isso adicionando uma linha ao my.cnf que garantiu que eu tivesse pelo menos 10x esse valor e mais:
innodb_log_file_size = 256M
fonte
longblob
campo desapareceu assim que aumentei oinnodb_log_file_size
parâmetro. Também estava executando 5.6.20.Defina os seguintes no seu arquivo my.cnf e reinicie o servidor mysql.
fonte
innodb_strict_mode=0
-> sem espaços. Caso contrário, reiniciar o mariaDB 10.2 resultará em erro :-PSe você pode mudar o ENGINE e usar MyISAM em vez de InnoDB, isso deve ajudar:
ENGINE=MyISAM
Existem duas advertências com MyISAM (possivelmente mais):
fonte
Eu gostaria de compartilhar uma resposta incrível, pode ser útil. Créditos Bill Karwin, veja aqui /dba/6598/innodb-create-table-error-row-size-too-large
Eles variam de acordo com o formato de arquivo InnoDB. No momento, existem 2 formatos chamados Antelope e Barracuda.
O arquivo de espaço de tabela central (ibdata1) está sempre no formato Antelope. Se você usar arquivo por tabela, pode fazer com que os arquivos individuais usem o formato Barracuda definindo innodb_file_format = Barracuda em my.cnf.
Pontos básicos:
Uma página de 16 KB de dados InnoDB deve conter pelo menos duas linhas de dados. Além disso, cada página possui um cabeçalho e um rodapé contendo somas de verificação de página, número de sequência de log e assim por diante. É aí que você obtém seu limite de um pouco menos de 8 KB por linha.
Tipos de dados de tamanho fixo como INTEGER, DATE, FLOAT, CHAR são armazenados nesta página de dados primária e contam para o limite de tamanho da linha.
Tipos de dados de tamanho variável, como VARCHAR, TEXT, BLOB, são armazenados em páginas de estouro, portanto, não contam totalmente para o limite de tamanho de linha. No Antelope, até 768 bytes de tais colunas são armazenados na página de dados primária, além de serem armazenados na página de estouro. O Barracuda suporta um formato de linha dinâmico, portanto, pode armazenar apenas um ponteiro de 20 bytes na página de dados primária.
Os tipos de dados de tamanho variável também são prefixados com 1 ou mais bytes para codificar o comprimento. E o formato de linha InnoDB também possui uma série de deslocamentos de campo. Portanto, há uma estrutura interna mais ou menos documentada em seu wiki.
Barracuda também oferece suporte a ROW_FORMAT = COMPRESSED para obter mais eficiência de armazenamento para dados de estouro.
Também devo comentar que nunca vi uma tabela bem projetada exceder o limite de tamanho de linha. É um forte "cheiro de código" que você está violando a condição de grupos de repetição da Primeira Forma Normal.
fonte
Eu tive o mesmo problema, isso resolveu para mim:
Da documentação MYSQL :
fonte
Warnings from last query: InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope
Row size too large (>8126)
my_table
ROW_FORMAT = DYNAMIC; novamenteDepois de passar horas, encontrei a solução: basta executar o seguinte SQL no administrador do MySQL para converter a tabela para MyISAM:
fonte
create table
tem a mesma opção:CREATE TABLE ... ENGINE=MyISAM ...
Eu tive esse problema quando estava tentando restaurar um banco de dados mysql de backup de um servidor diferente. O que resolveu esse problema para mim foi adicionar certas configurações ao my.conf (como nas perguntas acima) e, adicionalmente, alterar o arquivo de backup sql:
Etapa 1: adicione ou edite as seguintes linhas em my.conf:
Etapa 2 adicionar ROW_FORMAT = DYNAMIC à instrução de criação de tabela no arquivo de backup sql para a tabela que está causando este erro:
a mudança importante acima é ROW_FORMAT = DYNAMIC; (que não foi incluído no arquivo de backup sql original)
fonte que me ajudou a resolver esse problema: MariaDB e InnoDB MySQL Tamanho da linha muito grande
fonte
innodb_page_size=32K
não funcionou, pois causou um erro ao reiniciar o MariaDB 10.2 no meu caso. Em vez disso, adicionei ainnodb_strict_mode=0
linha, conforme descrito aquiinnodb_page_size
requeribdata*
recriação, que é uma operação destrutiva. Assista ao seu syslog para mais informaçõesAs outras respostas respondem à pergunta feita. Abordarei a causa subjacente: projeto de esquema deficiente.
Não espalhe uma matriz nas colunas. Aqui você tem 3 * 10 colunas que devem ser transformadas em 10 linhas de 3 colunas em uma nova tabela (mais
id
, etc)Sua
Main
mesa teria apenasSua mesa extra (
Top
) teriaHaveria 10 (ou menos? Ou mais?) Linhas
Top
para cada umid
.Isso elimina o problema original e limpa o esquema. (Isso não é "normalização", conforme debatido em alguns dos Comentários.)
Fazer não mudar para MyISAM; está indo embora.
Não se preocupe
ROW_FORMAT
.Você precisará alterar seu código para fazer o
JOIN
e para lidar com várias linhas em vez de várias colunas.fonte
Estou usando o MySQL 5.6 no AWS RDS. Eu atualizei o seguinte no grupo de parâmetros.
Tive que reiniciar a instância do banco de dados para que as alterações do grupo de parâmetros entrassem em vigor.
Além disso, ROW_FORMAT = COMPRESSED não era compatível. Usei o DYNAMIC como abaixo e funcionou bem.
fonte
O tamanho máximo da linha para uma tabela InnoDB, que se aplica a dados armazenados localmente em uma página de banco de dados, é um pouco menos do que meia página para 4 KB, 8 KB, 16 KB e 32 KB
Para páginas de 16 kb (padrão), podemos calcular:
Basicamente, você poderia maximizar uma linha com:
Lembre-se de que só irá estourar para uma página de estouro se o campo tiver> 767 bytes. Se houver muitos campos de 767 bytes, ele irá estourar (passando além de max row_size). Não é comum com latin1, mas é muito possível com utf-8 se os desenvolvedores não forem cuidadosos.
Para este caso, acho que você poderia aumentar o innodb_page_size para 32kb.
em my.cnf:
Referências:
fonte
Eu também encontrei o mesmo problema. Eu resolvo o problema executando o seguinte sql:
Mas, eu acho que você deveria saber sobre o Row Storage .
Existem dois tipos de colunas: coluna de comprimento variável (como os tipos VARCHAR, VARBINARY e BLOB e TEXT) e coluna de comprimento fixo . Eles são armazenados em diferentes tipos de páginas.
e quando o objetivo de definir ROW_FORMAT é
Quer saber mais sobre os formatos de linha DINÂMICO e COMPRESSADO
fonte
Se isso ocorrer em um SELECT com muitas colunas, a causa pode ser que o mysql está criando uma tabela temporária. Se esta tabela for muito grande para caber na memória, ela usará seu formato de tabela temporária padrão, que é InnoDB, para armazená-la no disco. Nesse caso, os limites de tamanho do InnoDB se aplicam.
Você tem então 4 opções:
mude o formato padrão da tabela temporária para MYISAM, foi isso que eu fiz. Mudança em my.cnf:
Reinicie o mysql, a consulta funciona.
fonte
Aqui está uma dica simples para qualquer pessoa interessada:
Após a atualização do Debian 9 para o Debian 10 com 10.3.17-MariaDB, tenho alguns erros de bancos de dados Joomla:
[Aviso] InnoDB: Não é possível adicionar campo
field
na tabeladatabase
.table
porque depois de adicioná-lo, o tamanho da linha é 8742, que é maior do que o tamanho máximo permitido (8126) para um registro na página folha do índice.Por precaução, eu defini innodb_default_row_format = DYNAMIC em /etc/mysql/mariadb.conf.d/50-server.cnf (era o padrão de qualquer maneira)
Então, usei o phpmyadmin para executar "Optimize table" para todas as tabelas no banco de dados Joomla. Acho que a recriação da tabela feita pelo phpmyadmin no processo ajudou. Se acontecer de você ter o phpmyadmin instalado, basta apenas alguns cliques.
fonte