您好,欢迎访问一九零五行业门户网

mysql中5.6和5.5有什么区别

区别:1、在5.5版本中主从配置不能省略binlog和pos两个参数,而在5.6版本中这两个参数可以省略;2、在5.5版本中不支持多线程复制,同步复制是单线程、队列的,而在5.6版本中支持多线程复制。
本教程操作环境:windows10系统、mysql8.0.22版本、dell g3电脑。
mysql中5.6和5.5有什么区别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 tomaster_host=192.168.2.100,master_port=2206,master_user=repluser,master_password='123456',master_auto_position=1;另外传统的写法:change master tomaster_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.
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-binbinlog_format = mixedlog_slave_updates = ongtid-mode = onenforce_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 tomaster_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个线程 waitingfor an eventfromcoordinator
如果此时在主上有大量的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 = tablemaster_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;
执行的时候会发现报错了,提示如下:
可以看出运行在gtid模式下,不支持sql_slave_skip_counter这种方式跳过的。
那么可以如下方法来跳过:
> show slave status\g查看如下2行的信息:
retrieved_gtid_set: ca910cf0-3aec-11e6-9319-b888e3dcfeb8:1-2executed_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 tomaster_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;
结果报错了,如下图:
解决方法:
> change master to master_auto_position=0; # 关闭这个参数,这个参数是gtid复制才用到的。> change master tomaster_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状态。
推荐学习:mysql视频教程
以上就是mysql中5.6和5.5有什么区别的详细内容。
其它类似信息

推荐信息