设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 站长学院 > MySql教程 > 正文

GTID模式解说

发布时间:2022-07-01 10:18 所属栏目:115 来源:互联网
导读:从MySQL5.6开始增加了强大的GTID(Global Transaction ID,全局事务ID)这个特性,用来强化数据库的主备一致性, 故障恢复, 以及容错能力。用于取代过去传统的主从复制(即:基于binlog和position的异步复制)。 基于GTID复制的优点: 1、根据传统的复制原
  从MySQL5.6开始增加了强大的GTID(Global Transaction ID,全局事务ID)这个特性,用来强化数据库的主备一致性, 故障恢复, 以及容错能力。用于取代过去传统的主从复制(即:基于binlog和position的异步复制)。

  基于GTID复制的优点:
 
  1、根据传统的复制原理,当连接发生故障时,需要重新连接到master主机,需要找到binlog和position,然后change master to 连接到master主机,此过程需要人工来做,比较麻烦,也容易出错,尤其是master写操作较多时,更不容易确定position,如果flush table with read lock,势必会影响到线上业务。而GTID复制方式不需要找master的binlog和position,只需要知道master的ip、端口、账号密码,即可进行复制,MySQl会通过内部机制自动找点同步(MASTER_AUTO_POSITION=1)
  简单来说就是:简化复制。传统复制是基于file和position来实现的,而file和position是人为确定的,file还好一些,但是position却是实时变动的,难以确定,除非对全库加读锁,但这势必会对线上业务产生影响,GTID会自动找position进行数据同步
 
  2、多线程复制(基于库),在MySQL5.6以前的版本,slave的复制是单线程的。一个事件一个事件的读取应用。而master是并发写入的,所以延迟是避免不了的。唯一有效的方法是把多个库放在多台slave,这样又有点浪费服务器。在MySQL5.6里面,我们可以把多个表放在多个库,这样就可以使用多线程复制,当只有1个库,多线程复制是没有用的(即:所谓的并行复制)
  简单来说就是:跟多线程复制相关。多线程复制是基于组提交方式实现的,而组提交信息是存储在GTID中的
 
  GTID的作用:
 
  1、根据GTID可以知道事务最初是在哪个实例上提交的
  2、GTID的存在方便了Replication的Failover
 
  GTID复制实现的工作原理:
  1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中
  2、slave端的I/O线程将变更的binlog,写入到本地的relay log中
  3、SQL线程从relay log中获取GTID,然后对比slave端的binlog是否有记录(所以MySQL5.6 slave端必须开启binlog)
  4、如果有记录,说明该GTID的事务已经执行,slave会忽略
  5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog
  6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描
 
  GTID使用限制:
  1、  MySQL5.7之后才开始支持动态切换GTID相关的参数
  2、  不支持CREATE TABLE ... SELECT statements
  3、  不支持CREATE TEMPORARY TABLE statements inside transactions
  4、  transaction or statement 既更新了事务表又更新了非事务表
  5、  使用GTID复制从库跳过错误时,不支持执行sql_slave_skip_counter参数的语法

  以下内容是笔者从博客、论坛等收集的资料,不保证正确性,仅供参考:
 
  1、gtid_executed
  在当前实例上执行过的GTID集合,实际上包含了所有记录到binlog中的事务。所以,设置set sql_log_bin=0后执行的事务不会生成binlog事件,也不会被记录到gtid_executed中。执行reset master可以将该变量清空
 
  2、gtid_purged
  binlog不可能永久停留在服务器上,需要进行定期清理(如通过expire_logs_days),否则迟早它会把磁盘空间用完。gtid_purged用于记录已经被清除了的binlog事务集合,它是gtid_executed的子集。只有gtid_executed为空时才能手动设置该变量,此时会同时更新gtid_executed为和gtid_purged相同的值。gtid_executed为空意味着要么之前没有启动过基于GTID的复制,要么执行过reset master。执行reset master时同样也会把gtid_purged置空,即始终保持gtid_purged是gtid_executed的子集。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读