暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL传统点位复制在线转为GTID模式复制

数据库干货铺 2019-11-13
634

 1.  GTID优缺点

    MySQL传统点位复制在5.7版本前是主要的主从复制模式,而随着MySQL5.6版本引入GTID,并且MySQL5.7进行各方面的优化以后,在mySQL5.7(尤其是MySQL5.7.6)版本后GTID模式的主从复制方式成为一个新的选择方式。要使用GTID模式,首先也需知其优缺点,其主要的优缺点如下:

1.1  优点

a) 更简单的实现failover,无需找log_file和log_Pos。
b) 更简单的搭建主从复制。
c) 复制集群有一个统一的方式识别复制位置,给集群管理带来了便利。
d) 正常情况下,GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过

1.2 限制

a)  在一个事务里面混合使用引擎如Innodb(支持事务)、MyISAM(不支持事务), 造成多个GTIDs和同一个事务相关联出错
b)  CREATE TABLE…..SELECT 不能使用,该语句产生的两个event在某一情况 会使用同一个GTID(同一个GTID在slave只能被使用一次),使用时会报如下错误:

    错误代码:1786
    Statement violates GTID consistency: CREATE TABLE ... SELECT...

         需改为 create table like  tb; insert into tb ... select  方式处理
    c)  CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE 不能在事务内使用 (启用了--enforce-gtid-consistency参数)

    2.  传统点位复制在线转为GTID模式复制

    2.1  在线调整的条件

    a)   要求MySQL 5.7.6及以后版本。

    b) 所有组中节点的gtid_mode 为off状态。

    2.2  在线调整

    2.2.1  查看当前状态

      /** 传统复制下enforce_gtid_consistency  gtid_mode 均为OFF **/
      mysql> show global variables like 'enforce_gtid_consistency';
      +--------------------------+-------+
      | Variable_name | Value |
      +--------------------------+-------+
      | enforce_gtid_consistency | OFF |
      +--------------------------+-------+
      1 row in set (0.00 sec)


      mysql> show global variables like 'gtid_mode';
      +---------------+-------+
      | Variable_name | Value |
      +---------------+-------+
      | gtid_mode | OFF |
      +---------------+-------+
      1 row in set (0.00 sec)

      2.2.2  修改enforce_gtid_consistency

      所有节点均先将其修改为 WARN,同时注意查看日志是否出现警告信息,生产环境想调整为GTID模式时,需提前一段时间调整此参数,观察一段时间,确定无警告后再调整。

        /**  所有节点均调整,主从无先后顺序 **/
        mysql> set global enforce_gtid_consistency =warn;
        Query OK, 0 rows affected (0.00 sec)

        开启后观察数据库日志,只有在无警告的情况下才可以进行后续的操作。

          2019-10-13T06:00:19.723310Z 10588 [Note] Changed ENFORCE_GTID_CONSISTENCY from OFF to WARN.

           2.2.3     修改enforce_gtid_consistency = on

          将各节点enforce_gtid_consistency 设置为 on,不分顺序,但需要全部执行完毕后再进行下一步

            mysql> set global enforce_gtid_consistency = on;
            Query OK, 0 rows affected (0.00 sec)

            2.2.4  修改gtid_mode = off_permissive

            将各节点gtid_mode设置为 off_permissive,不分顺序,但需要全部执行完毕后再进行下一步

              mysql> set global gtid_mode = off_permissive;
              Query OK, 0 rows affected (0.00 sec)

              2.2.5  修改gtid_mode=on_permissive

              建议先修改从库的gtid_mode为on_permissive,之后再修改主库的。此步骤执行完毕后生成的日志是带GTID的

                mysql> set global gtid_mode=on_permissive;
                Query OK, 0 rows affected (0.01 sec)

                2.2.6  查看状态

                  /** 确定传统方式复制完毕,此时各节点Ongoing_anonymous_transaction_count状态为0 **/
                  mysql> show status like 'ongoing_anonymous_transaction_count';
                  +-------------------------------------+-------+
                  | Variable_name | Value |
                  +-------------------------------------+-------+
                  | Ongoing_anonymous_transaction_count | 0 |
                  +-------------------------------------+-------+
                  1 row in set (0.00 sec)
                  /** 切换日志 **/
                  mysql> flush logs;
                  Query OK, 0 rows affected (0.16 sec)

                  需要所有的节点ongoing_anonymous_transaction_count均为0.

                  2.2.7  启用gtid_mode

                  前面的步骤确认正常后,各节点开启GTID_MODE

                    mysql> set global gtid_mode=on;
                    Query OK, 0 rows affected (0.01 sec)

                    2.3 将传统复制转为GTID模式

                    停止原有复制,切换为gtid模式后,设置为自动查找位置复制。

                      sql> stop slave;
                      Query OK, 0 rows affected (0.00 sec)


                      mysql> change master to master_auto_position=1;
                      Query OK, 0 rows affected (0.01 sec)


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

                      修改后复制即变为gtid模式。

                        mysql> SHOW GLOBAL  VARIABLES LIKE '%gtid%';
                        +----------------------------------+--------------------------------------------------------------------------------------------+
                        | Variable_name | Value |
                        +----------------------------------+--------------------------------------------------------------------------------------------+
                        | binlog_gtid_simple_recovery | ON |
                        | enforce_gtid_consistency | ON |
                        | gtid_executed | e29d3917-9dbb-11e9-8b64-e4434b6e2c80:1-93632,
                        e595a4ee-9dbb-11e9-a0f5-e4434b6e3094:1-30042 |
                        | gtid_executed_compression_period | 1000 |
                        | gtid_mode | ON |
                        | gtid_owned | |
                        | gtid_purged | e29d3917-9dbb-11e9-8b64-e4434b6e2c80:1-4803,
                        e595a4ee-9dbb-11e9-a0f5-e4434b6e3094:1-30042 |
                        | session_track_gtids | OFF |
                        +----------------------------------+--------------------------------------------------------------------------------------------+
                        8 rows in set (0.01 sec)


                        3. 修改配置文件

                        在配置文件中添加GTID相关参数,涉及到gtid的参数如下:

                          server-id:每个MySQL 实例的ID值,不能相同。必选项
                          gtid_mode = ON:MySQL是开启GTID模式.
                          enforce-gtid-consistency=on:开启GTID复制是,保证GTID的一致性.
                          log-bin:MySQL 必须开启binlog.
                          binlog_format=row: MySQLbinlog 的事实标准,其他格式会导致数据丢失.
                          log-slave-updates=on:级联复制,当slave接受到master的更新且执行完毕之后,执行的binlog是否写入slave的binlog记录中.


                          以一灯传诸灯,终至万灯皆明。


                          精彩推荐:

                          1.  MySQL不停地自动重启怎么办

                          2.  升级python,就是这么简单

                          3.  MySQL里trx_mysql_thread_id为0 的事务导致大量锁等待超时该咋整

                          4.  mysql8.0新增用户及加密规则修改的那些事

                          5.  Postgresql部署及简单操作

                          6.  比hive快10倍的大数据查询利器-- presto

                          7.  国产数据库部署初体验

                          8.   监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

                          9.   PostgreSQL主从复制--物理复制

                          10. PostgreSQL主从复制--逻辑复制

                          11.  MySQL从库生成大量小的relay log案例模拟

                          文章转载自数据库干货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论