Mysql GTID

8065 ワード

GTIDは何ですか?
GTID全称A global transaction identifierグローバル事物idは、MASTERが作成した事物に一致するID番号である.
  • それは本機で唯一であるだけでなく、他のサーバでも唯一である.
  • gitd物事と一つ一つ対応
  • master commit物事のたびにgtid
  • が自動的に作成されます.
    gitd形式はGTID=source_id:transaction_id(例えば04038 bcc-fd 0 c-11 e 7-9 cc 5-000 c 29 db 6599:1-2)
         source_idは一般的に発起人のuuidでautoに保存されています.cnfファイル;
         transaction_idは物事idであり、1-2は2番目の物事を表す.第1-nはn個の事物を表す
     
    なぜGTIDを使うのですか?
    主従レプリケーション、特に半同期レプリケーションでは、MasterのdumpプロセスがbinlogをSlaveに送信しながら、SlaveのACKメッセージを待つため、このプロセスはシリアルであり、前の物事のACKがメッセージを受信していないため、後の物事はキューに並んで待つしかない.これにより、パフォーマンスに大きな影響を及ぼします.GTIDがあれば、SLAVEは直接データストリームを通じてGTID情報を得ることができ、同期することができる.
    また、主にフェイルオーバーから、MASTER downが1台あれば、最新ログを持つSLAVEを抽出してMASTERを行う必要があります.これは良い判断ですが、GTIDがあれば、GTIDを基準にすれば簡単に判断できます.GTIDがあれば、SLAVEはbin-logのファイル名とPositionをずっと保存する必要はありません.MASTER_AUTO_POSITIONを有効にすればよい
    MASTER crashの場合、GTIDはデータの一致性を保証するのに役立ちます.すべてのものが唯一のGTIDに対応しているため、回復時に何かが繰り返し提出されると、SLAVEは直接無視されます.
    GTIDはいつ使いますか?
    一般的に主従複製のシーンでは、1台だけで使用する必要はありません.
    GTID不支持:CREATE TABLE...SELECT文は、一つの物事にGTIDがあるので、この文には2つの物事があり、一つのCREATE、一つのINSERTがあるので、サポートされていません
    CRETAE TEMPORARY TABLE、またはDROP TEMPORARY TABLEはサポートされていません
    物事と非物事を混合して使用する.サポートされていません
    GTIDの設定方法
    すべてのプライマリスレーブノードはset global enforceを実行します.gtid_consistency=WARN;,mysql 5.7.6以前はONとOFFのみで、その後WARN、すなわちGTID制限を実行できる文があったが、warningsが生成され、warningsがあればこれらのサポートされていない文を処理しなければならない.データが一致しないという問題が発生しやすい.警告がないことを確認してから、実行を続行します.
    mysql> set global enforce_gtid_consistency=WARN;
    Query OK, 0 rows affected (0.00 sec)
    mysql> set global enforce_gtid_consistency=on;
    Query OK, 0 rows affected (0.00 sec)

    すべてのノード、gtidモード、gtid_をオンにします.modeには4つのモードがあります.
  • OFF GTIDを生成せず、SlaveはGTIDを持たないトランザクション
  • のみを受け入れる
  • OFF_PERMISSIVEはGTIDを生成せず、SlaveはGTIDを持たないトランザクションもGTID付きトランザクションも受け入れる
  • ON_PERMISSIVEはGTIDを生成し、SlaveはGTIDを持たないトランザクションもGTIDを持つトランザクションも
  • を受け入れる.
  • ONはGTIDを生成し、SlaveはGTID付きトランザクション
  • のみを受け入れる.
    モード間の切り替えは段階的にしか切り替えられません.そうしないと、エラーが発生します.
    ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF OFF_PERMISSIVE ON_PERMISSIVE ON. Also note that this value must be stepped up or down simultaneouslyon all servers. See the Manual for instructions.
    mysql>  set global gtid_mode=OFF_PERMISSIVE;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> set global gtid_mode=ON_PERMISSIVE;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> set global gtid_mode=ON;
    Query OK, 0 rows affected (0.02 sec)

    設定の表示
    mysql> show global variables like '%gtid%';
    +----------------------------------+-------------------------------------------+
    | Variable_name                    | Value                                     |
    +----------------------------------+-------------------------------------------+
    | binlog_gtid_simple_recovery      | ON                                        |
    | enforce_gtid_consistency         | ON                                        |
    | gtid_executed                    | 04038bcc-fd0c-11e7-9cc5-000c29db6599:1-16 |
    | gtid_executed_compression_period | 1000                                      |
    | gtid_mode                        | ON                                        |
    | gtid_owned                       |                                           |
    | gtid_purged                      |                                           |
    | session_track_gtids              | OFF                                       |
    +----------------------------------+-------------------------------------------+

    SLAVEの再構成:(すべてのSLAVEでこの行)
    mysql> stop slave;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> change master to master_auto_position=1;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql>

    構成完了
    現在のGTIDの表示方法
    1,Slaveでshow slave statusを実行する
    mysql>  show slave status \G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 10.8.135.149
                      Master_User: repl
                      Master_Port: 3358
                    Connect_Retry: 10
                  Master_Log_File: mysql-bin.000036
              Read_Master_Log_Pos: 194
                   Relay_Log_File: localhost-relay-bin.000017
                    Relay_Log_Pos: 407
            Relay_Master_Log_File: mysql-bin.000036
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                           ..........
               Master_SSL_Crlpath:
               Retrieved_Gtid_Set: 04038bcc-fd0c-11e7-9cc5-000c29db6599:1-16
                Executed_Gtid_Set: 04038bcc-fd0c-11e7-9cc5-000c29db6599:1-16
                    Auto_Position: 1
             Replicate_Rewrite_DB:

    2,masterで実行:show master status;
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------------------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
    +------------------+----------+--------------+------------------+-------------------------------------------+
    | mysql-bin.000036 |      584 |              |                  | 04038bcc-fd0c-11e7-9cc5-000c29db6599:1-17 |
    +------------------+----------+--------------+------------------+-------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql>

            3, show binlog events
    mysql> show binlog events in 'mysql-bin.000036';
    +------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
    | Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                                               |
    +------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
    | mysql-bin.000036 |   4 | Format_desc    |    135149 |         123 | Server ver: 5.7.19-log, Binlog ver: 4                              |
    | mysql-bin.000036 | 123 | Previous_gtids |    135149 |         194 | 04038bcc-fd0c-11e7-9cc5-000c29db6599:1-16                          |
    | mysql-bin.000036 | 194 | Gtid           |    135149 |         259 | SET @@SESSION.GTID_NEXT= '04038bcc-fd0c-11e7-9cc5-000c29db6599:17' |
    | mysql-bin.000036 | 259 | Query          |    135149 |         332 | BEGIN                                                              |
    | mysql-bin.000036 | 332 | Table_map      |    135149 |         380 | table_id: 108 (apple.a)                                            |
    | mysql-bin.000036 | 380 | Write_rows     |    135149 |         553 | table_id: 108 flags: STMT_END_F                                    |
    | mysql-bin.000036 | 553 | Xid            |    135149 |         584 | COMMIT /* xid=61 */                                                |
    +------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+

    4 binlogを表示
    #180123 19:24:10 server id 135149  end_log_pos 194 CRC32 0x37c62cd3     Previous-GTIDs
    # 04038bcc-fd0c-11e7-9cc5-000c29db6599:1-16
    # at 194
    #180123 19:32:09 server id 135149  end_log_pos 259 CRC32 0x929f90c1     GTID [commit=no]
    SET @@SESSION.GTID_NEXT= '04038bcc-fd0c-11e7-9cc5-000c29db6599:17'/*!*/;
    # at 259
    #180123 19:32:09 server id 135149  end_log_pos 332 CRC32 0xf9df8eb9     Query   thread_id=6     exec_time=0     error_code=0

    GTIDプロファイル:
    [mysqld]
    binlog-format = ROW
    log-bin = /export/data/mysql/mysql-bin
    sync_master_info=1
    gtid_mode=on
    enforce_gtid_consistency=on
    report_port=3358
    report_host=172.28.112.112
    master_info_repository=table
    relay_log_info_repository=table
    binlog_checksum=CRC32
    slave_sql_verify_checksum=1
    binlog_rows_query_log_events=1