一、mysql 5.6 新特性 mysql 5.6 主要在查询性能的优化、innodb改进以支持高吞吐量的事务、nosql风格的api、分区功能的改进、数据复制的改进,增加 performance_schema 库以获得数据库性能信息等。 1、查询性能优化 优化 where 语句改进索引条件的处理性能,
一、mysql 5.6 新特性
mysql 5.6 主要在查询性能的优化、innodb改进以支持高吞吐量的事务、nosql风格的api、分区功能的改进、数据复制的改进,增加 performance_schema 库以获得数据库性能信息等。
1、查询性能优化
优化 where 语句改进索引条件的处理性能,multi-range read:通过随机数据访问来提升 ssd 上的数据读取速度,优化文件排序:对一些组合了order by non_indexed_column和 limit x的sql语句,该特性将大大加速此类语句的执行速度。
2、innodb 的改进
mysql 5.6 完全集成 innodb 作为默认的存储引擎。同时 5.6 版本在使用 innodb 上的很多细节做了改进,详情请看这里。
3、提供 nosql 风格的 api
该功能主要适用于将 mysql 来作为nosql 使用,而 mysql 使用的是 memcached兼容的 api。通过该接口程序访问数据可直达 innodb 存储引擎,而无需通过 mysql 对 sql 的转换过程,大大提升了数据访问的性能。
4、分区的改进
显式分区数据查询,例如:
select * from employees partition (p0, p2);
delete from employees partition (p0, p1);
update employees partition (p0) set store_id = 2 where fname = 'jill';
select e.id, s.city from employees as e join stores partition (p1) as s ...;
分区数据的导入导出,此功能用于快速的将某个表迁移到分区上:alter table eexchange partition p0 with table e2;
5、复制功能的改进
支持多线程复制,事实上是针对每个database开启相应的独立线程。即每个库有一个单独的(sql thread)如果线上业务中,只有一个database或者绝大多数压力集中在个别database的话,多线程并发复制特性就没有意义了。
支持启用gtid,对运维人员来说应该是一件令人高兴的事情,在配置主从复制,传统的方式里,你需要找到binlog和pos点,然后change master to指向,而不是很有经验的运维,往往会将其找错,造成主从同步复制报错,在mysql5.6里,无须再知道binlog和pos点,需要知道master的ip、端口,账号密码即可,因为同步复制是自动的,mysql通过内部机制gtid自动找点同步。
6、大大增强 performance_schema 数据库
降低了数据库开销、表io的信息汇集和监控、表锁信息汇集和监控、会话和用户级别的监控、全局性能信息汇总。
二、gitd 详解
mysql 5.6 的新特性之一,是加入了全局事务 id (gtid) 来强化数据库的主备一致性,故障恢复,以及容错能力。
1、什么是gtid?
官方文档:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html在这篇文档里,我们可以知道全局事务 id 的官方定义是:gtid = source_id:transaction_id
mysql 5.6 中,每一个 gtid 代表一个数据库事务。在上面的定义中,source_id 表示执行事务的主库 uuid(server_uuid),transaction_id 是一个从 1 开始的自增计数,表示在这个主库上执行的第 n 个事务。mysql 会保证事务与 gtid 之间的 1 : 1 映射。
例如,下面就是一个 gtid:3e11fa47-71ca-11e1-9e33-c80aa9429562:50表示在以 3e11fa47-71ca-11e1-9e33-c80aa9429562 为唯一标示的 mysql 实例上执行的第 50 个数据库事务。很容易理解,mysql只要保证每台数据库的 server_uuid 全局唯一,以及每台数据库生成的 transaction_id 自身唯一,就能保证 gtid 的全局唯一性。
2、什么是server_uuid?
mysql 5.6 用 128 位的server_uuid 代替了原本的 32 位 server_id 的大部分功能。原因很简单,server_id 依赖于 my.cnf 的手工配置,有可能产生冲突—— 而自动产生 128 位 uuid 的算法可以保证所有的mysql uuid 都不会冲突。
在首次启动时 mysql 会调用generate_server_uuid() 自动生成一个 server_uuid,并且保存到 auto.cnf 文件—— 这个文件目前存在的唯一目的就是保存 server_uuid。
650) this.width=650; src=http://www.68idc.cn/help/uploads/allimg/151111/12110tu5-0.jpg title=01.jpg alt=wkiol1u4rqlte2vhaanhhstaiaw568.jpg>
在 mysql 再次启动时会读取auto.cnf 文件,继续使用上次生成的 server_uuid。使用 show 命令可以查看 mysql 实例当前使用的 server_uuid?:show global variables like 'server_uuid';它是一个 mysql 5.6 global variables,文档链接在这里:server_uuid? 全局唯一的 server_uuid 的一个好处是:可以解决由 server_id 配置冲突带来的mysql 主备复制的异常终止(bug #33815?)
在mysql 5.6,slave 向 master 申请 binlog 时,会首先发送自己的server_uuid,master 用 slave 发送的 server_uuid 代替 server_id (mysql 5.6 之前的方式)作为 kill_zombie_dump_threads 的参数,终止冲突或者僵死的binlog_dump 线程。
三、多线程复制基于库
mysql 5.6之前的版本,同步复制是单线程的,队列的,只能一个一个执行,在5.6里,可以做到多个库之间的多线程复制,例如数据库里,存放着用户表,商品表,价格表,订单表,那么将每个业务表单独放在一个库里,这时就可以做到多线程复制,但一个库里的表,多线程复制是无效的。
注:每个数据库仅能使用一个线程,复制涉及到多个数据库时多线程复制才有意义。
四、mysql 5.6 复制管理工具
官方下载地址:http://dev.mysql.com/downloads/tools/utilities/#downloads
注:这里只简单的介绍一下,具体的工具使用,不具体说明,使用方法 命令—help
mysqlreplicate 快速启动复制
mysqlrplcheck 快速检查复制环境
mysqlrplshow 显示复制拓扑
mysqlfailover 故障转移
mysqlrpladmim 管理工具
五、具体配置过程
1、环境准备
操作系统
centos 6.6 x86_64
软件版本
mysql 5.6.22
2、实验拓扑
650) this.width=650; src=http://www.68idc.cn/help/uploads/allimg/151111/12110v133-1.jpg title=2.jpg alt=wkiom1u4sd6x_hu_aaf6yes4gca751.jpg>
3、 关闭防火墙与selinux
# serverice iptables stop# chkconfig iptables off# sed -i ‘s/%selinux=enforcing%selinux=disabled%’/etc/sysconfig/selinux# getenforce 0
4、 配置mysql主从复制
a、配置选项说明
要在mysql 5.6中使用复制功能,其服务配置段[mysqld]中于少应该定义如下选项:
binlog-format:二进制日志的格式,有row、statement和mixed几种类型;需要注意的是:当设置隔离级别为read-commited必须设置二进制日志格式为row,现在mysql官方认为statement这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致;
log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用于启动gtid及满足附属的其它需求;
master-info-repository和relay-log-info-repository:启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能;
sync-master-info:启用之可确保无信息丢失;
slave-paralles-workers:设定从服务器的sql线程数;0表示关闭多线程复制功能;
binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:启用复制有关的所有校验功能;
binlog-rows-query-log-events:启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度;
log-bin:启用二进制日志,这是保证复制功能的基本前提;
server-id:同一个复制拓扑中的所有服务器的id号必须惟一。
b、配置主服务器master
# vim /usr/my.cnf
在 [mysqld] 加入如下:
skip-external-lockingkey_buffer_size= 256mmax_allowed_packet= 1mtable_open_cache= 256sort_buffer_size= 1mread_buffer_size= 1mread_rnd_buffer_size= 4mmyisam_sort_buffer_size= 64mthread_cache_size= 8query_cache_size=16mthread_concurrency= 2log-bin=mysql-bininnodb_file_per_table= 1 binlog-format=row //设置二进制日志格式log-slave-updates=true//是否记录从服务器同步数据动作gtid-mode=on //启用gtid模式enforce-gtid-consistency=true//是否强制gtid的一致性master-info-repository=table //master信息的记录位置relay-log-info-repository=table //中继日志信息的记录位置sync-master-info=1slave-parallel-workers=2 //设置从服务器复制线程数binlog-checksum=crc32//设置binlog校验算法(循环冗余校验码)master-verify-checksum=1 //设置主服务器是否校验slave-sql-verify-checksum=1//设置从服务器是否校验binlog-rows-query-log_events=1server-id = 10report-port=3306report-host=192.168.100.90 //设置报告给哪台服务器,一般设置为本机的主机名。
# service mysql restart //重启mysql服务
c、在slave服务器上安装mysql与在master服务器上安装方法相同,这里不在介绍,而在slave服务器上安装mysql有两个参数与master服务器不同。如下:
server-id=11 report-host=192.168.100.91
# service mysql restart
d、在master服务器上为slave创建复制用户并测试连接
mysql> grant replication slave,replication client on *.*to 'replication'@'192.168.%.%' identified by 'passwd';mysql> flush privileges
;
e、启动slave复制线程
在从服务器上进行操作
mysql> changemaster to master_host='192.168.100.90',master_user='replication',master_password='passwd',master_auto_position=1;mysql> start slave;mysql> show status\g;
650) this.width=650; src=http://www.68idc.cn/help/uploads/allimg/151111/12110qg3-2.jpg title=1.jpg alt=wkiom1u4x5rx1stbaap6lughtd4909.jpg>
好,现在可以在主上面进行创建数据库。看看从的是否有数据。。。