数码资讯
使用gtids复制协议教程和中断协议,MySQL
mysql5.6具有很多新特点,其中许多人感兴趣的是全局事务序列号功能(gtids)。为什么每个人都在这个功能感兴趣,也很好理解。也就是说,重新从服务器到新的主服务器始终是一个麻烦。然而,在gtids功能启用时,它变得容易和可行的。然而,gtids的使用不仅是为了取代旧的二进制日志文件/位置与一个单
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
mysql5.6具有很多新特点,其中许多人感兴趣的是全局事务序列号功能(gtids)。为什么每个人都在这个功能感兴趣,也很好理解。也就是说,重新从服务器到新的主服务器始终是一个麻烦。然而,在gtids功能启用时,它变得容易和可行的。然而,gtids的使用不仅是为了取代旧的二进制日志文件/位置与一个单独的标识符,并以一种新的复制协议。如果你不了解这个,你可以在这篇文章中学习的东西。
复制协议:新的vs旧的
旧协议通常简单而直接:首先,从服务器上的特定偏移量连接到给定的二进制日志文件,然后主服务器从那里发送所有事务。
新协议略有不同:奴隶将发送gtid范围已经执行,然后主发送每个失去的交易。它还确保一个给定的gtid只能一次执行特定的奴隶。
实际上,这会改变什么吗让它改变很多事情。想象一下这样的场景:你想从trx 4开始复制,但是由于某种原因Trx2奴隶失去。
与旧协议,trx 2将不会被执行一次,并与新的协议,它会自动重新执行。
下面是两种可以在实践中看到新协议的一般场景。
跳过事务
我们都知道,旧的全球sql_slave_skip_counter = n不提供支持,当你想跳过一个事务,并gtid可以激活。而gtid XXX:N,你需要注入一个空的交易:
MySQL >设置gtid_next = 'xxx:n;
开始;
MySQL >设置gtid_next =傻瓜;
为什么我们不能用sql_slave_skip_counter因为新的复制协议!
假设我们有三个服务器,如下图所示:
让我们假设sql_slave_skip_counter可被用在S2跳过TRX2 ..如果将S2设为S1的奴隶,会发生什么
两个服务器将彼此交换了执行gtid范围,和S1会意识到它已发送TRX2 S2,然后会有两种可能性。
如果TRX 2仍在S1的二进制日志,它将被发送到S2,和交易不会被跳过。
如果TRX 2不再在S1的二进制日志,你会得到一个复制错误。
显然,这是不安全的。这就是为什么sql_slave_skip_counter无法使用时,使用gtid。如果您想跳过事务,唯一安全的选项是执行一个虚拟事务而不是实际事务。
错误的事务
如果在本地执行一个事务,在MySQL文档中称为错误事务,如果您被这个事务推到新的主目录会发生什么
基本上,使用旧协议没有关系。(确切地说,新主人与它的奴隶之间的数据是不一致的,但以后可能会被修复)。
使用新协议,错误的事务将被识别和丢失,并在容错备份上自动执行,这将导致破坏复制的潜力。
例如,您有一个主(m)和两个从(S1和S2)。有两种情况下,奴隶重新连接到新的主人,将不同的复制错误发生。
#场景1
# S1
MySQL >创建一个数据库;
# M
MySQL创建数据库不存在文件>;
#谢谢to'if不退出,复制不破S1。现在将S2移动到S1:
# S2
MySQL >停止奴隶;改变主master_host = 's1开始的奴隶;
这将创建与现有的#数据冲突!
显示从属状态
{…}
last_sql_errno:1007
last_sql_error:error'can不能创造database'mydb;对存在的数据库查询。默认数据库:
{…}
#场景2
# S1
MySQL >创建一个数据库;
#现在,我们从二进制日志删除该交易
# S1
刷新日志;
MySQL的二进制日志>清除to'mysql-bin 00000 8;
# M
MySQL创建数据库不存在文件>;
# S2
MySQL >停止奴隶;改变主master_host = 's1开始的奴隶;
失踪的交易是没有#在主人的二进制日志不再可用!
显示从属状态
{…}
last_io_errno:1236
last_io_error:T致命错误1236从掌握阅读从二进制数据,致命的数据时,错误,
{…}
你可以看到,错误的交易应该由gtid基础服务手段避免。如果需要运行本地事务,最好的选择是禁止二进制日志与特定语句相冲突。
MySQL >设置sql_log_bin = 0;
MySQL >运行本地交易#
结论
gtids是方便我们连接副本与其他服务器的一点进步。然而,我们也面临着在操作和维护方面的新的困难和挑战。如果你要开始使用GTIDs,你必须真正理解新的复制协议,否则你将结束在一个意想不到的方式复制过程。
复制协议:新的vs旧的
旧协议通常简单而直接:首先,从服务器上的特定偏移量连接到给定的二进制日志文件,然后主服务器从那里发送所有事务。
新协议略有不同:奴隶将发送gtid范围已经执行,然后主发送每个失去的交易。它还确保一个给定的gtid只能一次执行特定的奴隶。
实际上,这会改变什么吗让它改变很多事情。想象一下这样的场景:你想从trx 4开始复制,但是由于某种原因Trx2奴隶失去。
与旧协议,trx 2将不会被执行一次,并与新的协议,它会自动重新执行。
下面是两种可以在实践中看到新协议的一般场景。
跳过事务
我们都知道,旧的全球sql_slave_skip_counter = n不提供支持,当你想跳过一个事务,并gtid可以激活。而gtid XXX:N,你需要注入一个空的交易:
MySQL >设置gtid_next = 'xxx:n;
开始;
MySQL >设置gtid_next =傻瓜;
为什么我们不能用sql_slave_skip_counter因为新的复制协议!
假设我们有三个服务器,如下图所示:
让我们假设sql_slave_skip_counter可被用在S2跳过TRX2 ..如果将S2设为S1的奴隶,会发生什么
两个服务器将彼此交换了执行gtid范围,和S1会意识到它已发送TRX2 S2,然后会有两种可能性。
如果TRX 2仍在S1的二进制日志,它将被发送到S2,和交易不会被跳过。
如果TRX 2不再在S1的二进制日志,你会得到一个复制错误。
显然,这是不安全的。这就是为什么sql_slave_skip_counter无法使用时,使用gtid。如果您想跳过事务,唯一安全的选项是执行一个虚拟事务而不是实际事务。
错误的事务
如果在本地执行一个事务,在MySQL文档中称为错误事务,如果您被这个事务推到新的主目录会发生什么
基本上,使用旧协议没有关系。(确切地说,新主人与它的奴隶之间的数据是不一致的,但以后可能会被修复)。
使用新协议,错误的事务将被识别和丢失,并在容错备份上自动执行,这将导致破坏复制的潜力。
例如,您有一个主(m)和两个从(S1和S2)。有两种情况下,奴隶重新连接到新的主人,将不同的复制错误发生。
#场景1
# S1
MySQL >创建一个数据库;
# M
MySQL创建数据库不存在文件>;
#谢谢to'if不退出,复制不破S1。现在将S2移动到S1:
# S2
MySQL >停止奴隶;改变主master_host = 's1开始的奴隶;
这将创建与现有的#数据冲突!
显示从属状态
{…}
last_sql_errno:1007
last_sql_error:error'can不能创造database'mydb;对存在的数据库查询。默认数据库:
{…}
#场景2
# S1
MySQL >创建一个数据库;
#现在,我们从二进制日志删除该交易
# S1
刷新日志;
MySQL的二进制日志>清除to'mysql-bin 00000 8;
# M
MySQL创建数据库不存在文件>;
# S2
MySQL >停止奴隶;改变主master_host = 's1开始的奴隶;
失踪的交易是没有#在主人的二进制日志不再可用!
显示从属状态
{…}
last_io_errno:1236
last_io_error:T致命错误1236从掌握阅读从二进制数据,致命的数据时,错误,
{…}
你可以看到,错误的交易应该由gtid基础服务手段避免。如果需要运行本地事务,最好的选择是禁止二进制日志与特定语句相冲突。
MySQL >设置sql_log_bin = 0;
MySQL >运行本地交易#
结论
gtids是方便我们连接副本与其他服务器的一点进步。然而,我们也面临着在操作和维护方面的新的困难和挑战。如果你要开始使用GTIDs,你必须真正理解新的复制协议,否则你将结束在一个意想不到的方式复制过程。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。