前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL5.6和5.5的一些区别地方

MySQL5.6和5.5的一些区别地方

作者头像
保持热爱奔赴山海
发布2019-09-18 11:12:54
1.3K0
发布2019-09-18 11:12:54
举报
文章被收录于专栏:饮水机管理员饮水机管理员

更详细的可以参考:http://www.tuicool.com/articles/rua2emE  和 《MySQL管理之道》

5.6的改进地方:

1、在5.5和之前的版本mysql中,主从配置的话,要在从节点配置change master to 指明binlog和POS。而在5.6及以后

,这2个参数就可以省略掉。MySQL可以通过内部的GTID机制自动找点同步。我们只要指明master的IP、用户名和密码、端口即可。

2、5.6支持多线程复制

在5.5里,同步复制是单线程、队列的,只能一个的执行。而在5.6里,多个库可以同时进行复制(注意:同一个库内仍是不能多线程了)。

5.6里会涉及到UUID这个参数

MySQL [(none)]>show variables like '%uuid%';

+---------------+--------------------------------------+

| Variable_name | Value                                |

+---------------+--------------------------------------+

| server_uuid   | ca910cf0-3aec-11e6-9319-b888e3dcfeb8 |

+---------------+--------------------------------------+

1 row in set (0.00 sec)

注意:在mysql初次启动时候会自动生成这个UIID,写入到auto.cnf中,官方不建议修改这个值。并且server_uuid和GTID有密切关系。

GTID:全局事务标识符

     使用这个功能时,每次事务提交都会在binlog里生成唯一的标识符,它由UUID和事务ID组成。首次提交的事务ID为1,以后依次递增。

     开启GTID时,slave做同步复制时,无需找到binlog日志和POS点。直接

GTID写法:

change master to 

     master_HOST=192.168.2.100,

     master_PORT=2206,

     master_USER=repluser,

     master_PASSWORD='123456',

     master_AUTO_POSITION=1;

另外传统的写法:

CHANGE MASTER TO

  MASTER_HOST='master2.mycompany.com',

  MASTER_USER='replication',

  MASTER_PASSWORD='bigs3cret',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='master2-bin.001',

  MASTER_LOG_POS=4,

  MASTER_CONNECT_RETRY=10;

如果之前启用过了GTID,那么就不能不能再使用传统的change master to的方式了,会报错,如下:

 ERROR 1776 (HY000): Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active.

wKiom1d03SWgvd1KAAA7n1_WA44465.png
wKiom1d03SWgvd1KAAA7n1_WA44465.png

GTID的工作流程:

1、在master上提交一个事务,并写入到binlog

2、binlog发送到slave上,slave接收并写入relay log,slave读取到这个GTID,并设置gtid_next的值。例如:

     set @@SESSION.GTID_NEXT='B0869D03-D332223-35454:3';

     然后告诉slave接下来的事务必须使用GTID,并写入到自己的binlog中。

3、slave检查并确认这个gtid没有被使用,如果没有被使用,那么开始执行这个事务并写入到它自己的binlog里。

4、由于gtid_next的值不是空的,slave不会尝试去生成一个新的gtid,而是通过主从同步来获的GTID。

     另外,要使用GTID方式进行主从同步的话,还要在my.cnf里面加上如下的配置:

     [mysqld]

     log-bin=mysql-bin

     binlog_format = mixed

     log_slave_updates = ON

     gtid-mode = ON

     enforce_gtid_consistency = ON

     然后在master上导出mysqldump -uroot -proot -q --single-transaction -R -E --triggers -B hellodb > /root/hello.sql

     在slave上导入mysql -uroot -proot < /root/hello.sql

     在slave上配置change master to指向(如下6行代码):

change master to 

     master_HOST=192.168.2.100,

     master_PORT=3306,

     master_USER=repluser,

     master_PASSWORD='123456',

     master_AUTO_POSITION=1;

GTID的局限性:

1、GTID的复制是基于事务的,不支持MyISAM,这可能导致多个GTID分配各同一个事务。

2、对create table ... select语句不支持。因为该语句会被拆分成create table和insert 两个事务,并且如果这两个事务被分配了同一个GTID,将会导致insert被备库忽略掉。

3、不支持创建、删除临时表

多线程复制演示:

在slave上执行下面几条命令:

> stop slave;

> set global  slave_parallel_workers = 4;

> start slave;

> show full processlist;可以看到有4个线程 Waiting for an event from Coordinator

如果此时在主上有大量的insert操作,可以在slave上执行> select * from mysql.slave_worker_info\G 应该可以查看到worker_id在不断变化,说明是多线程复制在起作用了。

说明:slave_parallel_workers 即可实现在slave上多线程并发复制。不过,它只能支持一个实例下多个 database 间的并发复制,并不能真正做到多表并发复制。因此在较大并发负载时,slave还是没有办法及时追上master,需要想办法进行优化(比如:尽量将一个库中的表按照业务逻辑拆分成多个库来保存,这样在写操作时候,slave就能开启多线程复制,减少了同步的时延。)

此外,建议修改my.cnf,增加2行(默认这个info_file是文件的,不写入数据库的)

relay_log_info_repository = table

master_info_repository = table

单单这样还不够,默认这2张表是MyISAM的,不安全还要转换下

> alter table slave_master_info engine innodb;

> alter table slave_relay_log_info engine innodb;

> alter table slave_worker_info engine innodb;

这样的话,可防止表损坏,在损坏后可以自行修复。

GTID模式下的主从复制,同步时候报错不能跳过的解决方法:

假如在slave上看到同步报错“从节点的XXX键不存在”

我们可以尝试使用5.5上的老方法

> stop slave;

> set global sql_slave_skip_counter=1

> start slave;

执行的时候会发现报错了,提示如下:

wKioL1d03TiDgnIaAAAhwTF6_W4390.png
wKioL1d03TiDgnIaAAAhwTF6_W4390.png

可以看出运行在GTID模式下,不支持sql_slave_skip_counter这种方式跳过的。

那么可以如下方法来跳过:

> show  slave status\G查看如下2行的信息:

  Retrieved_Gtid_Set: ca910cf0-3aec-11e6-9319-b888e3dcfeb8:1-2

  Executed_Gtid_Set: ca910cf0-3aec-11e6-9319-b888e3dcfeb8:1

第一行表示收到的事务,第二行表示已经执行完的事务。也就是说执行到Retrieved_Gtid_Set时候发生错误了。

因此,我们直接单单跳过这个事务即可。

> stop slave;

> set GTID_NEXT='ca910cf0-3aec-11e6-9319-b888e3dcfeb8:2';     就是这种写法,不要加什么1-2这些玩意

> begin;

> commit;

> set GTID_NEXT="AUTOMATIC";      #把gtid_next设置回来

> start slave;

> show slave status\G   验证下是否IO/SQL都是YES状态。

GTID模式转换为传统模式的方法及注意点:

要转换成传统模式,需要在my.cnf里面注释掉下面2行:

# gtid-mode=ON

# enforce_gtid_consistency = ON

然后重启MySQL。

登进mysql,执行类似如下命令:

> stop slave;

> CHANGE MASTER TO

     MASTER_HOST='master2.mycompany.com',

      MASTER_USER='replication',

     MASTER_PASSWORD='bigs3cret',

     MASTER_PORT=3306,

     MASTER_LOG_FILE='master2-bin.001',

     MASTER_LOG_POS=4,

     MASTER_CONNECT_RETRY=10;

     结果报错了,如下图:

wKioL1d03UvA1q_VAAAwoKwkQzY134.png
wKioL1d03UvA1q_VAAAwoKwkQzY134.png

解决方法:

> change master to MASTER_AUTO_POSITION=0;       # 关闭这个参数,这个参数是GTID复制才用到的。

> CHANGE MASTER TO

        MASTER_HOST = '192.168.2.11',

        MASTER_USER='repluser',

        MASTER_PASSWORD='123456',

        MASTER_PORT=3306,

        MASTER_LOG_FILE='mysql-bin.000012',

        MASTER_LOG_POS=500,

        MASTER_CONNECT_RETRY=10;

> start slave;

> show slave status\G 验证下是否IO/SQL都是YES状态。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档