免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 27257 | 回复: 0

Mysql GTID 在主从复制中的一点研究 [复制链接]

论坛徽章:
0
发表于 2016-01-29 22:44 |显示全部楼层
1、GTID 是多节点间事务的唯一标记,是使用 UUID+事务ID ,是在 mysql5.6 里新出现的功能。如需启用需要参数配置:
gtid-mode=ON
enforce-gtid-consistency = ON
log-slave-updates = 1

2、mysql 复制使用gtid 时,在备机设置如下:
mysql> change master to
    -> master_host=host_ip,
    -> master_port=host_port,
    -> master_user=masterhost_user,
    -> master_password=masterhost_password,
    -> master_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> start slave ;
Query OK, 0 rows affected (0.04 sec)

备机 不需要指定主库的具体的 binlog file, binlog pos 位置,使用 master_AUTO_POSITION=1 就可以了。
使用 gtid 搭建备库时,必须主备库的  server_id , uuid 不一致。


mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.37.201
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql3306.000001
          Read_Master_Log_Pos: 893
               Relay_Log_File: mysql-relay-bin.000004
                Relay_Log_Pos: 1103
        Relay_Master_Log_File: mysql3306.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: test
          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: 893
              Relay_Log_Space: 1276
              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: 2
                  Master_UUID: 4a5c96c2-bd21-11e5-9ecf-000c295c61b1
             Master_Info_File: /u01/mysql/data/master.info
                    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
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: 4a5c96c2-bd21-11e5-9ecf-000c295c61b1:1-3
            Executed_Gtid_Set: 4a5c96c2-bd21-11e5-9ecf-000c295c61b1:1
                Auto_Position: 1
               
3、当使用 gtid 同步报错时,无法正常使用 sql_slave_skip_counter 参数来跳过,解决方法是:
主库:
mysql> select * from aaa;
+-----+------+-------+------+
| id  | name | score | age  |
+-----+------+-------+------+
|   1 | aa   |   100 | NULL |
|   2 | b    |    22 | NULL |
|  10 | e    |   200 | NULL |
|  22 | c    |    34 | NULL |
| 100 | eee  |   200 |  100 |
+-----+------+-------+------+
5 rows in set (0.00 sec)

mysql> update aaa set name='ffff' where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

备库:
mysql> select * from aaa;
+-----+------+-------+------+
| id  | name | score | age  |
+-----+------+-------+------+
|   2 | b    |    22 | NULL |
|  10 | e    |   200 | NULL |
|  22 | c    |    34 | NULL |
| 100 | eee  |   200 |  100 |
| 200 | aa   |   100 | NULL |
+-----+------+-------+------+
5 rows in set (0.00 sec)
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.37.201
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql3306.000001
          Read_Master_Log_Pos: 1421
               Relay_Log_File: mysql-relay-bin.000004
                Relay_Log_Pos: 1367
        Relay_Master_Log_File: mysql3306.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: test
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 1032
                   Last_Error: Could not execute Update_rows event on table test.aaa; Can't find record in 'aaa', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql3306.000001, end_log_pos 1390
                 Skip_Counter: 0
                 
处理方法:
(1)、设置参数sql_slave_skip_counter=1 处理问题

mysql> set global sql_slave_skip_counter=1;
ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction
mysql>  
可以看出 sql_slave_skip_counter 报错,无法解决。

(2)、设置参数slave_exec_mode='IDEMPOTENT' 处理问题

mysql> show variables like '%exec%';
+-----------------+--------+
| Variable_name   | Value  |
+-----------------+--------+
| gtid_executed   |        |
| slave_exec_mode | STRICT |
+-----------------+--------+
2 rows in set (0.00 sec)

mysql> set global slave_exec_mode='IDEMPOTENT';
Query OK, 0 rows affected (0.00 sec)

mysql> stop slave;      
mysql> start slave;      
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.37.201
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql3306.000001
          Read_Master_Log_Pos: 1421
               Relay_Log_File: mysql-relay-bin.000005
                Relay_Log_Pos: 448
        Relay_Master_Log_File: mysql3306.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: test

可以看到可以正确解决问题。                     

(3)、设置 gtid_next 处理问题

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> set gtid_next='4a5c96c2-bd21-11e5-9ecf-000c295c61b1:6';
Query OK, 0 rows affected (0.00 sec)

mysql> begin;commit;
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> set gtid_next="AUTOMATIC";
Query OK, 0 rows affected (0.00 sec)

mysql> start slave ;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.37.201
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql3306.000001
          Read_Master_Log_Pos: 1672
               Relay_Log_File: mysql-relay-bin.000007
                Relay_Log_Pos: 448
        Relay_Master_Log_File: mysql3306.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: test
              
也可以问题解决!              

4、复制由 GTID 转成普通模式时,只需要执行:
mysql> change master to
        -> MASTER_AUTO_POSITION=0;
  然后使用正常的方法设置同步即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP