Mysql
如何在 3 節點集群上執行 OPTIMIZE TABLE?
我有一個 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重新添加到集群中。