Mysql
錯誤 1180 (HY000):送出期間出現錯誤 5
我們正在使用 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