我们正在使用 Galera 集群,我正在运行下面的语句来创建一个新表:
create table tab2 select distinct id , report from my_table ;
它运行了一段时间,然后失败/取消并出现以下错误:
ERROR 1180 (HY000): Got error 5 during COMMIT
我搜索了这个错误,发现如果我们设置全局变量 binlog_row_image=minimal 那么问题应该已经消失了。但是,在我的情况下并没有发生这样的事情。我跑到下面,甚至在我检查之后 - 它是在 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)
而且,因为即使在我的新表创建查询失败之后它也没有改变。任何,其他方式来完成它?我只需要在现有表中创建我的新表。
提前致谢!
binlog_row_image=MINIMAL
对 INSERT 无效。这些行将和原来一样大。最小行图像意味着在 UPDATE 的情况下,binlog 事件将仅包含主键列和已更改的列。对于 DELETE,binlog 事件将仅包含 pimary 键列。但是对于一个INSERT,自然因为in的行
tab2
是新行,所以所有的列都是新的。所以它们都是 binlog 行图像所需要的。您遇到的问题是您
select distinct id , report from my_table
正在生成太多行,并且它们的组合大小太大而无法容纳在单个 Galera 事务中。您需要在几个较小的事务中执行此复制,方法是从其中复制行
my_table
子集并提交每个子集。在较小的事务中执行此操作的方法是限制每个事务的行数。
我假设
id
是主键,因此您不需要distinct
.然后在单独的事务中插入下一个子集:
然后是下一个,依此类推:
继续前进,直到您完成足够多的这些子集以达到
MAX(id)
.my_table