February 7, 2017
关于InnoDB表的page利用率和optimize table
"上一篇我们介绍了ibd_used这个工具,我们用来量化看表数据文件的page使用率。这里用来说明optimize table这个命令的问题和优化。\n实例准备\n建一个这样的表\nCREATE TABLE tb (\nseq_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,\na varchar(32) DEFAULT NULL,\nb varchar(32) DEFAULT NULL,\nc varchar(32) DEFAULT NULL,\nd char(255) DEFAULT NULL,\nPrimary key (seq_id),\nKEY a (a),\nKEY bc (b,c),\nKEY cb (c,b)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n执行语句为“insert into tb(a,b,c) values(randstr, randstr, randstr);” randstr是客户端程序生成的长度30字节的随机字符串。30个线程并发,每个线程插入1w条记录。\n等待更新完成后(包括purge完成,从系统 …"
February 7, 2017
关于 InnoDB 索引长度限制的 tips
"有同学问到InnoDB的索引长度问题,简单说几个tips。\n关于3072\n大家经常碰到InnoDB单列索引长度不能超过767bytes,实际上联合索引还有一个限制是3072。\n[][1]\n可以看到,由于每个字段占用255*3, 因此这个索引的大小是3825(255*3*5)\u0026gt;3072,报错。\n为什么3072\n我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。\n所以一个记录最多不能超过8k。 又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,pk和某个二级索引都达到这个限制)。 由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。\n单列索引限制\n上面有提到单列索引限制767,起因是256×3-1。这个3是字符最大占用空间(utf8)。但是在5.6以后,开始支持4个字节的uutf8。255×4\u0026gt;767, 于是增加了一个参数叫做 innodb_large_prefix。\n这个参数默认值是OFF。当改为ON时, …"
February 6, 2017
MySQL数据库InnoDB存储引擎Log漫游系列
"MySQL数据库InnoDB存储引擎Log漫游(1) MySQL数据库InnoDB存储引擎Log漫游(2) MySQL数据库InnoDB存储引擎Log漫游(3) 以上转自 宋利兵 老师的公众号“MySQL代码研究”"
January 30, 2017
传统复制与 GTID复制的切换知识点
"在5.6以后,可以通过命令动态修改.\n注意有些命令是需要主从都要执行,有些命令是只在slave执行。\ngtid_mode 的几种状态值说明: OFF: 不产生 GTID, 基于 binlog+position,也不能接受GTID的日志。默认值 OFF_PERMISSIVE: 不生产 GTID,但作为slave可以识别GTID事务也可以识别非GTID事务 ON_PERMISSIVE: 产生GTID,slave可以处理GTID事务和非GTID事务 ON: 产生GTID事务,slave只接受GTID事务\n实验一:将传统复制切换到GTID复制\n启用GTID:\nset @@global.enforce_gtid_consitency=warn; set @@global.enforce_gtid_consistency=on; set @@global.gtid_mode=OFF_PERMISSIVE; #不产生gtid,但可以处理gtid set @@global.gtid_mode=ON_PERMISSIVE; #产生gtid,也可以处理gtid show status like …"
January 28, 2017
MySQL 5.7中的半同步复制
"在5.7下半同步是以插件的形式出现的,所以在启用半同步前要先安装半同步插件 semisync_master.so\nOn the master:\nINSTALL PLUGIN rpl_remi_sync_master SONAME \u0026#39;semisync_master.so\u0026#39;; On slave slave:\nINSTALL PLUGIN rpl_semi_sync_slave SONAME \u0026#39;semisync_slave.so\u0026#39;; 在my.cnf里配置,要写在mysqld段\nmaster:\n[mysqld] repl_semi_sync_master_enable=1 repl_semi_sync_master_timeout=1000 #1 second slave:\n[mysqld] repl_semi_sync_slave_enable=1 卸载插件:\nuninstall plugin rpl_semi_sync_master; # master uninstall plugin rpl_semi_sync_slave; # slave 在主上设 …"
January 28, 2017
MySQL5.7下多源复制知识要点(原创)
"架构为两主一从,两主为同一台服务器的多实例,安装方法请参考上篇文章 http://blog.haohtml.com/archives/17300。\n主master1 IP: 192.168.1.116 PORT: 3306 主master2 IP: 192.168.1.116 PORT: 3307 从slave IP: 192.168.1.200 PORT: 3306\n两主为全新安装。如果以前安装过的话,可以将原来的数据库删除掉,再执行 reset master 即可。(否则需要将两个主的想着库表使用 mysqldump到从中) my.cnf 配置\n[master1 3306] [client] port=3306 socket=/data/mysql/mysql3306/tmp/mysql.sock [mysqld] basedir=/data/mysql/mysql3306 datadir=/data/mysql/mysql3306/datadir #socket=/var/lib/mysql/mysql.sock …"
January 20, 2017
Innodb中Page结构
"一个存放记录(row)的page,由page header、page trailer、page body组成。如下图:2 page的完整结构\npage的结构详情参看如下:\nfrom: http://forge.mysql.com/wiki/MySQL_Internals_InnoDB#InnoDB_Page_Structure High-Altitude Picture\nThe chart below shows the three parts of a physical record.\nName****Size Field Start Offsets\n(F1) or (F2) bytes\nExtra Bytes\n6 bytes\nField Contents\ndepends on content\nLegend: The letter ‘F’ stands for ‘Number Of Fields’.\nThe meaning of the parts is as follows:\nThe FIELD START OFFSETS is a list of numbers …"