5.6のgtidベースのレプリケーションを設定しました(5.6.26で)、それを実行したときに機能しているようで、通常のデータの横に作成したランダムテストデータベースをレプリケートしました。しかし、ある時点で何かが起こったに違いありません。
mysql>スレーブステータスの表示\ G *************************** 1.行*** ************************ Slave_IO_State:System lock Master_Host:xxxxxxxxxxxxxxxxxx Master_User:xxxxxxxxxxxxxxxx Master_Port:3306 Connect_Retry:60 Master_Log_File:mysqld-bin.000141 Read_Master_Log_Pos:169293671 Relay_Log_File:mysqld-relay-bin.000003 Relay_Log_Pos:16861206 Relay_Master_Log_File:mysqld-bin.000141 Slave_IO_Running:Yes Slave_SQL_Running:Yes Replicate_Do_DB: Replicate_Ignore_ .____。] Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno:0 La st_Error: Skip_Counter:0 Exec_Master_Log_Pos:16860994 Relay_Log_Space:169298584 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 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:1 Master_UUID:7846a847-62c7-11e5-91a6-e06995de432e Master_Info_File:mysql.slave_master_info SQL_Delay:0 SQL_Remaining_Delay:NULL Slave_SQL_Running_State:System lock Master_Retry_Count:86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl :: Master_SSL_Crl ____。] Master_SSL_Crlpath: Retrieved_Gtid_Set:7846a847-62c7-11e5-91a6-e06995de432e:4757140-5030085 [.____。自動位置:1
現在、元々「Slave_SQL_Running_State」は「リレーログからのイベントの読み取り」などと言っていましたが、システムロックにも変更されました(IO状態は常にそうだと言っていました)。
Seconds_Behind_Master
は着実に増加しており、リレーログのサイズはファイルシステム上で急速に増大しますが、Executed_gtid_set
は変化しているように見えますが、それでもかなり遅れているため、まだ問題が発生しているようです。
これがプロセスリストです:
mysql> show processlist; + ------ + ------------- + ----------- +- ----- + --------- + ------- + -------------------------- ------------- + ------------------ + | Id |ユーザー|ホスト| db |コマンド|時間|州|情報| + ------ + ------------- + ----------- + ------ +- ------- + ------- + ---------------------------------- ----- + ------------------ + | 1877 |ルート| localhost | NULL |睡眠| 6076 | | NULL | | 1878年ルート| localhost | NULL |クエリ| 0 | init |プロセスリストを表示| | 1886年システムユーザー| | NULL |接続| 783 |システムロック| NULL | | 1887年システムユーザー| | NULL |接続| 0 |システムロック| NULL | | 1888年システムユーザー| | NULL |接続| 783 |コーディネーターからのイベントを待機しています| NULL | | 1889 |システムユーザー| | NULL |接続| 55455 |システムロック| NULL | + ------ + ------------- + ----------- + ------ +- ------- + ------- + ---------------------------------- ----- + ------------------ +
スレーブを停止して再起動しようとしましたが、役に立ちませんでした。
誰かが私がこれを再び機能させるために試すことができるアイデアを持っていますか?いただければ幸いです。
ありがとう
プロセスリストに2を超えるsystem user
エントリが表示されるため、マルチスレッドレプリケーションを使用していると想定します( slave_parallel_workers > 1)。
それはバグのようです
2014年10月29日、これはDavid Moss
で表現されました
ご意見ありがとうございます。この問題はバグ17326020でカバーされ、以下がMySQL 5.6.21および5.7.5の変更ログに追加されました。
トランザクションの途中でI/OスレッドがGTIDとマルチスレッドスレーブを使用してマスターに再接続すると、トランザクションの中止に失敗し、部分的なトランザクションがリレーログに残ってから、同じトランザクションを再度取得していました。これは、リレーログのローテーションを実行したときに発生しました。この場合、サーバーは再接続時にログをローテーションする前にチェックし、進行中のトランザクションが完了するまでまず待機します。
したがって、このバグをカバーする新しいものは何も追加されず、修正済みとしてクローズします。
2014年12月10日、これはLaurynas Biveinis
で表現されました
問題:
MTS、GTID、自動ポジショニングを有効にすると、ワーカーがIOスレッドの再接続によってrelaylogに残された部分的なトランザクションを適用すると、XIDログイベントがトランザクションをコミットするのを待ちます。
残念ながら、SQLスレッドコーディネーターは、次のリレーログファイルでマスターのROTATEイベントに到達し、すべてのワーカーがタスクを完了するのを待ってからROTATEを適用します。
分析:
トランザクション全体が再接続後にIOスレッドによって再度取得されるため、スレーブは、マスターからこのROTATEに気付いたら、部分的なトランザクションをロールバックする必要があります。
このバグは、BUG#17326020で修正済みの同じ問題を報告しており、報告された問題は再現できなくなりました。したがって、このパッチは新しいテストケースを追加するだけです。
マスターでFLUSH BINARY LOGS;
を実行します
移動がSQLスレッドからの応答をトリガーするかどうかを確認します。
そうでない場合は、先に進んでmy.cnf
から slave_parallel_workers を削除し、mysqlを再起動します。
MySQLを起動してマスターとスレーブを開始し、error 1236
を取得したので、これは不可能な位置からレプリケーションを確立しようとしていることを意味します。 GTIDと取得したエラーメッセージのコンテキストでは、GTIDセット内のクエリのセットを完全に識別するために必要なバイナリログは存在しません。
SHOW SLAVE STATUS\G
を振り返ってください
Retrieved_Gtid_Set: 7846a847-62c7-11e5-91a6-e06995de432e:4757140-5030085
Executed_Gtid_Set: 7846a847-62c7-11e5-91a6-e06995de432e:1-4783274
これにより、最後に実行されたGTIDは7846a847-62c7-11e5-91a6-e06995de432e:4783274
です
これは、7846a847-62c7-11e5-91a6-e06995de432e:4783275
が含まれていた、または含まれていたバイナリログが存在しないことを意味します。
スレーブでレプリケーションを停止し、マスターが(expire_logs_daysを介して)バイナリログをローテーションするのに十分な時間レプリケーションをオフにしたままにすると、スレーブがまだ確認する必要があり、その後レプリケーションをオンにした場合に、この状況が発生します。
特定のケースでは、バイナリログmysqld-bin.000141
のmysqlbinlogダンプを実行してみてください。それから何も出てこない場合は、スレーブをリロードし、レプリケーションを最初からセットアップする必要があります。