我有一个 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
方法#2
方法#3
建议
一次在一个 PXC 节点上运行上述
OPTIMIZE TABLE
场景之一,同时重定向来自集群的读取和写入。如果数据量很大,将PXC节点从集群中移除,随意运行OPTIMIZE TABLE
,将PXC重新添加到集群中。在三节点集群上,最好的方法是使用 pt-online-schema-change。
然后运行以下。
OPTIMIZE TABLE
在任何InnoDB 系统上的最佳实践:不要运行它。这几乎不值得付出努力。如果必须在 Galera 集群(如 PXC)中进行,则将其视为
ALTER
:如果是小表,则使用 TOI(为简单起见);RSU(避免阻塞)如果它很大。由于
OPTIMIZE
不改变表格的内容,只是布局,你的问题让它完成,不一致是无关紧要的。