13

この問題を解決するための決定的な解決策または一連の手順をグーグルで徹底的に検索しましたが、高品質の結果はあまりないようで、スタックオーバーフローに関する質問は見つかりませんでした. 1 つのスレーブを使用して MySQL レプリケーションをセットアップしようとしています。スレーブは正常に複製されているように見えますが、次のエラーが発生します。

リレー ログ イベント エントリを解析できませんでした。考えられる理由は次のとおりです: マスターのバイナリ ログが破損している (これは、バイナリ ログで 'mysqlbinlog' を実行することで確認できます)、スレーブのリレー ログが破損している (これは、リレー ログで 'mysqlbinlog' を実行することで確認できます)、ネットワークの問題、またはマスターまたはスレーブの MySQL コードのバグ。マスターのバイナリ ログやスレーブのリレー ログを確認したい場合は、このスレーブで 'SHOW SLAVE STATUS' を発行することでそれらの名前を知ることができます。

検索で必然的にこの質問に出くわす多くの人々に利益をもたらすために、回答者が何がうまくいかないのか、この問題を解決するためにどのような手順を踏むべきかについての概要を提供してくれると助かりますが、私はそうします.また、誰かが私が解決するのを手伝ってくれることを期待して、私の特定の状況に関連する詳細を以下に提供してください.


開始するためにスレーブにインポートしたダンプは、マスターで次のコマンドを使用して作成されました。

mysqldump --opt --allow-keywords -q -uroot -ppassword dbname > E:\Backups\dbname.sql

このバックアップを実行するスクリプトは、マスターの現在のバイナリ ログの位置も記録します。次に、スレーブでレプリケーションを開始するために次の手順を実行しました。

1. STOP SLAVE;
2. DROP DATABASE dbname;
3. SOURCE dbname.sql;
    (... waited a few hours for the 10gb dump to import)
4. RESET SLAVE;
5. CHANGE MASTER TO MASTER_HOST='[masterhostname]', MASTER_USER='[slaveusername]', MASTER_PASSWORD='[slaveuserpassword]', MASTER_PORT=[port], MASTER_LOG_FILE='[masterlogfile]', MASTER_LOG_POS=[masterlogposition];
6. START SLAVE;

レプリケーションが正常に機能してから約 1 日後、午前 3 時 43 分に再び失敗しました。MySQL のエラー ログに最初に表示されたのは、上記のエラーでした。その後、同じタイムスタンプで別の一般的なエラーが表示されました。

Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log '[masterlogfile]' position [masterlogpos]

詳細なログ情報については、1 時間ごとに「SHOW SLAVE STATUS」と「SHOW FULL PROCESSLIST」を実行するバッチ スクリプトを設定しました。失敗の前後の結果は次のとおりです。

--Monitoring: 3:00:00.15 

Slave Status: 
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.xxx.xxx
                Master_User: slave_user
                Master_Port: xxxx
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000xxx
        Read_Master_Log_Pos: 316611912
             Relay_Log_File: dbname-relay-bin.00000x
              Relay_Log_Pos: 404287513
      Relay_Master_Log_File: mysql-bin.000xxx
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: dbname
        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: 316611912
            Relay_Log_Space: 404287513
            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

*************************** 1. row ***************************
     Id: 98
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 60547
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 99
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 5
  State: Has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL
*************************** 3. row ***************************
     Id: 119
   User: root
   Host: localhost:xxxx
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: SHOW FULL PROCESSLIST

--Monitoring: 4:00:02.71 

Slave Status: 
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.xxx.xxx
                Master_User: slave_user
                Master_Port: xxxx
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000xxx
        Read_Master_Log_Pos: 324365637
             Relay_Log_File: dbname-relay-bin.00000x
              Relay_Log_Pos: 410327741
      Relay_Master_Log_File: mysql-bin.000xxx
           Slave_IO_Running: Yes
          Slave_SQL_Running: No
            Replicate_Do_DB: dbname
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 0
                 Last_Error: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
               Skip_Counter: 0
        Exec_Master_Log_Pos: 322652140
            Relay_Log_Space: 412041238
            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: NULL

*************************** 1. row ***************************
     Id: 98
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 64149
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 122
   User: root
   Host: localhost:3029
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: SHOW FULL PROCESSLIST

私はエラーからの指示に従ってみました。スレーブのリレー ログで mysqlbinlog を実行し、数千前の start_position ステートメントと、数千個の障害ポイントの後の stop_position ステートメントを使用して、出力をテキスト ファイルにリダイレクトしました。コマンド ラインまたはログ ファイルに破損エラーは見られませんでした。これは、ログ ファイルが障害点付近で述べたことです。

...
# at 410327570
#120816 3:43:26 server id 1 log_pos 322651969    Intvar
SET INSERT_ID=3842697;
# at 410327598
#120816 3:43:26 server id 1 log_pos 322651997    Query    thread_id=762340    exec_time=0   error_code=0
SET TIMESTAMP=1345113806
insert into LOGTABLENAME (UpdateDate, Description) values (now(), "Invalid floating point operation");
# at 410327741
#120816 3:44:26 server id 1 log_pos 322754486    Intvar
SET INSERT_ID=3842701;
# at 410327769
#120816 3:43:26 server id 1 log_pos 322754514    Query    thread_id=762340    exec_time=0   error_code=0
SET TIMESTAMP=1345113866;
insert into LOGTABLENAME (UpdateDate, Description) values (now(), "Invalid floating point operation");
# at 410327912
...

その時点で無効な浮動小数点操作がログに記録されていることは興味深いですが、その位置でレプリケーションがどのように中断される可能性があるかはわかりません。上記の SHOW SLAVE STATUS で見つかったマスターのバイナリ ログで mysqlbinlog を実行しましたが、コマンド ラインにエラーは表示されませんでした (ただし、生成された 100 MB のログ ファイルを開く機会はありませんでした。本番サーバーを停止します)。

だから今、私は他に何を試すべきか途方に暮れています。私は基本的に、何がうまくいかないのか、次に取るべきステップについての提案についての洞察を探しているだけです. ありがとう!

4

1 に答える 1

28

根本的な原因が何であるかわかりません。ただし、この状況から回復するには、MySQLに次のポイント以降のすべてのrelay-bin-logsをクリアするように指示する必要があります。

  • Relay_Master_Log_File:mysql-bin.000xxx
  • Exec_Master_Log_Pos:322652140

次のようにします。

STOP SLAVE; CHANGE MASTER TO MASTER_LOG_FILE = 'mysql-bin.000xxx', MASTER_LOG_POS = 322652140; START SLAVE;

注:読者にとって、Relay_Master_Log_Fileと混同しないでください。Read_Master_Log_Posと同じではありません。また、Exec_Master_Log_PosとRead_Master_Log_Posを混同しないでください。Read_ *は、ローカルで実行されているレプリケーションの実際の実装に先立って、MySQLがマスターからレプリケーションビンログをダウンロードするために行う先読み戦略です。

于 2013-01-21T12:15:30.907 に答える