mysql主从

[toc]

1.GTID是什么?

GTID 全称A global transaction identifier 全局事物id,是MASTER创建的和事物相匹配的ID号;

  1. 它不仅在本机上是唯一的,而且在其他服务器上也是唯一的;
  2. gitd与事物一一对应
  3. master每次commit事物的时候就会自动创建gtid

gitd格式是 GTID = source_id:transaction_id (如 04038bcc-fd0c-11e7-9cc5-000c29db6599:1-2

source_id 一般是发起事物的uuid, 保存在auto.cnf文件中;

transaction_id是事物id1-2代表第二个事物;第1-n代表n个事物

2.为什么要用GTID?

  • 在主从复制中,尤其是半同步复制中, 由于Masterdump进程一边要发送binlog给Slave,一边要等待SlaveACK消息,这个过程是串行的,即前一个事物的ACK没有收到消息,那么后一个事物只能排队候着; 这样将会极大地影响性能;有了GTID后,SLAVE就直接可以通过数据流获得GTID信息,而且可以同步;

  • 另外,主从故障切换中,如果一台MASTER down,需要提取拥有最新日志的SLAVE做MASTER,这个是很好判断,而有了GTID,就只要以GTID为准即可方便判断;而有了GTID后,SLAVE就不需要一直保存这bin-log 的文件名和Position了;只要启用MASTER_AUTO_POSITION即可

  • MASTER crash的时候,GTID有助于保证数据一致性,因为每个事物都对应唯一GTID,如果在恢复的时候某事物被重复提交,SLAVE会直接忽略;

3.什么时候用GTID?

一般在主从复制的场景下,如果只有单台就没必要使用

GTID不支持:

  • CREATE TABLE...SELECT语句,因为一个事物一个GTID,这个语句有2个事物,一个CREATE,一个INSERT,所以不支持

  • CRETAE TEMPORARY TABLE,或者DROP TEMPORARY TABLE不支持

  • 事物和非事物混合使用; 不支持

4. 如何配置GTID?

1//在主库上的配置文件中添加: 2 3#GTID: 4server_id=1 #服务器id 5gtid_mode=on #开启gtid模式 6enforce_gtid_consistency=on #强制gtid一致性,开启后对于特定create table不被支持 7log_bin=master-binlog #开启日志 8//以上是GTID的基础配置,必须存在,其他配置可以根据需要自行设置 9 10//在从库上的配置: 11#GTID: 12server_id=5 #从库id,比主库的大 13gtid_mode=on #开启gtid模式 14enforce_gtid_consistency=on #强制gtid一致性,开启后对于特定create table不被支持 15log_bin=slave-binlog #开启日志 16//与主库一样,这四项是必须项,其他的可以自行添加

4.1启用GTID的主从

1//主库: 2//创建复制用户,并开启权限 3 4mysql> GRANT REPLICATION SLAVE ON *.* TO repl@192.168.163.130 IDENTIFIED BY "cljhfy"; 5Query OK, 0 rows affected, 1 warning (0.00 sec) 6 7// 可以指向单个从库的IP也可以指定从库群的网段, 8 9 10 11//从库: 12mysql> CHANGE MASTER TO MASTER_HOST='192.168.163.128',MASTER_USER='repl',MASTER_PASSWORD='cljhfy',MASTER_AUTO_POSITION=1; 13Query OK, 0 rows affected, 2 warnings (0.01 sec) 14mysql> start slave; 15Query OK, 0 rows affected (0.01 sec) 16 17mysql> show slave status \G ###可以看到复制工作已经开始且正常 18*************************** 1. row *************************** 19 Slave_IO_State: Waiting for master to send event 20 Master_Host: 192.168.163.128 21 Master_User: repl 22 Master_Port: 3306 23 Connect_Retry: 60 24 Master_Log_File: master-binlog.000001 25 Read_Master_Log_Pos: 503939 26 Relay_Log_File: slave-relay-log.000002 27 Relay_Log_Pos: 863 28 Relay_Master_Log_File: master-binlog.000001 29 Slave_IO_Running: Yes //此两处是Yes表示GTID已启动 30 Slave_SQL_Running: Yes //如果有No,表示有疏漏。 31 ... 32 332、已运行经典复制mysql服务器转向GTID复制 34a、按本文第四点描述配置参数文件; 35b、所有服务器设置global.read_only参数,等待主从服务器同步完毕; 36 mysql> SET @@global.read_only = ON; 37c、依次重启主从服务器; 38d、使用change master 更新主从配置; 39mysql> CHANGE MASTER TO MASTER_HOST='192.168.163.128',MASTER_USER='repl',MASTER_PASSWORD='cljhfy',MASTER_AUTO_POSITION=1; 40e、从库开启复制 41 mysql> START SLAVE; 42f、验证主从复制 43

4.2验证

1//主库初始数据 2mysql> show tables; 3+------------------+ 4| Tables_in_cljhfy | 5+------------------+ 6| student | 7+------------------+ 81 row in set (0.00 sec) 9 10 11 12//从库初始数据 13 14mysql> show tables; 15+------------------+ 16| Tables_in_cljhfy | 17+------------------+ 18| student | 19+------------------+ 201 row in set (0.00 sec) 21 22//在主库插入数据 23mysql> insert student(name,age) values('jerry',35),('tom',66); 24Query OK, 2 rows affected (0.02 sec) 25Records: 2 Duplicates: 0 Warnings: 0 26 27mysql> select * from student; 28+----+-------+------+ 29| id | name | age | 30+----+-------+------+ 31| 1 | jerry | 35 | 32| 2 | tom | 66 | 33+----+-------+------+ 342 rows in set (0.00 sec) 35 36//在从库验证 37 38mysql> select * from student; 39+----+-------+------+ 40| id | name | age | 41+----+-------+------+ 42| 1 | jerry | 35 | 43| 2 | tom | 66 | 44+----+-------+------+ 452 rows in set (0.00 sec)
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移