mysql 如何在启用多线程时获取上次SQL复制错误?

k97glaaz  于 2023-02-03  发布在  Mysql
关注(0)|答案(1)|浏览(134)

从MySQL 8.0.27开始,复制副本服务器现在默认启用多线程。Source
在此之前,如果复制失败,我们可以在show replica status\G;的结果中得到Last_Error的确切错误。现在,查询被替换为“Anonymous”:
协调器已停止,因为工作进程中存在错误。最近的错误为:工作进程1无法在主日志mysql-bin.031116,end_log_pos 81744270处执行事务'ANONYMOUS'。有关此故障或其他故障(如果有)的详细信息,请参阅错误日志和/或performance_schema.replication_appler_status_by_worker表。
performance_schema.replication_applier_status_by_worker也不包含确切的错误:

mysql> select * from performance_schema.replication_applier_status_by_worker\G
*************************** 1. row ***************************
                                           CHANNEL_NAME:
                                              WORKER_ID: 1
                                              THREAD_ID: 128
                                          SERVICE_STATE: ON
                                      LAST_ERROR_NUMBER: 0
                                     LAST_ERROR_MESSAGE:
                                   LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00.000000
                               LAST_APPLIED_TRANSACTION: ANONYMOUS
     LAST_APPLIED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP: 2021-11-16 11:35:04.414021
    LAST_APPLIED_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP: 2021-11-16 11:35:04.414021
         LAST_APPLIED_TRANSACTION_START_APPLY_TIMESTAMP: 2021-11-16 11:35:04.416898
           LAST_APPLIED_TRANSACTION_END_APPLY_TIMESTAMP: 2021-11-16 11:35:04.420018
                                   APPLYING_TRANSACTION:
         APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP: 0000-00-00 00:00:00.000000
        APPLYING_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP: 0000-00-00 00:00:00.000000
             APPLYING_TRANSACTION_START_APPLY_TIMESTAMP: 0000-00-00 00:00:00.000000
                 LAST_APPLIED_TRANSACTION_RETRIES_COUNT: 0
   LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER: 0
  LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE:
LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP: 0000-00-00 00:00:00.000000
                     APPLYING_TRANSACTION_RETRIES_COUNT: 0
       APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER: 0
      APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE:
    APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP: 0000-00-00 00:00:00.000000

-- <I've removed 3 other similar blocks>

我确实可以在MySQL错误日志中找到错误(eidogg. "Could not execute Write_rows event on table db.table; Duplicate entry '16737' for key 'table.PRIMARY'"),但不再是从查询中找到的。
是否有其他查询会给予我最后一个错误消息?或者有一个特定的设置来记录它并在show replica status\G;下显示它?

mftmpeh8

mftmpeh81#

实际上,你是对的。根据文档,一旦你使用MTR(多线程复制),SQL线程就是工作线程的协调者。下面是文档对它的说明:
如果复制副本是多线程的,则SQL线程是工作线程的协调器。在这种情况下,Last_SQL_Error字段显示的正是性能方案replication_applier_status_by_coordinator表中Last_Error_Message列所显示的内容。修改该字段值以表明其他工作线程中可能存在更多故障,这可以在显示每个工作线程状态的replication_applier_status_by_worker表中看到。如果该表不可用,则可以使用副本错误日志。还应使用该日志或replication_applier_status_by_worker表了解有关SHOW SLAVE STATUS或协调器表显示的故障的详细信息。
在这种情况下,您可以检查performance_schema.replication_applier_status_by_coordinator,然后通过performance_schema.replication_applier_status_by_worker了解更多信息。否则,可以使用错误日志。

相关问题