Estamos usando o cluster Galera e estou executando a instrução abaixo para fazer uma nova tabela:
create table tab2 select distinct id , report from my_table ;
Ele é executado por algum tempo e depois disso falha/cancela com este erro:
ERROR 1180 (HY000): Got error 5 during COMMIT
Procurei por esse erro e descobri que, se definirmos a variável global binlog_row_image=minimal, o problema deveria ter desaparecido. No entanto, tal coisa não aconteceu no meu caso. Corri abaixo e mesmo depois quando verifiquei - estava em FULL binlog_row_image.
mysql> select @@binlog_row_image;
+--------------------+
| @@binlog_row_image |
+--------------------+
| FULL |
+--------------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL binlog_row_image=minimal;
Query OK, 0 rows affected (0.00 sec)
E, como não mudou mesmo depois disso, minha nova consulta de criação de tabela está falhando. Alguma outra forma de fazer? Eu só preciso criar minha nova tabela a tabela existente.
Desde já, obrigado!
binlog_row_image=MINIMAL
não tem efeito para um INSERT. As linhas serão tão grandes quanto eram.A imagem da linha mínima significa que, no caso de um UPDATE, o evento binlog conterá apenas as colunas de chave primária e as colunas que foram alteradas. Para um DELETE, o evento binlog conterá apenas as colunas da chave pimary. Mas para um INSERT, naturalmente porque a linha
tab2
é uma nova linha, todas as colunas são novas. Portanto, todos eles são necessários para a imagem da linha do log binário.O problema que você tem é que você
select distinct id , report from my_table
está produzindo muitas linhas e seu tamanho combinado é muito grande para uma única transação do Galera.Você precisa fazer essa cópia em várias transações menores, copiando subconjuntos de linhas
my_table
e confirmando cada subconjunto.A maneira de fazer isso em transações menores é limitar o número de linhas por transação.
Estou assumindo que
id
é uma chave primária, portanto, você não precisa dodistinct
.Em seguida, insira o próximo subconjunto, em uma transação separada:
E depois o seguinte, e assim por diante:
Continue até que você faça o suficiente desses subconjuntos para chegar
MAX(id)
emmy_table
.