mysql5.7 gtid复制安装及排错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql5.7 gtid复制安装及排错相关的知识,希望对你有一定的参考价值。

$$$$$$$$$$$$$$$$$$$$$$$$$环境说明$$$$$$$$$$$$$$$$$$$$$$$$$

主:192.168.31.71

从:192.168.31.72

操作系统:centos 6.6

mysql:5.7.10

mysql_base /usr/local/mysql

配置文件见附件,主从的区别是server_id不同,切记保证主从server_id不同

&&&&&&&&&&&&&&&&&&&&&&&&&主从操作$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

主:

  • 初始化

[[email protected] data]# /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3306/etc/my.cnf --initialize --user=mysql

  • 生成ssl文件,5.7采用openssl安全加密,可以不用这一步

[[email protected] data]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --defaults-file=/data/mysql/mysql_3306/etc/my.cnf

  • 更改权限

[[email protected] data]# chown -R mysql:mysql /data/mysql/mysql_3306/data/*

  • 启动mysql

[[email protected] data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/mysql_3306/etc/my.cnf &

  • 获取root临时密码,5.7一大改进,之前版本root默认没有密码

[[email protected] data]# cat /data/mysql/mysql_3306/data/error.log |grep temporary

2016-01-25T11:18:48.302304+08:00 1 [Note] A temporary password is generated for [email protected]: Wl3jdkL_9_7c  

2016-01-25T11:24:12.307468+08:00 0 [Note] InnoDB: Creating shared tablespace for temporary tables

  • 更改root临时密码

    mysql> mysql -S /tmp/mysql.sock -uroot -p

    alter user ‘root‘@‘localhost‘ identified by ‘password‘;

  • 创建复制账号

    mysql> grant replication slave,replication client on *.* to ‘repl‘@‘%‘ identified by ‘slavepass‘;


从:

  • 初始化

[[email protected] data]# /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3306/etc/my.cnf --initialize --user=mysql

  • 生成ssl文件,5.7采用openssl安全加密,可以不用这一步

[[email protected] data]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --defaults-file=/data/mysql/mysql_3306/etc/my.cnf

  • 更改权限

[[email protected] data]# chown -R mysql:mysql /data/mysql/mysql_3306/data/*

  • 启动mysql

[[email protected] data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/mysql_3306/etc/my.cnf &

  • 获取root临时密码,5.7一大改进,之前版本root默认没有密码

[[email protected] data]# cat /data/mysql/mysql_3306/data/error.log |grep temporary

2016-01-25T11:18:48.302304+08:00 1 [Note] A temporary password is generated for [email protected]Wl3jdkL_9_7c  

2016-01-25T11:24:12.307468+08:00 0 [Note] InnoDB: Creating shared tablespace for temporary tables

  • 更改root临时密码

    mysql> mysql -S /tmp/mysql.sock -uroot -p

    alter user ‘root‘@‘localhost‘ identified by ‘password‘;

  • 创建复制关系

    change master to master_host=‘192.168.31.71‘,master_port=3306,master_user=‘repl‘,master_password=‘slavepass‘,master_auto_position=1;

  • 启动slave

  • 查看复制状态,注意此时Slave_SQL_Running: No,从库没能正常运行

mysql> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.31.71

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000002

          Read_Master_Log_Pos: 741

               Relay_Log_File: relay.000002

                Relay_Log_Pos: 27063

        Relay_Master_Log_File: mysql-bin.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: No

              Replicate_Do_DB: 

          Replicate_Ignore_DB: 

           Replicate_Do_Table: 

       Replicate_Ignore_Table: 

      Replicate_Wild_Do_Table: 

  Replicate_Wild_Ignore_Table: 

                   Last_Errno: 1062

                   Last_Error: Could not execute Write_rows event on table mysql.server_cost; Duplicate entry ‘row_evaluate_cost‘ for key ‘PRIMARY‘, Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event‘s master log mysql-bin.000001, end_log_pos 27118

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 26850

              Relay_Log_Space: 100809

              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

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error: 

               Last_SQL_Errno: 1062

               Last_SQL_Error: Could not execute Write_rows event on table mysql.server_cost; Duplicate entry ‘row_evaluate_cost‘ for key ‘PRIMARY‘, Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event‘s master log mysql-bin.000001, end_log_pos 27118

  Replicate_Ignore_Server_Ids: 

             Master_Server_Id: 713306

                  Master_UUID: 0fbdce0d-c495-11e5-9748-0800279bd495

             Master_Info_File: mysql.slave_master_info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: 

           Master_Retry_Count: 86400

                  Master_Bind: 

      Last_IO_Error_Timestamp: 

     Last_SQL_Error_Timestamp: 160127 09:29:07

               Master_SSL_Crl: 

           Master_SSL_Crlpath: 

           Retrieved_Gtid_Set: 0fbdce0d-c495-11e5-9748-0800279bd495:1-135

            Executed_Gtid_Set: 0ee5a5bd-c495-11e5-82f1-0800279bd495:1-134,

0fbdce0d-c495-11e5-9748-0800279bd495:2-30

                Auto_Position: 1

         Replicate_Rewrite_DB: 

                 Channel_Name: 

1 row in set (0.00 sec)

  • 错误原因分析

    错误为1062,主键冲突错误,主要原因是在初始化时,mysql的元数据库会进行表的创建及插入,主从都会执行,做这些动作时,所有的事务都会相应的分配gtid号,因此当启动从时会将主上的事件回放一遍,当回放到事务号为31时,从库报主键错误,那么为何不是从1开始报错呢?是因为配置文件中启用了slave_skip_errors = ddl_exist_errors,在30号之前的事务id都是建表语句,之后为insert插入语句。

  • 错误解决方式一

    从库执行

    mysql> stop slave;

    mysql> reset master;

    mysql> set gtid_purged="0ee5a5bd-c495-11e5-82f1-0800279bd495:1-134,0fbdce0d-c495-11e5-9748-0800279bd495:1-134"

    mysql> start slave;

    原理:跳过重复的gtid事务

  • 错误解决方式二

    主从初始化时指定gtid-mode=off:

    /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3306/etc/my.cnf --initialize --user=mysql --gtid-mode=off

    此时采用mysqlbinlog去查看binlog日志可发现默认的gtid是ANONYMOUS:

    [[email protected] logs]# mysqlbinlog -v --base64-output=decode-row ./mysql-bin.000001

    #160127 10:41:49 server id 713306  end_log_pos 99259 CRC32 0xf89f3faf Anonymous_GTIDlast_committed=132sequence_number=133

    SET @@SESSION.GTID_NEXT= ‘ANONYMOUS‘/*!*/;

    # at 99259

    接下来的操作和上面主从操作一致。

    原理:在初始化时mysql元数据的操作不记录gtid,启动后所有的操作记录gtid,且gtid事务号从1开始,从而避免1062错误。


[[email protected] logs]# mysqlbinlog -v --base64-output=decode-row ./mysql-bin.000002 

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;

/*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#160127 10:49:41 server id 713306  end_log_pos 123 CRC32 0x35ee3e2d Start: binlog v 4, server v 5.7.9-log created 160127 10:49:41 at startup

# Warning: this binlog is either in use or was not closed properly.

ROLLBACK/*!*/;

# at 123

#160127 10:49:41 server id 713306  end_log_pos 154 CRC32 0x21d84665 Previous-GTIDs

# [empty]

# at 154

#160127 10:50:38 server id 713306  end_log_pos 219 CRC32 0x2a912c89 GTIDlast_committed=0sequence_number=1

SET @@SESSION.GTID_NEXT= ‘7f2c189e-c49f-11e5-b3f9-0800279bd495:1‘/*!*/;

# at 219

#160127 10:50:38 server id 713306  end_log_pos 398 CRC32 0x9bf46a0f Querythread_id=2exec_time=0error_code=0

SET TIMESTAMP=1453863038/*!*/;

SET @@session.pseudo_thread_id=2/*!*/;

SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;

SET @@session.sql_mode=1436549120/*!*/;

SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;

/*!\C utf8 *//*!*/;

SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=45/*!*/;

SET @@session.lc_time_names=0/*!*/;

SET @@session.collation_database=DEFAULT/*!*/;

ALTER USER ‘root‘@‘localhost‘ IDENTIFIED WITH ‘mysql_native_password‘ AS ‘*CCDDC44F45A76B3B3C5E46A5B0D17E88ABC2B4BA‘

/*!*/;

# at 398

#160127 10:51:13 server id 713306  end_log_pos 463 CRC32 0xaf535af9 GTIDlast_committed=1sequence_number=2

SET @@SESSION.GTID_NEXT= ‘7f2c189e-c49f-11e5-b3f9-0800279bd495:2‘/*!*/;

# at 463

#160127 10:51:13 server id 713306  end_log_pos 701 CRC32 0x60a0eced Querythread_id=2exec_time=0error_code=0

SET TIMESTAMP=1453863073/*!*/;

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘repl‘@‘%‘ IDENTIFIED WITH ‘mysql_native_password‘ AS ‘*809534247D21AC735802078139D8A854F45C31F3‘

/*!*/;

SET @@SESSION.GTID_NEXT= ‘AUTOMATIC‘ /* added by mysqlbinlog */ /*!*/;

DELIMITER ;

# End of log file

/*!50003 SET [email protected]_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

以上是关于mysql5.7 gtid复制安装及排错的主要内容,如果未能解决你的问题,请参考以下文章

MySQL5.7.21开启Gtid配置主从复制

mysql5.7使用gtid模式搭建主从复制架构

MySQL5.7.24 开启Gtid+MGR组复制

MySQL5.7 传统复制到GTID复制

Mysql5.7基于GTID的半同步复制

mysql5.7 基于gtid的主从复制