以下のエディターは、MySQL5.7 ノンストップ ビジネスで従来のレプリケーションを GTID レプリケーションに変更する例を示します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして見てみましょう
GTID の利点により、従来のファイル pos ベースのレプリケーションを GTID ベースのレプリケーションに変更する必要があるため、具体的にはどのように変更するかが私たちにとって懸念事項となっています。方法は次のとおりです:
現在、従来のレプリケーションでは M-S 構造があります:
ポート 3301 マスター
ポート 3302 スレーブ
master上(3301): [zejin] 3301>select * from t_users; +----+------+ | id | name | +----+------+ | 1 | hao | | 2 | zhou | +----+------+ rows in set (0.00 sec) slave上(3302): [zejin] 3302>show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.240 Master_User: repl Master_Port: 3301 Connect_Retry: 60 Master_Log_File: binlog57.000002 Read_Master_Log_Pos: 417 Relay_Log_File: zejin240-relay-bin.000004 Relay_Log_Pos: 628 Relay_Master_Log_File: binlog57.000002 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: 417 Relay_Log_Space: 884 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: 3301 Master_UUID: a97983fc-5a29-11e6-9d28-000c29d4dc3f Master_Info_File: /home/mysql/I3302/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: row in set (0.00 sec) [zejin] 3302>select * from t_users; +----+------+ | id | name | +----+------+ | 1 | hao | | 2 | zhou | +----+------+ rows in set (0.00 sec)
オンライン変更の具体的な手順は次のとおりです。
前提条件:
1. すべての mysql バージョン 5.7.6 以降が必要です。
2. 現在のトポロジ内のすべての mysql の gtid_mode の値がオフです。
3. 以下の操作手順はすべて順番に行われます。先へ進まないでください。
グローバルシステム変数GTID_MODE変数値の説明を追加します:
OFF 新しいトランザクションは非GTIDであり、スレーブはGTIDのないトランザクションのみを受け入れ、GTIDを使用して送信されたトランザクションはエラーを報告します
OFF_PERMISSIVE 新しいトランザクションGTID ではない、スレーブは GTID のないトランザクションと GTID のあるトランザクションの両方を受け入れます
ON_PERMISSIVE 新しいトランザクションは GTID、スレーブは GTID のないトランザクションと GTID のあるトランザクションの両方を受け入れます
ON 新しいトランザクションは GTID、スレーブは GTID のあるトランザクションのみ受け入れますトランザクション
では、これらの値の変更が順番に行われることに注意してください。つまり、
off<--->OFF_PERMISSIVE<--->ON_PERMISSIVE<--->ON
実行にジャンプできません。エラーが報告されます。
ステップ 1: 各 mysql インスタンスで、ENFORCE_GTID_CONSISTENCY を警告に設定します。どちらが最初に実行されても結果には影響しません。
[zejin] 3302>set @@global.enforce_gtid_consistency=warn; Query OK, 0 rows affected (0.00 sec) [zejin] 3301>set @@global.enforce_gtid_consistency=warn; Query OK, 0 rows affected (0.00 sec)
注: このステートメントの実行後、GTID に互換性のないステートメントの使用が発生した場合、関連情報がエラー ログに記録されます。その後、互換性のないステートメントが生成されなくなるまで、互換性のない書き込みを回避するようにプログラムを調整する必要があります at all. ステートメント、このプログラムを使用してすべての SQL をトラブルシューティングすることも、それを設定して一定期間エラー ログを観察することもできます このステップは非常に重要です。
ステップ 2: 各 mysql インスタンスで、ENFORCE_GTID_CONSISTENCY を ON に設定します。どちらが最初に実行されるかは結果に影響しません。
最初のステップが完了したら、値を on に設定できます。
[zejin] 3301>set @@global.enforce_gtid_consistency=on; Query OK, 0 rows affected (0.03 sec) [zejin] 3302>set @@global.enforce_gtid_consistency=on; Query OK, 0 rows affected (0.00 sec)
step3:各 mysql インスタンスで GTID_MODE を off_permissiv に設定します。どちらが最初に実行されるかは結果に影響しません
[zejin] 3301>SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE; Query OK, 0 rows affected (0.00 sec) [zejin] 3302>SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE; Query OK, 0 rows affected (0.00 sec)
step4:各 mysql インスタンスで GTID_MODE を on_permissiv に設定します。結果には影響しません
[zejin] 3302>SET @@GLOBAL.GTID_MODE = on_permissive; Query OK, 0 rows affected (0.00 sec) [zejin] 3301>SET @@GLOBAL.GTID_MODE = on_permissive; Query OK, 0 rows affected (0.01 sec)
step5:各mysqlインスタンスの変数ONGOING_ANONYMOUS_TRANSを確認してくださいACTION_COUNT
[zejin] 3301>SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT'; +-------------------------------------+-------+ | Variable_name | Value | +-------------------------------------+-------+ | Ongoing_anonymous_transaction_count | 0 | +-------------------------------------+-------+ row in set (0.02 sec) [zejin] 3302>SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT'; +-------------------------------------+-------+ | Variable_name | Value | +-------------------------------------+-------+ | Ongoing_anonymous_transaction_count | 0 | +-------------------------------------+-------+ row in set (0.02 sec)
この変数が0になるまで待つ必要があります
step6:すべての匿名トランザクション(非GTIDトランザクション)が確認されていることを確認してください) すべてのサーバーに完全にレプリケートされました。
チェック方法:
在master上: [zejin] 3301>show master status; +-----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------+----------+--------------+------------------+-------------------+ | binlog57.000005 | 154 | | | | +-----------------+----------+--------------+------------------+-------------------+ row in set (0.00 sec) 在slave上, [zejin] 3302>show slave status\G *************************** 1. row *************************** …… Relay_Master_Log_File: binlog57.000005 Exec_Master_Log_Pos: 154 ……
これら 2 つの Relay_Master_Log_File の値が binlog57.000005 より大きいこと、
Relay_Master_Log_File が binlog57.000005 と等しいこと、および Exec_Master_Log_Pos の値が 154 以上であることを確認します
またはスレーブは 関数を直接使用できます :
[zejin] 3302>SELECT MASTER_POS_WAIT('binlog57.000005', 154); +-----------------------------------------+ | MASTER_POS_WAIT('binlog57.000005', 154) | +-----------------------------------------+ | 0 | +-----------------------------------------+ row in set (0.00 sec)
戻り結果が 0 以上の場合、すべての匿名トランザクションがコピーされたことを意味します
step7: に匿名トランザクションがないことを確認します。たとえば、以前に生成されたすべての匿名トランザクションはバイナリ ログ内でも実行されており、flush ログを渡して、mysql に古いバイナリ ログ ファイルを自動的にクリーンアップさせることができます。
ステップ8: 各mysqlインスタンスで、GTID_MODEをonに設定します。
[zejin] 3301>SET @@GLOBAL.GTID_MODE = ON; Query OK, 0 rows affected (0.04 sec) [zejin] 3302>SET @@GLOBAL.GTID_MODE = ON; Query OK, 0 rows affected (0.04 sec)
ステップ9: 各mysqlインスタンスの設定ファイルmy.cnfに、gtid-mode=ONを追加します
検証:
[zejin] 3301>insert into t_users values(3,'chen'); Query OK, 1 row affected (0.02 sec) [zejin] 3301>update t_users set name='li' where id=1; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 [zejin] 3301>select * from t_users; +----+------+ | id | name | +----+------+ | 1 | li | | 2 | zhou | | 3 | chen | +----+------+ rows in set (0.00 sec) [zejin] 3302>show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.240 Master_User: repl Master_Port: 3301 Connect_Retry: 60 Master_Log_File: binlog57.000006 Read_Master_Log_Pos: 462 Relay_Log_File: zejin240-relay-bin.000012 Relay_Log_Pos: 673 Relay_Master_Log_File: binlog57.000006 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: 462 Relay_Log_Space: 969 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: 3301 Master_UUID: a97983fc-5a29-11e6-9d28-000c29d4dc3f Master_Info_File: /home/mysql/I3302/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: a97983fc-5a29-11e6-9d28-000c29d4dc3f:1-2 Executed_Gtid_Set: a97983fc-5a29-11e6-9d28-000c29d4dc3f:1-2 Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: row in set (0.00 sec)
これで、従来のレプリケーションから GTID レプリケーションへのオンライン変換が完了します。
以上がMySQL 5.7ノンストップビジネスで従来のレプリケーションをGTIDレプリケーションに変更するサンプルコードの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。