当前位置: 首页 > 编程日记 > 正文

基于GTID模式MySQL主从复制

基于GTID模式MySQL主从复制

GTID复制原理:
基于GTID的复制是MySQL 5.6后新增的复制方式
GTID (global transaction identifier) 即全局事务ID, 保证了在每个在主库上提交的事务在集群中有一个唯一的ID.
在原来基于日志的复制中, 从库需要告知主库要从哪个偏移量position进行增量同步, 如果指定错误会造成数据的遗漏, 从而造成数据的不一致.
而基于GTID的复制中, 从库会告知主库已经执行的事务的GTID的值, 然后主库会将所有未执行的事务的GTID的列表返回给从库. 并且可以保证同一个事务只在指定的从库执行一次.

GTID是由server_uuid和事务id组成,格式为:GTID=server_uuid:transaction_id。server_uuid是在数据库启动过程中自动生成,每台机器的server-uuid不一样。
uuid存放在数据目录的auto.conf文件中,而transaction_id就是事务提交时系统顺序分配的一个不会重复的序列号。

GTID的好处:

(1)GTID使用master_auto_position=1代替了binlog和position号的主从复制搭建方式,相比binlog和position方式更容易搭建主从复制。
(2)GTID方便实现主从之间的failover,不用一步一步的去查找position和binlog文件。

GTID模式复制搭建过程中注意事项:
主从需要设置如下参数(一般直接在配置文件/etc/my.cnf下直接添加):

a、主库配置:

gtid_mode=on
enforce_gtid_consistency=on
log_bin=on
server-id=33062200(主从不能相同)
binlog_format=row

b、从库配置:

gtid_mode=on
enforce_gtid_consistency=on
log_slave_updates=1
server-id=33062211(主从不能相同)

开启GTID需要启用这三个参数:

#GTID
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates   = 1

主库上操作:

root@sakila 15:10: [mysql]>create user 'repluser'@'192.168.112.%' identified by 'xxxxxx';
root@sakila 15:10: [mysql]> grant replication slave on *.* to 'repluser'@'192.168.112.%';

主库逻辑备份:
mysqldump -uroot -hlocalhost -p --single-transaction --master-data=2 -A >all.sql
从库上操作:将主库上导出的all.sql导入从库
mysql -uroot -hlocalhost -p <all.sql

如果出现如下错误:
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
则在从库命令行下执行:reset master
root@sakila 15:20:[mysql]> reset master;
跟普通模式一样,执行change master语句,只不过其中的binlog和position换成master_auto_position=1

CHANGE MASTER TO
MASTER_HOST='192.168.112.220',
MASTER_USER='repluser',
MASTER_PASSWORD='xxxxxx',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;

启动slave复制服务
start slave;

查看主从复制状态:
root@sakila 15:23:  [mysql]> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.112.220Master_User: repluserMaster_Port: 3306Connect_Retry: 60Master_Log_File: on.000002Read_Master_Log_Pos: 2538363Relay_Log_File: localhost-relay-bin.000004Relay_Log_Pos: 2031371Relay_Master_Log_File: on.000002Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 2538363Relay_Log_Space: 2031582Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_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: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 33060220Master_UUID: 763c7ef3-5977-11e8-ae7a-000c2936b80fMaster_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: 763c7ef3-5977-11e8-ae7a-000c2936b80f:1393-6926Executed_Gtid_Set: 763c7ef3-5977-11e8-ae7a-000c2936b80f:1-6926Auto_Position: 1Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 
1 row in set (0.00 sec)
查主从状态

有上图可知:
Slave_IO_Running: Yes
lave_SQL_Running: Yes

复制主从复制状态OK,进一步查看通过Executed_Gtid_Set查看执行过的GTID:
root@sakila 15:38: [mysql]> show master status;
+-----------+----------+--------------+------------------+---------------------------------------------+
| File | Position | Binlog_Do_sakila | Binlog_Ignore_sakila | Executed_Gtid_Set |
+-----------+----------+--------------+------------------+---------------------------------------------+
| on.000002 | 3200431 | | | 763c7ef3-5977-11e8-ae7a-000c2936b80f:1-8730 |
+-----------+----------+--------------+------------------+---------------------------------------------+
1 row in set (0.00 sec)

root@sakila 15:38: [mysql]>
在MySQL5.7版本之后,gtid_executed这个值持久化了,在MySQL库下新增了一张表gtid_executed
root@sakila 15:38: [mysql]> desc gtid_executed;
+----------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| source_uuid | char(36) | NO | PRI | NULL | |
| interval_start | bigint(20) | NO | PRI | NULL | |
| interval_end | bigint(20) | NO | | NULL | |
+----------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

root@sakila 15:41: [mysql]> select * from gtid_executed;
+--------------------------------------+----------------+--------------+
| source_uuid | interval_start | interval_end |
+--------------------------------------+----------------+--------------+
| 763c7ef3-5977-11e8-ae7a-000c2936b80f | 1 | 6 |
+--------------------------------------+----------------+--------------+
1 row in set (0.00 sec)

该表会记录执行的GTID集合信息,因为有了该表,就不用再像MySQL 5.6版本时,必须开启log_slave_updates参数,从库才可以进行赋值。
GTID信息会保存在gtid_executed表中,可以关闭从库的binlog,节约binlog的记录开销。在执行reset master时,会清空表内所有的数据。
而MySQL 5.7还有一个参数gtid_executed_compresssion_period参数,用来控制gtid_executed表的压缩,该参数默认值为1000,意思是表压缩在执行完1000个事务之后开始。

root@sakila 15:47: [mysql]> show variables like '%gtid_executed%';
+----------------------------------+-------+
| Variable_name | Value |
+----------------------------------+-------+
| gtid_executed_compression_period | 1000 |
+----------------------------------+-------+
1 row in set (0.00 sec)
从MySQL5.7.6开始,gid_mode支持动态修改,gtid_mode可取值为:

OFF-------不支持GTID事务
OFF_PERMISSIVE----新的事务是匿名的,同时允许复制的事务可以是GTID,也可以是匿名的
ON_PERMISSIVE---- 新的事务使用GTID,同时允许复制的事务可以是GTID,也可以是匿名的
ON------支持GITD的事务

在线上环境中,有可能把传统复制改为GTID的复制模式的需求,这里特意强调一点,gtid_mode虽然支持动态修改,但不支持跳跃式修改。

另外在从库上可以执行show slave status命令来获取接收的gtid(retrieve_gtid_set)和执行的gtid(execute_gtid_set)
[root@localhost mysql]# mysql -uroot -hlocalhost -pxxxxxx -e "use mysql;show slave status\G;"|grep "Gtid_Set"
Retrieved_Gtid_Set: 763c7ef3-5977-11e8-ae7a-000c2936b80f:1393-10758
Executed_Gtid_Set: 763c7ef3-5977-11e8-ae7a-000c2936b80f:1-10758

SQL线程执行过的GTID(Executed_Gtid_Set)

IO线程获取到的GTID(Retrieved_Gtid_Set)

GTID模式复制局限性:

(1)不能使用create table table_name select * from table_name模式的语句
(2)在一个事务中既包含事务表的操作又包含非事务表
(3)不支持CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE语句操作
(4)使用GTID复制从库跳过错误时,不支持sql_slave_skip_counter参数的语法

参考:http://www.cnblogs.com/kindnull/p/9051358.html

转载于:https://www.cnblogs.com/elontian/p/9493826.html

相关文章:

NET Framework 2.0中的数据访问新特性

1异步数据访问 a)支持异步数据编程 b)SqlConnection – BeginOpen – EndOpen c)SqlCommand – BeginExecuteNonQuery – BeginExecuteReader – BeginExecuteXmlReader – EndExecuteNonQuery – EndEx…

【网络】通讯名词解释:带宽、速率、波特率、奈奎斯特定律、香农定理

1、带宽 1.1 解释一 带宽&#xff0c;又叫频宽&#xff0c;是数据的传输能力&#xff0c;指单位时间内能够传输的比特数。高带宽意味着高能力。 数字设备中带宽用bps(b/s)表示&#xff0c;即每秒最高可以传输的位数。 模拟设备中带宽用Hz表示&#xff0c;即每秒传送的信号周期…

这可能是最全的机器学习工具手册!

作者 | 红色石头转载自 AI有道&#xff08;ID:redstonewill&#xff09;工欲善其事必先利其器&#xff01;之前我也断断续续给大家发文整理过一些关于数据科学&#xff0c;尤其是机器学习、深度学方面的速查手册&#xff01;但是&#xff0c;每次分享的都比较是针对某一块的内容…

保持分布式团队同步

分布式团队最大的挑战是沟通&#xff0c;这对建立协作的基本原则必不可少。调整工作时间&#xff0c;互相适应&#xff0c;而团队联络员有助于沟通和同步工作。以信任、尊重和开明为基础的团队会鼓励组织中的人们互相帮助&#xff0c;培养一种使团队保持同步的文化。\\SkuVault…

Word2010开发——操作文档

参考&#xff1a; http://blog.csdn.net/akipeng/article/details/6534375 http://www.haogongju.net/art/19029 首先建立一个Word外接程序&#xff08;Word AddIn&#xff09;&#xff08;家里的Vs竟然是中文版&#xff0c;汗&#xff01;&#xff09; 接着在项目中新增项&…

【驱动】ubuntu安装内核头文件

1、检查是否已经安装 使用dpkg-query命令检查是否有可用的内核头文件。 $ dpkg-query -s linux-headers-$(uname -r) 如果输出显示install ok installed说明已经安装成功 Package: linux-headers-4.15.0-142-generic Status: install ok installed2、安装内核头文件 $ sudo…

嫌Terminal终端太单调?快收下这几个有趣的改造工具!

整理 | Rachel责编 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导语】Terminal&#xff08;终端&#xff09;是程序员常用的工具之一&#xff0c;常用于系统的相关配置修改。系统自带的 terminal 较为简单&#xff0c;很多 Github 的开源项目都尝试对终端…

关于matlab向文件写入数据的方法——留着备用

MATLAB数据采集的时候&#xff0c;往往需要把得到的数据保存下来。 fid fopen(文件名&#xff0c;‘打开方式’)&#xff1b; 说明&#xff1a;fid用于存储文件句柄值&#xff0c;如果fid>0&#xff0c;这说明文件打开成功。打开方式有如下选择&#xff1a; ‘r’&#xff…

js在页面滚动到一定位置时触发事件?

function getTop(e) {var offsete.offsetTop;if(e.offsetParent!null) //只要还有父元素,也就是当前元素不是根节点就继续往上累计元素的高度offsetgetTop(e.offsetParent);return offset; } var myBlockTop getTop(document.getElementById("homepageBanner")); va…

【C语言】学习笔记3——字符串

1. 字符串&#xff08;charcacter string&#xff09;是一个或多个字符的序列 2. C语言没有专门用于存储字符串的变量类型。字符串都被存储在char类型的数组种。 3. 数组由连续的存储单元组成&#xff0c;字符串种的字符被存储在相邻的存储单元中&#xff0c; 每个单元存储一个…

Facebook 的AI翻身之战!

作者 | Michael K. Spencer译者 | 王艳妮&#xff0c;责编 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Facebook最近举办了F8会议&#xff0c;这是了解这个平台未来发展的绝佳机会。 F8是Facebook的年度开发者大会——一个为期数日的活动&#xff0c;期间…

【Linux驱动】ThinkPad笔记本wifi模块rtl8821ce在ubuntu16.04的驱动(默认没有)

0、wifi模块型号 在win10下设备管理器中查看&#xff0c;型号为&#xff1a;Realtek 8821CE Wireless LAN 802.11ac PCI-E NIC 1、问题描述 在ThinkPad上安装win10ubuntu16.04双系统后&#xff0c;在win10下wifi可以正常使用&#xff0c;但是在ubuntu下没有wifi列表。 2、…

关于Linux的inode和dentry的一组文章

先mark一下&#xff0c;有时间再看。 http://www.ruanyifeng.com/blog/2011/12/inode.htmlhttp://teaching.idallen.com/dat2330/04f/notes/links_and_inodes.htmlhttp://www.thegeekstuff.com/2012/01/linux-inodes/http://blog.chinaunix.net/uid/7828352/frmd/-1.htmlhttp:/…

为什么Rust连续4年获“最受喜爱编程语言”?

作者 | Mike Tang责编 | Aholiab出品 | 区块链大本营&#xff08;blockchain_camp)2015年5月15日&#xff0c;Rust编程语言核心团队正式宣布发布Rust 1.0版本。4年来&#xff0c;它优雅的解决高并发和高安全性系统问题的能力&#xff0c;受到了越来越多开发者的喜爱。并且连续4…

【Windows】清除win10开始菜单中失效打程序标签

1、问题描述 安装新版本Qt程序&#xff0c;卸载旧版本Qt后&#xff0c;在开始菜单中&#xff0c;还有残留&#xff0c;但是已经失效&#xff0c;需要删除这些失效的程序标签。 2、显示隐藏文件夹 打开此电脑——查看——勾选“隐藏项目”&#xff1a; 3、删除失效的程序标签…

解析equals(Object obj)和compareTo(T obj)

背景&#xff1a;最近在研究静态扫描的东西&#xff0c;遇到一个规则&#xff1a;"equals(Object obj)" should be overridden along with the "compareTo(T obj)" method 然后就想深度扒一扒equals和compareTo有什么区别 1.java.lang.Object是所有类的父类…

安装和部署Exchange Server 2007

为什么Exchange Server 2007使用服务器角色? 简化部署和管理 增强可扩展性 改进安全性 见下图:什么是邮箱服务器角色? 邮箱服务器角色: 存储用户邮箱和公共文件夹 通过群集, LCR, CCR实现高可用性 并不在邮箱之间转输邮件邮箱服务器: 不应该能从Internet直接访问 必须是活动…

AI时代,中国技术创新如何弯道超车?

2019 年 5 月 26 日 - 27 日&#xff0c;杭州国际博览中心&#xff0c;由工信部人才交流中心指导&#xff0c;CSDN 和数字经济人才发展中心主办的 CTA 核心技术及应用峰会圆满落下帷幕。本次大会聚焦机器学习、知识图谱等 AI 领域的热门技术&#xff0c;关注技术在行业中的实践…

【TX2】英伟达Nvidia TX2连接蓝牙设备

1、问题描述 买了一个蓝牙键盘&#xff08;航世B.O.W 折叠键盘HB099&#xff0c;200大洋&#xff09;&#xff0c;尝试在连接TX2的蓝牙&#xff0c;试试好使不 2、安装蓝牙 Blueman 是一个适合在 GNOME 桌面环境使用的图形化蓝牙管理工具。 sudo apt-get install blueman b…

usermod

功能说明&#xff1a;用于修改系统已经存在的用户账号信息。 参数选项&#xff1a;-c comment 修改用户password文件中用户说明栏&#xff0c;同useradd -c功能。-d home_dir 修改用户每次登入时所使用的家目录&#xff0c;同useradd -d功能。-e expired_date 修改用户终止日期…

asp.net 获取当前时间的格式

在平时的编程中&#xff0c;经常会用到获取当前的系统时间&#xff0c;格式也很特定&#xff0c;今天就把一些格式整理了一下&#xff0c;贴出来&#xff0c;以便以后的使用。 //获取日期时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalT…

史上最大规模ACL大会放榜,百度10篇NLP论文被录用!

近日&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域的国际顶级学术会议“国际计算语言学协会年会”&#xff08;ACL 2019&#xff09;公布了今年大会论文录用结果。根据 ACL 2019 官方数据&#xff0c;今年大会的有效投稿数量达到 2694 篇&#xff0c;相比去年的 15…

【Ubuntu】安装Ubuntu+Win双系统后,每次开机默认是进入Ubuntu,如何设置成默认进入Win?

1、问题描述 安装UbuntuWin双系统后&#xff0c;每次开机默认是进入Ubuntu&#xff0c;如何设置成默认进入Win&#xff1f; 2、解决方法 1&#xff09;记住开机选择中windows 10是第几个&#xff0c;从0开始记&#xff0c;如下图本人的是4 2&#xff09;进入ubuntu系统&am…

MFC 多线程及线程同步

一、MFC对多线程编程的支持 MFC中有两类线程&#xff0c;分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环&#xff0c;而用户界面线程有自己的消息队列和消息循环。  工作者线程没有消息机制&#xff0c;通常用来执行后台计算和维护任务&…

太火!这本AI图书微软强推,程序员靠它拿下50K!

如何能够短时间内抓住技术重点&#xff0c;集中突击&#xff1f;如何不在惧怕“算法”&#xff1f;如何才能在面试中对答如流&#xff0c;打造属于自己的“offer收割机”&#xff1f;也许这本书——《百面机器学习 算法工程师带你去面试》就能帮你实现&#xff01;《百面机器学…

【Qt】错误处理:error: undefined reference to `qMain(int, char**)‘

1、问题描述 在一次编译Qt项目时,报错 H:\Qt\Qt5.14.2\5.14.2\mingw73_32\lib\libqtmain.a(qtmain_win.o):-1: In function `WinMain@16: C:\Users\qt\work\qt\qtbase\src\winmain\

Android WebView与ViewPager的滑动冲突分析

前言 如题所述&#xff0c;我使用的架构是ViewPagerFragmentWebView进行开发的&#xff0c;由于WebView的html页面代码是第三方的&#xff0c;这里不好放出来&#xff0c;所以只能放一个大致的架构图&#xff0c;如图所示&#xff0c;ViewPager包含了两个fragment,可以左右滑动…

关于outlook2010帐户设置

安装了office2010后&#xff0c;首次使用outlook&#xff0c;关于帐户设置&#xff0c;以qq邮件为例 开启imap服务2.打开outlook2010软件 由于有文字限制&#xff0c;其他的图解请链接http://wlinfang.blog.51cto.com/2961560/902193转载于:https://blog.51cto.com/wlinfang/90…

如何构建可解释的推荐系统?| 深度

作者 | gongyouliu来源 | 大数据与人工智能&#xff08;ID&#xff1a;ai-big-data&#xff09;推荐系统的目标是为用户推荐可能会感兴趣的标的物。通过算法推荐达到节省用户时间、提升用户满意度、为公司创造更多的商业价值的目的。要想达到这个目的就需要让用户信任你的推荐系…

【Qt】获取、比较Qt版本的宏和函数

1、版本号宏定义 版本号宏定义在QtCore\qconfig.h中,以Qt5.14.2为例 #define QT_VERSION_STR "5.14.2" #define QT_VERSION_MAJOR 5 #define QT_VERSION_MINOR 14 #