Documentation Home
MySQL 外壳 8.0  / 第 8 章 MySQL InnoDB ClusterSet  / 8.9 InnoDB ClusterSet修复和重新加入  /  8.9.2 InnoDB ClusterSet 集群中的不一致事务集(GTID 集)

8.9.2 InnoDB ClusterSet 集群中的不一致事务集(GTID 集)

clusterSet.status() 如果 InnoDB Cluster 的 GTID 集与 InnoDB ClusterSet 中主集群上设置的 GTID 不一致, AdminAPI 的 命令会向您发出警告。与 InnoDB ClusterSet 中的其他集群相比,处于此状态的集群具有额外的事务,并且具有全局状态 OK_NOT_CONSISTENT. 集群继续在 InnoDB ClusterSet 中以这种状态运行,如果它的 GTID 集是可用副本集群中最新的,您可以对其执行紧急故障转移。但是,它不符合受控切换的条件,因为事务中的差异可能会导致客户端访问不正确的数据。如果集群脱机,它也无法使用额外的事务重新加入 InnoDB ClusterSet。

InnoDB ClusterSet 中的副本集群是只读的,因此如果它一直是副本集群,它不应该包含额外的事务,除非在不使用 AdminAPI 命令的情况下对集群进行了更改。如果您需要在组复制停止时对实例执行管理事务,请始终在发出管理语句之前将 sql_log_bin系统变量 的值设置为OFF,然后返回ON

SET SQL_LOG_BIN=0; 
<administrator action> 
SET SQL_LOG_BIN=1;

将此系统变量设置为OFF意味着从那时起直到您将其设置回之前发生的事务ON不会写入二进制日志,并且不会为它们分配 GTID。

可以在没有外部更改的情况下创建一组不同的事务的情况是当主集群变得无法访问并且使用紧急故障转移程序时。如果主集群在故障转移后仍然在线,它可以继续通过仍然连接到它的任何 MySQL Router 实例接受来自客户端的事务,并将这些传递给仍然连接到它的任何副本集群。或者,显着的复制滞后可能会导致被选作替换主集群的副本集群丢失主集群中的某些事务。在这种情况下,当旧的主集群最初作为无效的副本集群重新上线时,

clusterSet.status() 命令的扩展输出标识任何具有额外事务的集群,并为它们分配OK_NOT_CONSISTENT全局状态。例如:

mysql-js> myclusterset.status({extended: 1})                                                                                                                                                                        
{                                                                                                                                                                                                                                      
    "clusters": {                                                                                                                                                                                                                      
        "clusterone": {                                                                                                                                                                                                                       
            "clusterErrors": [                                                                                                                                                                                                         
                "ERROR: Errant transactions detected"                                                                                                                                                                                  
            ],                                                                                                                                                                                                                         
            "clusterRole": "REPLICA",                                                                                                                                                                                                  
            "clusterSetReplication": {                                                                                                                                                                                                 
                "applierStatus": "APPLIED_ALL",                                                                                                                                                                                        
                "applierThreadState": "Waiting for an event from Coordinator",                                                                                                                                                         
                "applierWorkerThreads": 4,                                                                                                                                                                                             
                "receiver": "127.0.0.1:3310",                                                                                                                                                                                          
                "receiverStatus": "ON",                                                                                                                                                                                                
                "receiverThreadState": "Waiting for source to send event",                                                                                                                                                             
                "source": "127.0.0.1:4410"                                                                                                                                                                                             
            },                                                                                                                                                                                                                         
            "clusterSetReplicationStatus": "OK",                                                                                                                                                                                       
            "globalStatus": "OK_NOT_CONSISTENT",                                                                                                                                                                                       
            "status": "OK",                                                                                                                                                                                                            
            "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",                                                                                                                                                     
            "topology": {                                                                                                                                                                                                              
                "127.0.0.1:3310": {                                                                                                                                                                                                    
                    "address": "127.0.0.1:3310",                                                                                                                                                                                       
                    "memberRole": "PRIMARY",                                                                                                                                                                                           
                    "mode": "R/O",                                                                                                                                                                                                     
                    "replicationLagFromImmediateSource": "",
                    "replicationLagFromOriginalSource": "",
                    "status": "ONLINE",
                    "version": "8.0.27"
                },
                "127.0.0.1:3320": {
                    "address": "127.0.0.1:3320",
                    "memberRole": "SECONDARY",
                    "mode": "R/O",
                    "replicationLagFromImmediateSource": "",
                    "replicationLagFromOriginalSource": "",
                    "status": "ONLINE",
                    "version": "8.0.27"
                },
                "127.0.0.1:3330": {
                    "address": "127.0.0.1:3330",
                    "memberRole": "SECONDARY",
                    "mode": "R/O",
                    "replicationLagFromImmediateSource": "",
                    "replicationLagFromOriginalSource": "",
                    "status": "ONLINE",
                    "version": "8.0.27"
                }
            },
            "transactionSet": "54ff337b-2ccf-11ec-95da-3c6aa7197deb:1-131,54ff3ed7-2ccf-11ec-95da-3c6aa7197deb:1-5,c06527d6-2ce3-11ec-a55e-3c6aa7197deb:1,c0653492-2ce3-11ec-a55e-3c6aa7197deb:1-5",
            "transactionSetConsistencyStatus": "INCONSISTENT",
            "transactionSetConsistencyStatusText": "There are 1 transactions that were executed in this instance that did not originate from the PRIMARY.",
            "transactionSetErrantGtidSet": "c06527d6-2ce3-11ec-a55e-3c6aa7197deb:1",
            "transactionSetMissingGtidSet": ""
        },
        "clustertwo": {
            "clusterRole": "PRIMARY",
            "globalStatus": "OK",
            "primary": "127.0.0.1:4410",
            "status": "OK",
            "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
            "topology": {
                "127.0.0.1:4410": {
                    "address": "127.0.0.1:4410",
                    "memberRole": "PRIMARY",
                    "mode": "R/W",
                    "status": "ONLINE",
                    "version": "8.0.27"
                },
                "127.0.0.1:4420": {
                    "address": "127.0.0.1:4420",
                    "memberRole": "SECONDARY",
                    "mode": "R/O",
                    "replicationLagFromImmediateSource": "",
                    "replicationLagFromOriginalSource": "",
                    "status": "ONLINE",
                    "version": "8.0.27"
                },
                "127.0.0.1:4430": {
                    "address": "127.0.0.1:4430",
                    "memberRole": "SECONDARY",
                    "mode": "R/O",
                    "replicationLagFromImmediateSource": "",
                    "replicationLagFromOriginalSource": "",
                    "status": "ONLINE",
                    "version": "8.0.27"
                }
            },
            "transactionSet": "54ff337b-2ccf-11ec-95da-3c6aa7197deb:1-131,54ff3ed7-2ccf-11ec-95da-3c6aa7197deb:1-5"
        }
    },
    "domainName": "testclusterset",
    "globalPrimaryInstance": "127.0.0.1:4410",
    "metadataServer": "127.0.0.1:4410",
    "primaryCluster": "clustertwo",
    "status": "AVAILABLE",
    "statusText": "Primary Cluster available, there are issues with a Replica cluster."
}

将单个服务器的数据与 InnoDB Cluster 的其余部分进行协调的最安全方法是识别 InnoDB ClusterSet 部署中具有最佳数据(最多事务、最近事务或最重要事务)的服务器,并使用 MySQL 的克隆功能将内容从该服务器传输到受影响的服务器。有关执行此操作的说明,请参阅 克隆远程数据。然后使用 cluster.rejoinInstance() 命令让实例重新加入 InnoDB Cluster。有关此操作的详细信息,请参阅第 7.8.1 节,“将实例重新加入集群”

如果整个 InnoDB Cluster 受到影响,请按照第 8.9.4 节“从 InnoDB ClusterSet 中删除一个 Cluster”中的过程从 InnoDB ClusterSet 部署中删除受影响的集群,并在其位置设置一个新的 InnoDB Cluster。作为设置过程的一部分,新 InnoDB Cluster 中的服务器实例将接收正确的事务集。

如果你想保留额外的事务,可以按照第 8.8 节,“InnoDB ClusterSet 紧急故障转移”中的过程,执行紧急故障转移以使具有这些事务的 InnoDB Cluster 成为主集群。

如果您能够处理问题事务,请使用 clusterSet.rejoinCluster() 操作将 InnoDB Cluster 重新加入到 InnoDB ClusterSet 部署中。有关执行此操作的说明,请参阅 第 8.9.5 节,“将集群重新加入 InnoDB ClusterSet”