代码改变世界

[置顶]Inception开源公告

2015-08-28 13:01 by 竹 石, 2302 阅读, 1 推荐, 收藏, 编辑
摘要:关于InceptionMySQL语句的审核,在业界都已经基本被认同了,实际上也是对MySQL语句写法的统一化,标准化,而之前的人工审核,针对标准这个问题其实是很吃力的,标准越多,DBA越累,开发也越累。那么在这个都追求自动化运维的时代,审核也必须要跟上步伐,因此Inception诞生了。而Incep... 阅读全文

mysql源码:关于innodb中两次写的探索

2014-02-18 09:50 by 竹 石, 2849 阅读, 4 推荐, 收藏, 编辑
摘要:两次写可以说是在Innodb中很独特的一个功能点,而关于它的说明或者解释非常少,至于它存在的原因更没有多少文章来说,所以我打算专门对它做一次说明。首先说明一下为什么会有两次写这个东西:因为innodb中的日志是逻辑的,所谓逻辑就是比如当插入一条记录时,它可能会导致在某一个页面(这条记录最终被插入的位置)的多个偏移位置写入某个长度的值,比如页头的记录数,槽数,页尾槽数据,页中的记录值等等,这些本是一些物理操作,而innodb为了节约日志量及其它一些原因,设计为逻辑处理的方式,那就是它会在一个页面的基础上,把一条记录插入,那么在日志记录中记录的内容为表空间号、页面号、记录的各个列的值等等,在内部转 阅读全文

Percona Xtradb Cluster的设计与实现

2014-02-10 17:48 by 竹 石, 6673 阅读, 3 推荐, 收藏, 编辑
摘要:Percona Xtradb Cluster的设计与实现Percona Xtradb Cluster的实现是在原mysql代码上通过Galera包将不同的mysql实例连接起来,实现了multi-master的集群架构,如下图所示:上图中有三个实例,组成了一个集群,而这三个节点与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,这种一般称为multi-master架构,当有客户端要写入或者读取数据时,随便连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构。一般的使用方法是,在这个集群上面,再搭 阅读全文

mysql中删除同一行会经常出现死锁?太可怕了

2014-01-24 11:06 by 竹 石, 12743 阅读, 5 推荐, 收藏, 编辑
摘要:之前有一个同事问到我,为什么多个线程同时去做删除同一行数据的操作,老是报死锁,在线上已经出现好多次了,我问了他几个问题:1. 是不是在一个事务中做了好几件事情? 答:不是,只做一个删除操作,自动提交2. 有多少个线程在做删除? 答:差不多10个3. 是什么隔离级别? 答:可重复读当时觉得不可思议,按说自动提交的话行锁,如果已经有事务加锁了,则会等待,等提交之后再去做,发现已经删除了,就会返回,删除0条,为什么会死锁?但事情已经出了,必须研究一下,不然终究是心头之苦啊。然后想到既然线上有这么简单的操作就可以死锁,那么应该写个简单的程序就可以重现,然后同事李润杰兄弟咔嚓咔嚓没多时就给我了,在... 阅读全文

Mysql查询阻塞初探

2013-12-04 19:28 by 竹 石, 12115 阅读, 2 推荐, 收藏, 编辑
摘要:第一次值班,报警打电话给我说,数据库复制延时一个多小时,那个时候是半夜啊,但我还是很清醒的起来,开机、vpn、登录、show processlist,结果发现情况是这样的:红线框表示的是当前每个线程已经执行、等待的时间,最长的3962其实已经超过一个小时,再看其它的操作都是查询,另外还有一个线程在做flush table操作从每个线程的状态可以看出,第一个线程为Copying to tmp table,可以看出这个线程正在做操作,这是一个查询操作。现在的问题是数据库复制延时,那么在这个图片上面还有一个线程是在做插入操作,状态为Waiting for tables flush,时间也是3900多 阅读全文

mysql Alter table设置default的问题,是bug么?

2013-10-24 16:41 by 竹 石, 6589 阅读, 0 推荐, 收藏, 编辑
摘要:不用不知道,用了没用?昨天在线上创建了一个表,其中有两个列是timestamp类型的,创建语句假设是这样的:create table timetest(id int, createtimetimestamp,updatetimetimestamp);但是在创建完成之后,显示一下它的创建语句show create table timetest;CREATE TABLE `timetest` (`id` int(11) DEFAULT NULL,`createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_T 阅读全文

mysql的又一个让人捉摸不透的bug?

2013-09-29 16:58 by 竹 石, 8530 阅读, 1 推荐, 收藏, 编辑
摘要:这次就不说很多没有写博客了,因为前几天已经写过了。\^o^/昨天我们刚讨论了关于自动化运维工作的实现方式,如果批量执行,中间出错怎么办?突然有人提出mysql支持--force,可以跳过出错继续执行。那么我就想看看它这个功能是什么样子的,看看我能不能借鉴一下。然后我就在一个测试机器上写入如下命令:mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force -e "insert into myinfo (1,'asdf');insert into myinfo values(1,'asdf');然后报错: 阅读全文

innodb compressed 表碰到的问题,BUG么?

2013-09-25 12:41 by 竹 石, 1860 阅读, 0 推荐, 收藏, 编辑
摘要:这个,不知道是innodb的bug,还是故意留的后门?这个或许只能求《走进科学》解答了。。。 阅读全文

MySQL源码:深度解析Innodb记录格式源码

2013-03-04 17:43 by 竹 石, 2913 阅读, 2 推荐, 收藏, 编辑
摘要:很长时间又不写东西了,之前已经看过了innodb格式,但现在想研究一下其它方面的东西,突然发现这个又忘了,索性再看看把它写下来。可以通过一个最普遍的插入操作来跟踪Innodb的记录格式,因为在插入时,系统得到的是公共的mysql记录格式record,现在它没有涉及到任何的存储引擎,那么这里不管当前这个表对应的存储引擎是什么,记录格式是一样的,对于插入,mysql函数对应的是ha_write_row,具体到Innodb存储引擎,实际调用的函数是ha_innobase::write_row函数,那么在这里,Innodb首先会将接收到的record记录转换为它自己的一个元组tuple,这其实是与re 阅读全文

MySQL源码:Innodb两次写与多实例buffer pool的一个BUG的说明与解决

2012-12-05 14:06 by 竹 石, 2252 阅读, 2 推荐, 收藏, 编辑
摘要:之前发了一条微博称,那天是个好日子,一直困扰我的两个问题那天一次性解决了,一个是由于我理解不够深,不是问题被误认为是问题,最后由老大指点解决(在http://www.cnblogs.com/bamboos/archive/2012/05/15/2502259.html中的一个评论有说明);后面一个问题还真是问题,是由于INNODB的一个BUG导致,找了好几天才终于找到原因,现在就叙述一下这个问题的问题。问题的经过是这样的,我实现了一个MYSQL多线程复制的patch,是按照表名来划分的,相同的表会分到同一个线程中做,实现的是BINLOG_FORMAT为STATEMENT的,那么这样就实现了并发 阅读全文