Mysql

如何在 3 節點集群上執行 OPTIMIZE TABLE?

  • June 6, 2019

我有一個 3 節點 Percona XtraDB 集群,根據mysqlcheck,其中一些表已損壞(一些索引包含錯誤數量的條目):

mydb.mytable
Warning  : InnoDB: Index 'foo' contains 1393929 entries, should be 1393918.
Warning  : InnoDB: Index 'bar' contains 1393921 entries, should be 1393918.
error    : Corrupt

OPTIMIZE TABLE在集群上執行的最佳實踐是什麼?

我在沒有使用者的測試環境中做了一些實驗,似乎OPTIMIZE TABLE一個節點上的 an 不會自動將其效果傳播到其他節點。這與該命令修改索引和表的儲存空間,而不是其內容或定義的事實是一致的。

  • 在每個節點的生產環境中執行命令,讓它在下一個節點中執行之前完成,可能有什麼缺點?
  • 考慮到 MySQL(和 Percona XtraDB Cluster,據我所知)不支持分佈式表鎖,對使用者會有什麼影響?這會使集群處於不一致的狀態嗎?

如果需要OPTIMIZE TABLE在 PXC 中執行,您可以通過以下三種 (3) 方式之一拒絕將其記錄到二進制日誌中來實現:

方法#1

SET sql_log_bin = 0;
OPTIMIZE TABLE mydb.mytable;
SET sql_log_bin = 1;

方法#2

OPTIMIZE NO_WRITE_TO_BINLOG TABLE mydb.mytable;

方法#3

OPTIMIZE LOCAL TABLE mydb.mytable;

建議

一次在一個 PXC 節點上執行上述OPTIMIZE TABLE場景之一,同時重定向來自集群的讀取和寫入。如果數據量很大,將PXC節點從集群中移除,隨意執行OPTIMIZE TABLE,將PXC重新添加到集群中。

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