首页 > 数据库技术 > 详细

mysql5.7基于GTID实现主从复制

时间:2017-01-10 18:15:09      阅读:239      评论:0      收藏:0      [点我收藏+]

mysql5.7基于GTID实现主从复制

一.GTID概述

1.1 GTID的概念

  1. GTID,全局事务ID globaltransaction identifiers

  2. GTID是一个事务对应一个全局唯一ID

  3. GTID 对应事务在一个服务器上只执行一次,避免重复执行导致数据不一致。

  4. GTID 用来代替传统的复制方法,不再使用传统的MASTER_LOG_FILE+ MASTER_LOG_POS,而是使用MASTER_AUTO+POSTION=1的方式

  5. 2 GTID优势

  6. 搭建主从比传统的方式更加简单,主从切换方便、快速。

  7. 比传统的复制更能保证数据一致性

  8. 3 GTID的工作原理

  9. 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。

  10. binlog传输到slave,并存储到slaverelaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。

  11. sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID

  12. 如果有记录,说明该GTID的事务已经执行,slave会忽略。

  13. 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog

  14. 在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。

  15. 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

  16. 二.新搭建主从,基于GTID实现

  17. 主库:

  18. 修改vim /etc/my.cnf

  19. #gtid

  20. server_id=1 #主库与从库不能重复

  21. gtid_mode=on,开启gtid模式

  22. enforce_gtid_consistency=on #参数值包括off(不检测是否有GTID不支持的语句或事物),warn(当发现有支持的语句或事务时,返回警告,并记到日志中),on(当发现语句或事物不支持GTID时,返回错误)建议在启用GTID时,在测试环境中开始此参数,处理完GTID不支持的语句后,再启用GTID

  23. #binlog

  24. log_bin=master-binlog #开启binlog

  25. log-slave-updates=1

  26. binlog_format=row #建议复制时开启row模式

  27.    

  28. #relay log

  29. #skip_slave_start=1

  30.  

  31. 从库:

  32. 修改vim /etc/my.cnf

  33. #gtid

  34. server_id=2 #主库与从库不能重复

  35. gtid_mode=on,开启gtid模式

  36. #binlog

  37. log_bin=master-binlog #开启binlog,注意5.7版本以后可以不开启binlog了,可以节省空间提高性能,5.6版本必须开启binlog,因为GTID存储在binlog中,只有开启binlog才能使用GTID的功能。5.7中通过GTID系统表来记录GITD(mysql.gtid.executed),每个事务提交时,将GTID插入到表中。

  38. log-slave-updates=1

  39. binlog_format=row #建议复制时开启row模式

  40.     

  41. #relay log

  42. #skip_slave_start=1

  43.  

  44. 三.在线将传统复制模式变更为基于GTID复制的步骤

  45. masterslave上分别执行

  46. set@@global.enforce_gtid_consistency=warn;

  47. 查看错误日志中是否有错误信息

  48. tail -fmysql-master.err

  49. masterslave上分别执行

  50. set@@global.enforce_gtid_consistency=on;

  51. masterslave上分别设置GTID模式:

  52. set@@global.gtid_mode=off_permissive;

  53. 查看主从错误日志中是否有错误信息

  54. tail -fmysql-master.err

  55. masterslave上分别执行

  56. set@@global.gtid_mode=on_permissive;

  57. 检查是否还有基于传统复制的信息

  58. mysql> show status like ‘ongoing_anonymouse_transcation_count‘;

  59. Empty set (0.00 sec) #如果为空表示没有问题

  60. masterslave上分别执行

  61. set @@global.gtid_mode=on;

  62. mysql> show variables like ‘gtid_mode‘;

  63. +---------------+-------+

  64. | Variable_name | Value |

  65. +---------------+-------+

  66. | gtid_mode     | ON    |

  67. +---------------+-------+

  68. slave上执行:

  69. stop slave;

  70. change master tomaster_auto_position=1;

  71. start slave

  72. show slave status\G;

  73. 以下两个参数加入到my.cnf中,以便重启时生效

  74. gtid_mode=on

  75. enforce_gtid_consistency=on

  76. 四.在线将基于GTID复制变更为传统模式的复制

  77. master服务器

  78. show master status; #查看master的日志文件及位置点

  79. slave服务器

  80. stop slave;

  81. change master to master_auto_position=0,master_log_file=‘master-binlog.000004‘, master_log_pos=194;

  82. start slave;

  83. master slave 上分别执行

  84. set @@global.gtid_mode=on_permissive;

  85. set @@global.gtid_mode=off_permissive;

  86. select @@global.gtid_owned;#masterslave全为空字符串时执行下面操作

  87.  

  88. set @@global.gtid_mode=off;

  89. enforce_gtid_consistency=off;

  90. slave上执行,查看复制状态

  91. show slave status\G;

  92. my.cnf中,修改

  93. gtid_mode=off

  94. enforce_gtid_consistency=off

参考:http://blog.csdn.net/leshami/article/details/50630691

本文出自 “逍遥浪子” 博客,请务必保留此出处http://yanghongwei.blog.51cto.com/5083286/1890797

mysql5.7基于GTID实现主从复制

原文:http://yanghongwei.blog.51cto.com/5083286/1890797

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!