mysql gtid ha_MySQl新特性 GTID

GTID简介

概念

全局事务标识符(GTID)是创建的唯一标识符,并与在源(主)服务器上提交的每个事务相关联。此标识符不但是唯一的,而且在给定复制设置中的所有服务器上都是唯一的。所有交易和所有GTID之间都有一对一的映射关系。

GTID由source_id和transaction_id组成

GTID = source_id:transaction_id

server_uuid一般为source_id

GTID集合

GTID总是保存在主从之间。这意味着您可以通过检查二进制日志来确定应用于任何从属设备的任何事务的来源。另外,一旦给定GTID的事务在给定的服务器上被提交,任何具有相同GTID的后续事务都被该服务器忽略。因此,在主站上提交的事务只在从站上应用一次,这有助于保证一致性。

GTID的生成和生命周期:

1,事务在主服务器上执行并提交。使用主服务器的UUID和此服务器上尚未使用的最小非零事务序列号为该事务分配一个GTID; GTID被写入到master的二进制日志中

2,在将二进制日志数据发送到从站并存储在从站的中继日志中,从站读取GTID并设置gtid_next这告诉slave,下一个事务必须使用这个GTID记录。

3,从服务器验证这个GTID是否应用此事务。

4,因为gtid_next不是空的,把git_next也就是从主机中获得的GTID写入到二进制日志中。

mysql.gtid_executed表

该mysql.gtid_executed表使从机能够在从机上禁用二进制日志记录时使用GTID,并且可以在二进制日志丢失时保留GTID历史记录。

若将mysql.gtid_executed表复位,执行RESET MASTER

表格提供会周期性的压缩 当数量达到executed_gtid_compression_period值或者日志轮转时候mysql压缩储存,值默认为1000,压缩线程thread/sql/compress_gtid_table

mysql> SELECT * FROM performance_schema.threads WHERE NAME LIKE'%gtid%'\G

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

THREAD_ID: 26

NAME: thread/sql/compress_gtid_table

TYPE: FOREGROUND

PROCESSLIST_ID: 1

PROCESSLIST_USER: NULL

PROCESSLIST_HOST: NULL

PROCESSLIST_DB: NULL

PROCESSLIST_COMMAND: Daemon

PROCESSLIST_TIME: 1509

PROCESSLIST_STATE: Suspending

PROCESSLIST_INFO: NULL

PARENT_THREAD_ID: 1

ROLE: NULL

INSTRUMENTED: YES

HISTORY: YES

CONNECTION_TYPE: NULL

THREAD_OS_ID: 18677

实践

两台机器

172.16.10.53

172.16.10.54

步骤

1,将master 设置read-only,使slave赶上master更新速度

mysql >set global read-only

注:read-only 设置时候super用户可写,普通用户不可写。

2,停止两台机器

>mysqladmin -uroot -p shutdown

3,修改配置,启用GTID功能,要启用基于GTID的复制,必须通过将gtid_mode变量 设置为启用GTID模式启动每个服务器 ON,并enforce_gtid_consistency 启用变量以确保只记录对基于GTID的复制安全的语句。在slave机器启动之前,使用--skip-slave-start禁用slave的复制进程。

由于在MySQL 5.7.5中增加了mysql.gtid_executed,所以不需要slave机器启用二进制日志记录来使用GTID 。这意味着您可以使用GTID但没有二进制日志记录的从服务器。为了能够复制,主设备必须始终启用二进制日志记录。而slave,只需要配置这些变量:

gtid_mode=ON

enforce-gtid-consistency=true

不过为了高可用的切换,推荐选择如下配置

gtid_mode=ON #必选

enforce-gtid-consistency=true #必选

log-bin=mysql #5.6必选 5.7.5和它之后可选,为了高可用,最好设置

server-id=1 #开启log-bin的必须设置

log-slave-updates=ON # 5.6必选 5.7.5和它之后可选,为了高可用切换,最好设置ON

4, 配置slave使用GTID来进行同步数据,当然需要在master给slave开通权限

grant replication slave on *.* to repl@"172.16.10.53" identified by "password";

设置GTID同步模式

change master to master_host='172.16.10.53',master_user='repl',master_port=3306,master_password="password",master_auto_position=1;

注意:非端口号需要加上引号

5,做一个新的备份,启用GTID之前创建的现有备份现在不能再在这些服务器上使用,因为您启用了GTID。在这一点上做一个新的备份,这样你就不会没有可用的备份。

比如说物理备份。

6,启动slave的同步进程

mysql> start slave

问题

在启动slave同步进程时候,查看日志出现如下问题

2018-01-17T09:48:18.116983Z 1 [Warning] Slave SQL for channel '': If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0

什么!!not consistent,绝对不能忍

在网上查了下添加如下配置就好了

在my.cnf中设置,

relay_log_info_repository = TABLE

master_info_repository = TABLE

relay_log_recovery = on

报错原因:

MySQL5.6版本号開始支持把master.info和relay-log.info的内容写入到mysql库的表中。

master.info--> mysql.slave_master_info

relay-log.info--> mysql. slave_relay_log_info

同一时候在MySQL5.6版本号中,添加了 Slave crash-safe replication功能,为了保证mysql的replication可以crash-safe。slave_master_info和slave_relay_log_info表必须使用事务型的存储引擎(InnoDB),不要尝试去手动改动这两张表的内容。

同一时候,Slave还要开启relay_log_recovery功能。

解决方法:

设置master_info_repository和relay_log_info_repository的值为TABLE。同一时候开启relay_log_recovery功能。

GTID的故障处理和恢复。

1,简单的复制,在新服务器上重现所有标识符和事务的最简单方法是将新服务器变为具有全部执行历史记录的主服务器的从服务器,并在两台服务器上启用全局事务标识符,缺点是较慢,且需要master保持所有的bin-log

2,使用mysqldump的方式,设置新slave机器(较快)

首先使用mysqldump命令备份

mysqldump --single-transaction --set-gtid-purged=OFF --triggers --routines --events -uroot -p >all.sql

此时会出现提示

mysqldump: [Warning] Using a password on the command line interface can be insecure.

Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.

若不需要进行GTID的恢复和从库设置,则可以添加--set-gtid-purged=OFF 关闭(默认为ON)

若需要进行GTID的主从设置则--set-gtid-purged=ON 既可

mysqldump --single-transaction --set-gtid-purged=ON --triggers --routines --events -uroot -p >all.sql

查看sql文件中会出现以下语句,设置GTID_PURGED来跳过一些事务。

--

-- GTID state at the beginning of the backup

--

SET @@GLOBAL.GTID_PURGED='7abe211e-fb4f-11e7-b16e-000c29ba88ca:1-69726';

然后在slave机器上进行恢复(需要slave开启GTID功能),在恢复时候可能需要下面问题。

[root@localhost ~]# mysql -uroot -pMysql3200$%^ test < /tmp/all.sql

mysql: [Warning] Using a password on the command line interface can be insecure.

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

解决办法:登录执行reset master 清空 GTID_EXECUTED

[root@localhost ~]# mysql -uroot -p

mysql> reset master;

Query OK, 0 rows affected (0.02 sec)

导入binlog后,再start slave既可。

mysql> show slave status\G

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

Slave_IO_State: Waiting for master to send event

Master_Host: 172.16.10.53

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql.000005

Read_Master_Log_Pos: 777138

Relay_Log_File: localhost-relay-bin.000018

Relay_Log_Pos: 88658

Relay_Master_Log_File: mysql.000005

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

3,使用空事务处理故障

情况1:

主键重复

Last_Error: Could not execute Write_rows event on table test.a; Duplicate entry '500' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql.000005, end_log_pos 651107

方法1:

注入空事务

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set: 7abe211e-fb4f-11e7-b16e-000c29ba88ca:66253-68381:69091-70362

Executed_Gtid_Set: 7abe211e-fb4f-11e7-b16e-000c29ba88ca:1-70362,

9a455b69-fb4f-11e7-b993-000c29e8a43c:1

(root@Slave)[tempdb]>stop slave sql_thread;

(root@Slave)[tempdb]>set gtid_next='7abe211e-fb4f-11e7-b16e-000c29ba88ca:70363';

(root@Slave)[tempdb]>begin;commit;

(root@Slave)[tempdb]>set gtid_next='AUTOMATIC';

(root@Slave)[tempdb]>start slave sql_thread;

(root@Slave)[tempdb]>show slave status \G

方法2:

删除冲突行

使用GTID的限制

涉及非事务性存储引擎的更新。对使用非事务性存储引擎的表进行的更新与在同一事务中使用事务性存储引擎的表的更新混合在一起会导致将多个GTID分配给同一事务。

CREATE TABLE ... SELECT语句。在使用基于行的复制时,该语句实际上被记录为两个单独的事件 - 一个用于创建表,另一个用于将源表中的行插入刚刚创建的新表中。当这个语句在一个事务中被执行时,这些事件在某些情况下可能会被接收到相同的事务标识符,这意味着包含插入事务的事务被从机跳过。

创建临时表。

GTID模式和mysql_upgrade,当服务器在启用全局事务标识符(GTID)时候,不要用mysql_upgrade --write-binlog启用二进制日志记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python gui界面 tcp_通过python实现TCP编程

伪代码&#xff1a; ss socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字上 ss.listen() #监听连接&#xff08;最大连接数&#xff09; info_loop: #服务器无限循环 cs ss.accept() #接受客户端连接 comm_loop: #通信循环 cs.recv()/cs.send() #对话&#xff08;接…

计算机网络安全基础知识笔记

1、网络安全威胁介绍非法授权访问&#xff1a;没有预先经过同意&#xff0c;就使用网络或相关的计算机资源就是非授权访问。主要有以下几种形式&#xff1a;身份攻击、假冒、非法用户进入网络系统进行违法操作、合法用户以未授权的方式进行操作。信息泄露丢失&#xff1a;主要是…

Delphi面向对象学习随笔七:COM

作者&#xff1a;巴哈姆特http://www.cnpack.org&#xff08;转载请注明出处并保持完整&#xff09; 上一篇&#xff0c;我们介绍了接口。如果没有接触过COM对象的话&#xff0c;你会觉得接口真的很麻烦&#xff0c;也许会有&#xff1a;“还不如直接定义一个类更方便”的想法。…

lambda

例子&#xff1a;

mysql查询语句详解_基于mysql查询语句的使用详解

1> 查询数据表除了前三条以外的数据。起初我想到的是这条语句SELECT * FROM admin WHERE userid NOT IN (SELECT userid FROM admin ORDER BY userid LIMIT 3) ORDER BY userid DESC但是运行的时候会报 This version of MySQL doesnt yet support LIMIT & IN/ALL/ANY/SO…

数据库技术基础:数据库与数据库管理系统概念介绍

一、数据库系统基本概念知识1、 数据&#xff08;Data&#xff09;用来描述事物的符号记录&#xff0c;它具有多种表现形式比如文字、图形、图像、视频等。信息&#xff1a;是现实事物的存在方式或状态的反映。信息的特性有可感知、可存储、可加工、可传递、可再生等。2、 数据…

unity3d collider自动调整大小_Maya模型在Unity3d中的快速烘焙【2020】

本文小姐姐将以一个Maya的室内小客厅场景为例&#xff0c;和童鞋们一起讨论Unity3d快速烘焙Maya室内模型光照的方法&#xff0c;一方面是对前面知识的综合应用&#xff0c;另一方面满足一下做室内设计童鞋的学习需求。话不多说&#xff0c;开工&#xff01;这个例子的Maya场景模…

angualarjsdemo

AngularJs学习笔记--Forms 原版地址&#xff1a;http://code.angularjs.org/1.0.2/docs/guide/forms 控件&#xff08;input、select、textarea&#xff09;是用户输入数据的一种方式。Form&#xff08;表单&#xff09;是这些控件的集合&#xff0c;目的是将相关的控件进行分组…

Java中Comparator比较器的使用以及使用lamba简化代码

代码例子&#xff1a; /*** 测试Comparator*/Testpublic void test17() {//原始方法Comparator<Integer> comparator new Comparator<Integer>() {Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1, o2);}};int compare1 compara…

php字符串转换mysql_在PHP中将字符串转换为MySQL时间戳格式

我使用从androidjava应用程序发送的字符串在php中编写查询.查询是这样的&#xff1a;$insertSQL sprintf("INSERT INTO app_DuckTag (taste) VALUES (%s) WHERE species%s AND timestamp%s",GetSQLValueString($_POST[taste], "text"),GetSQLValueString(…

数据库技术基础:数据库管理系统的功能介绍笔记

1、DBMS功能介绍1.1 数据定义数据库定义语言&#xff08;DDL&#xff09;&#xff1a;可以对数据库结构描述&#xff0c;包括外模式、模式、内模式的定义&#xff1b;数据库完整性定义&#xff1b;安全保密定义比如口令、级别和存取权限。这些定义存储在数据字典中是DBMS运行的…

charles乱码_基于iOS的Charles抓包实践

奇技指南在应用开发过程中&#xff0c;通过抓包调试服务端接口的场景时常出现。Charles和Wireshark是开发过程中最常用的两款软件。那么今天&#xff0c;让我们以iOS为例&#xff0c;聊一聊Charles抓包。本文来自360奇舞团QiShare团队投稿。在日常开发中&#xff0c;我们无法看…

分珠(dfs+并查集)

1140 分珠 时间限制:500MS 内存限制:65536K提交次数:24 通过次数:18 题型: 编程题 语言: G;GCC Description 如下图所示&#xff0c;有若干珠子&#xff0c;每颗珠子重量不同&#xff0c;珠子之间有一些细线将它们连在一起。现要求切断一些细线&#xff0c;将它们分成两部分…

那些程序员爆笑段子,扎心了…

1、特殊“2020是属于程序员的一年。”“怎么说&#xff1f;”“2020-1024996。”2、真相“你们程序员是不是没见过下班时候的太阳&#xff1f;”“也不是啦&#xff0c;夏天的时候还是能看到的。”“哦哦&#xff0c;夏天黑得比较晚。”“不是&#xff0c;是天亮得比较早。”3、…

lambda中sorted排序

准备工作&#xff0c;新建一个User类 使用stream排序操作&#xff08;默认ASC排序) stream倒序排序操作 sorted(Comparator.reverseOrder()) 代码例子&#xff1a; /*** lambda* sorted排序*/Testpublic void test19() {List<Integer> list new ArrayList<>();…

python中的括号不是西文吗_二级Python---python语言的基本语法元素(Day1)

一、基本输入输出函数Python中有三个重要的基本输入、输出函数&#xff0c;用于输入、转换和输出&#xff0c;分别是input()、eval()、print()。1.print()作用&#xff1a;输出运算结果&#xff1b;根据输出内容的不同&#xff0c;有三种用法。①、仅用于输出字符串&#xff0c…

chart.js 饼图显示百分比_实战PyQt5: 135-数据可视化之QChart绘制饼图

饼图是数据可视图表的基本类型&#xff0c;在QChart中&#xff0c;QPieSeries, QPieSlice处理饼图的绘制。QPieSeriesQPieSeries类以饼图形式显示数据。饼图系列由定义为QPieSlice对象的切片组成。切片可以具有任何值&#xff0c;因为QPieSeries对象计算切片的百分比与系列中所…

lambda中使用filter过滤

单一条件过滤 /*** 测试filter*/Testpublic void testFilter() {List<User> user new ArrayList<>();user.add(new User(1L, 18, "小明"));user.add(new User(2L, 20, "小王"));user.add(new User(3L, 28, "小刚"));user.add(new U…

Silverlight 打印

摘自&#xff1a;http://www.cnblogs.com/jiajiayuan/archive/2012/04/13/2444246.html Silverlight中的打印只有一个类&#xff0c;那就是PrintDocment这个对象来实现。下面我用两种方法来实现Silverlight的打印&#xff1a;第一种&#xff1a; private void btnPrint_Click(o…

数据库系统的体系结构知识笔记

1、集中式数据库系统分时系统环境下的集中式数据库系统结构诞生于20世纪60年代中期。当时的硬件和操作系统决定了分时系统环境下的集中式数据库系统构成早期的数据库技术的首选结构。数据和数据管理都是集中的&#xff0c;数据库系统的所有系统&#xff0c;从形式的用户到DBMS核…