摘要:
关于InceptionMySQL语句的审核,在业界都已经基本被认同了,实际上也是对MySQL语句写法的统一化,标准化,而之前的人工审核,针对标准这个问题其实是很吃力的,标准越多,DBA越累,开发也越累。那么在这个都追求自动化运维的时代,审核也必须要跟上步伐,因此Inception诞生了。而Incep... 阅读全文
随笔分类 - DBMS
mysql源码:关于innodb中两次写的探索
2014-02-18 09:50 by 竹 石, 2884 阅读, 收藏,
摘要:
两次写可以说是在Innodb中很独特的一个功能点,而关于它的说明或者解释非常少,至于它存在的原因更没有多少文章来说,所以我打算专门对它做一次说明。首先说明一下为什么会有两次写这个东西:因为innodb中的日志是逻辑的,所谓逻辑就是比如当插入一条记录时,它可能会导致在某一个页面(这条记录最终被插入的位置)的多个偏移位置写入某个长度的值,比如页头的记录数,槽数,页尾槽数据,页中的记录值等等,这些本是一些物理操作,而innodb为了节约日志量及其它一些原因,设计为逻辑处理的方式,那就是它会在一个页面的基础上,把一条记录插入,那么在日志记录中记录的内容为表空间号、页面号、记录的各个列的值等等,在内部转 阅读全文
Percona Xtradb Cluster的设计与实现
2014-02-10 17:48 by 竹 石, 6753 阅读, 收藏,
摘要:
Percona Xtradb Cluster的设计与实现Percona Xtradb Cluster的实现是在原mysql代码上通过Galera包将不同的mysql实例连接起来,实现了multi-master的集群架构,如下图所示:上图中有三个实例,组成了一个集群,而这三个节点与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,这种一般称为multi-master架构,当有客户端要写入或者读取数据时,随便连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构。一般的使用方法是,在这个集群上面,再搭 阅读全文
mysql中删除同一行会经常出现死锁?太可怕了
2014-01-24 11:06 by 竹 石, 13194 阅读, 收藏,
摘要:
之前有一个同事问到我,为什么多个线程同时去做删除同一行数据的操作,老是报死锁,在线上已经出现好多次了,我问了他几个问题:1. 是不是在一个事务中做了好几件事情? 答:不是,只做一个删除操作,自动提交2. 有多少个线程在做删除? 答:差不多10个3. 是什么隔离级别? 答:可重复读当时觉得不可思议,按说自动提交的话行锁,如果已经有事务加锁了,则会等待,等提交之后再去做,发现已经删除了,就会返回,删除0条,为什么会死锁?但事情已经出了,必须研究一下,不然终究是心头之苦啊。然后想到既然线上有这么简单的操作就可以死锁,那么应该写个简单的程序就可以重现,然后同事李润杰兄弟咔嚓咔嚓没多时就给我了,在... 阅读全文
Mysql查询阻塞初探
2013-12-04 19:28 by 竹 石, 12237 阅读, 收藏,
摘要:
第一次值班,报警打电话给我说,数据库复制延时一个多小时,那个时候是半夜啊,但我还是很清醒的起来,开机、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 竹 石, 6726 阅读, 收藏,
摘要:
不用不知道,用了没用?昨天在线上创建了一个表,其中有两个列是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 竹 石, 8561 阅读, 收藏,
摘要:
这次就不说很多没有写博客了,因为前几天已经写过了。\^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 竹 石, 1941 阅读, 收藏,
摘要:
这个,不知道是innodb的bug,还是故意留的后门?这个或许只能求《走进科学》解答了。。。 阅读全文
MySQL源码:深度解析Innodb记录格式源码
2013-03-04 17:43 by 竹 石, 3016 阅读, 收藏,
摘要:
很长时间又不写东西了,之前已经看过了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 竹 石, 2303 阅读, 收藏,
摘要:
之前发了一条微博称,那天是个好日子,一直困扰我的两个问题那天一次性解决了,一个是由于我理解不够深,不是问题被误认为是问题,最后由老大指点解决(在http://www.cnblogs.com/bamboos/archive/2012/05/15/2502259.html中的一个评论有说明);后面一个问题还真是问题,是由于INNODB的一个BUG导致,找了好几天才终于找到原因,现在就叙述一下这个问题的问题。问题的经过是这样的,我实现了一个MYSQL多线程复制的patch,是按照表名来划分的,相同的表会分到同一个线程中做,实现的是BINLOG_FORMAT为STATEMENT的,那么这样就实现了并发 阅读全文
MySQL源码:为什么INNODB数据页面中最少存储2条记录?
2012-11-13 17:24 by 竹 石, 3936 阅读, 收藏,
摘要:
写在前面:我一直认为数据库中已经规定,一个页面中至少要存储2条记录,但是前几天碰到一个问题:为什么INNODB数据页面中最少存储2条记录?一下子把我问住了,知道是这样,但从没有问过自己这是为什么,所以我一直想这个问题,现在刨根问底,终于知道为什么了,下面就把这个问题的原因说一下吧。在INNODB中,底层数据的存储是通过B+树实现的,一个页面的大小一般设置为16K,不同页面之间通过父子、兄弟挂链,形成B+树结构。为了说明为什么一个数据页面至少要存储2条记录,下面就先简单叙述一下B树的一个记录插入过程,下面图示中的方框用来表示一个页面,左边和右边的小方框表示最小虚记录及最大虚记录,下面是表示内节点 阅读全文
MySQL源码:Innobase文件系统管理
2012-08-01 23:12 by 竹 石, 1949 阅读, 收藏,
摘要:
前言:很久没有写一些东西了,这次把一些以前写好的贴上来,可能其中有些不对或者不准确的地方请朋友指正,这里先谢谢大家了。2012-5-13 by whuai QQ:329570985 欢迎指正!1.表空间文件 Innodb存储引擎在存储设计上模仿了Oracle的存储结构,其数据是按照表空间进行存储的,默认情况下,在Innodb存储引擎会初始化一个名为ibdata1的表空间文件,同时这个文件会存储所有表的数据,包括系统表SYS_TABLES、SYS_COLUMNS、SYS_INDEXES、SYS_FIELDS等。 Innodb存储引擎的设计很灵活,可以通过参数innodb_file_per_t.. 阅读全文
MySQL源码:innobase日志生成与管理
2012-08-01 20:08 by 竹 石, 1589 阅读, 收藏,
摘要:
前言:很久没有写一些东西了,这次把一些以前写好的贴上来,可能其中有些不对或者不准确的地方请朋友指正,这里先谢谢大家了。2012-5-13 by whuai QQ:329570985 欢迎指正! Innodb存储引擎中的一个很重要的用来保证持久性的机制就是mini事务,在源码中用mtr(Mini-transaction)来表示,本书把它称做“物理事务”,这样叫是相对逻辑事务而言的,对于逻辑事务,做熟悉数据库的人都很清楚,它是数据库区别于文件系统的最重要特性之一,它具有四个特性ACID,用来保证数据库的完整性——要么都做修改,要么什么都没有做。物理事务从名字来看,是物理的,因为在innodb存储引 阅读全文
MySQL源码:Innobase字典管理及索引
2012-05-20 13:31 by 竹 石, 2045 阅读, 收藏,
摘要:
前言:最近在重温innobase的B树及记录模块,发现对之前已经看过的字典管理及索引内容竟然忘却了,所以重新看了一遍并将它记录下来,防止哪天又给忘了。不过还是那句话,如果哪些有问题还请指正。谢谢。 在innobase中,最基本的有四个系统表,用来存储用户定义的表、列、索引及索引列等信息,这些表分别为SYS_TABLES、SYS_COLUMNS、SYS_INDEXES、SYS_FIELDS。每一个表的列分别如下: 1)、SYS_TABLES,用来存储所有的以innobase为存储引擎的表,每条记录对应已经定义的一个表。 NAME:表示一个表的表名。 ID:表示这个表的ID号(8个字节)。... 阅读全文
MySQL源码:Innobase缓冲池
2012-05-15 21:19 by 竹 石, 1011 阅读, 收藏,
摘要:
Innodb的缓冲池主要是用来存储访问过的数据页的,它就是一块连续的内存,通过一定的算法使这块内存得到有效的管理。它是数据库系统中拥有最大块内存的系统。Innodb存储引擎中数据的访问是按照页(默认为16K)的方式从数据库文件中读取到缓冲区中,然后在内存中用同样大小的内存空间来做一个映射,为了提高数据访问效率,数据库系统预先就分配很多这样的空间,用来与文件中的数据进行交换。访问时按照最近最少使用(LRU)算法来实现缓冲区页面的管理,经常访问的在最前面,最不经常的在最后面,如果缓冲区中没有空闲的页面来做文件数据的映射时,就从缓冲池中找到最后面的且不使用的将它淘汰然后拿来映射新数据文件页面,同时将 阅读全文
mysql集群在WIN32下的配置
2012-05-15 21:18 by 竹 石, 317 阅读, 收藏,
摘要:
mysql集群在WIN32下的配置折腾了好几个晚上,终于把MYSQL在WINDOWS下的集群配置起来了,挺高兴的,在这里与大家分享一下。准备工作:可以在http://www.mysql.com/downloads/cluster/上下载MYSQL cluster的安装版,安装之后即可开始配置,或者直接编它的源码,在经过编译之后再找到编译好的执行码来配置,不过直接从网上下载下来的源码还需要修改一些地方才能编译通过并且运行起来,这需要注意一下了。本人是用源码来编译配置的。下载的MYSQL版本最好是7.2.5的,本人之前下载了一个版本为7.2.4的,看了源码之后发现配置很复杂,好像它的配置文件是打包 阅读全文
MySQL源码:MYSQL表对象的字典缓存
2012-05-15 21:16 by 竹 石, 811 阅读, 收藏,
摘要:
前言:很久又没有写一些东西了,现在又有些空想把我对表对象缓存的一些理解记下来,可能其中有些不对或者不准确的地方请朋友指正,这里先谢谢大家了。2012-5-13 by whuai QQ:329570985 欢迎指正! 在MYSQL中,同样有很多类型的系统对象,包括表、视图、存储过程、存储函数等,但由于MYSQL的插件式存储引擎及其它实现方面的特点,其每一种对象的缓存方式都不同,或者说这些对象的缓存不是通过一种统一的方式来管理的,每一种对象的缓存都是有自己的特点,并且缓存的内容也有很大的差异,下面先只叙述一下表对象的缓存方式。表字典对象缓存,顾名思义,是将某个表对象的字典信息(定义内容)缓存到内. 阅读全文
MySQL源码:MYSQL存储过程/函数的分析原理及缓存机制
2012-05-15 21:09 by 竹 石, 3147 阅读, 收藏,
摘要:
前言:我个人认为,有关MYSQL存储过程/函数在MYSQL中的实现比较粗糙,可扩展性不够好,其实现的耦合性太高,所以主要讲一些它的原理方面的内容,但有可能在某些方面理解不够好或者有些不正确的地方,欢迎指正,谢谢!2012-5-14 by whuai QQ:329570985 欢迎指正! 在MYSQL中,同样有很多类型的系统对象,包括表、视图、存储过程、存储函数等,但由于MYSQL的插件式存储引擎及其它实现方面的特点,其每一种对象的缓存方式都不同,或者说这些对象的缓存不是通过一种统一的方式来管理的,每一种对象的缓存都是有自己的特点,并且缓存的内容也有很大的差异,下面再叙述一下存储过程(PLSQ. 阅读全文
浙公网安备 33010602011771号