Mysql

錯誤 1180 (HY000):送出期間出現錯誤 5

  • June 9, 2021

我們正在使用 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子集並送出每個子集。


在較小的事務中執行此操作的方法是限制每個事務的行數。

create table tab2 
select id, report from my_table 
where id between 1 and 1000;

我假設id是主鍵,因此您不需要distinct.

然後在單獨的事務中插入下一個子集:

insert into tab2
select id, report from my_table 
where id between 1001 and 2000;

然後是下一個,依此類推:

insert into tab2
select id, report from my_table 
where id between 2001 and 3000;

繼續前進,直到您完成足夠多的這些子集以達到MAX(id).my_table

引用自:https://dba.stackexchange.com/questions/293962