Mysql

MySQL Cluster -> Galera MariaDB Cluster Replication 不工作,但沒有錯誤

  • April 22, 2019

我正在執行 MySQL Cluster 7.2 (MySQL 5.5) 的 2 節點主集群和執行帶有 Galera 集群的 MariaDB 10.3 的 2 節點從集群(加上仲裁器)之間設置數據庫遷移。我目前關閉了除了一個 Galera 集群的節點之外的所有節點,以簡化編排。

配置顯示正確,並且SHOW ALL SLAVES STATUS \G顯示的所有內容都表明復製成功。 Read_並且Exec_Master_Log_Pos相互匹配以及主伺服器報告的內容,沒有記錄錯誤等。事實上,將數據庫添加到我們正在複製的主節點在從節點中創建一個數據庫。 但是,沒有任何數據行被複製。

mariadb.err 中唯一的奇怪之處如下:

2019-04-11 18:31:19 101 [Warning] Master '[redacted]': Slave I/O: Notifying master by SET @master_binlog_checksum= @@global.binlog_checksum failed with error: Unknown system variable 'binlog_checksum', Internal MariaDB error code: 1193

主複製配置:

server-id=13
binlog-format = row
log-bin=mysql-bin
sync_binlog = 1

從屬複製配置:

server-id               = 1
log_bin                 = /var/log/mysql/mariadb-bin
log_bin_index           = /var/log/mysql/mariadb-bin.index
expire_logs_days        = 10
max_binlog_size         = 100M
relay_log               = /var/log/mysql/relay-bin
relay_log_index         = /var/log/mysql/relay-bin.index
relay_log_info_file     = /var/log/mysql/relay-bin.info
slave_sql_verify_checksum = 0
log_slave_updates
read_only
binlog_format=row

顯示主狀態;

File: mysql-bin.000049
Position: 4494988
Binlog_Do_DB: ''
Binlog_Ignore_DB: ''

顯示所有從屬狀態 \G

*************************** 1. row ***************************
              Connection_name: [redacted]13
              Slave_SQL_State: Slave has read all relay log; waiting for the slave I/O thread to update it
               Slave_IO_State: Waiting for master to send event
                  Master_Host: [redacted]
                  Master_User: replicant
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000049
          Read_Master_Log_Pos: 4494988
               Relay_Log_File: relay-bin-[redacted].000002
                Relay_Log_Pos: 2982721
        Relay_Master_Log_File: mysql-bin.000049
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
Exec_Master_Log_Pos: 4494988
              Relay_Log_Space: 2983028
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 13
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: No
                  Gtid_IO_Pos: 
      Replicate_Do_Domain_Ids: 
  Replicate_Ignore_Domain_Ids: 
Parallel_Mode: conservative
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
             Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
   Slave_Transactional_Groups: 0
         Retried_transactions: 0
           Max_relay_log_size: 104857600
         Executed_log_entries: 28995
    Slave_received_heartbeats: 57
       Slave_heartbeat_period: 30.000
               Gtid_Slave_Pos: 
1 row in set (0.000 sec)

啟動複製

在 master 上,我執行以下操作:

mysqldump -S /data/mysql/mysql.sock -u [redacted] -p --opt --skip-lock-tables --single-transaction --flush-logs --master-data=2 --databases [redacted] > replication.sql

然後我將 sql 複製到從伺服器,並將其通過管道傳輸到 Galera 節點。這使從站與轉儲點保持同步。

然後我在從伺服器上執行以下命令:

head -n100 replication.sql | grep "MASTER_LOG_POS"

獲取正確的起始文件和複製位置,然後在 SQL 中執行以下命令:

CHANGE MASTER '[redacted]' TO MASTER_HOST='[redacted]', MASTER_USER='replicant', MASTER_PASSWORD='[redacted]', MASTER_LOG_FILE='[file]', MASTER_LOG_POS=[position];

在過去的幾天裡,我已經查看了該網站和其他網站上的數十篇文章,但尚未找到解決方案。以下是一些證明勤奮的例子:

MySQL 複製不工作 - 沒有錯誤- 我關閉了所有過濾以確保這不是問題。

mysql 複製失敗(無錯誤) - 我們正在使用基於行的 bin-logging

MySQL 主從複製未更新- 這裡沒有真正的解決方案。我確認第一個答案列出的所有積極指標對我來說也是正確的。

MySQL 說複製很好,但沒有複製數據- 不使用過濾,伺服器 ID 不同等。

在 docker 容器中對不同版本的 MariaDB 和 MySQL 進行了大量實驗後,我確定 MariaDB 10.0 或更高版本會在遇到不可讀的行事件時靜默失敗並繼續執行。

在 docker 容器中使用 MariaDB 5.5 會mysqlbinlog發現以下複製錯誤:

ERROR: Error in Log_event::read_log_event(): 'Found invalid event in binary log', data_len: 42, event_type: 30
ERROR: Could not read entry at offset 938: Error in log format or read error.

此錯誤超出了所問問題的範圍。

引用自:https://serverfault.com/questions/962670