MySQL传统点位复制在线转为GTID模式复制「建议收藏」

MySQL传统点位复制在线转为GTID模式复制「建议收藏」1. GTID优缺点 MySQL传统点位复制在5.7版本前是主要的主从复制模式,而随着MySQL5.6版本引入GTID,并且MySQL5.7进行各方面的优化以后,在mySQL5.7(尤其是MySQL5

  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.

代码100分

     需改为 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  查看当前状态

代码100分/** 传统复制下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)

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

代码100分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模式后,设置为自动查找位置复制。

ql> 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记录中.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10999.html

(0)
上一篇 2022-12-18
下一篇 2022-12-18

相关推荐

  • 使用Python去除换行符

    使用Python去除换行符在编写Python代码时,我们经常需要处理文本文件。然而,文本文件中的换行符会对我们的处理带来麻烦。如果有换行符,我们就需要对每一行进行分隔,这会导致代码变得冗长而且难以阅读。因此,去除文本中的换行符是非常有必要的。

    2024-07-08
    42
  • 用Python求解圆周率的平方根

    用Python求解圆周率的平方根求解圆周率的方法有很多种,其中一种常用的方法是蒙特卡罗方法。假设有一个圆和一个正方形,正方形边长为圆的直径,当在正方形中随机生成大量点时,经过圆内点的数量占总点数的比例将趋近于圆的面积与正方形面积的比例,而圆的面积与正方形面积的比例是圆周率的平方的1/4。于是,通过这一比例就可以近似求出圆周率的值。

    2024-03-02
    88
  • Python词频统计代码

    Python词频统计代码在大量文本数据中,关键词的频次统计往往是必不可少的。无论是从市场营销角度还是从学术角度,词频统计都占有重要的地位。而Python作为一种擅长文本处理的编程语言,提供了一种快速而准确的词频统计方法。

    2024-06-29
    44
  • Python中if和elseif语句的区别

    Python中if和elseif语句的区别在Python中,if和elseif是两种常用的条件语句。它们可以根据不同的条件执行不同的代码块。具体来说,if语句是用来判断一个条件是否成立,如果成立就执行对应的代码块;如果不成立,可以选择执行其他代码或者什么也不做。而elseif语句则是可以在if语句执行不成立时继续判断下一个条件是否成立,如果成立就执行对应的代码块。

    2024-07-10
    45
  • Python切片的用法

    Python切片的用法切片是指对于某个序列,可以通过一定的方式选择其中的一部分,并返回一个新的序列。切片的操作是非常常用且高效的,特别是在数据处理和处理大数据量时。Python提供了很简单的方法对序列进行切片。

    2024-04-09
    72
  • mysql学习笔记之explain分析

    mysql学习笔记之explain分析mysql explain功能中展示各种信息的解释: id:优化器选定的执行计划中查询的序列号。 select_type:所用的查询类型,主要由以下这集中查询类型。 . DEPENDENT UNIO…

    2023-03-11
    147
  • Python 编写的 Button 交互组件

    Python 编写的 Button 交互组件Button 是一种常见的交互组件,用户通过点击按钮来触发特定事件。在 Python 中,我们可以使用不同的库来创建各种不同的 Button,例如 tkinter 和 PyQt 等。

    2024-01-20
    95
  • Python访问MySQL[亲测有效]

    Python访问MySQL[亲测有效]Python访问MySQL的步骤 创建connection连接,连接数据库 获取cursor游标对象 执行SQL语句 关闭cursor游标对象 关闭connection连接 import pymys…

    2023-03-24
    160

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注