MySQL开发流程介绍

1. 功能开发(Feature Development)

功能开发过程如下:

  • MySQL的一个功能是指一个worklog.
  • Worklog的开发要经过规格定义,设计,架构评审,代码实现,代码评审和QA评审的过程(但是这几个过程并不是严格的按照先后顺序进行的).
  • MySQL的功能首先在一个功能树(feature tree,是指代码分支树)上实现.
  • 功能树是从MySQL的代码主开发树TRUNK上克隆出来的(一般是开发者自己创建),开发过程中不定期从TRUNK同步.
  • 当功能实现以后,必须要经过代码的评审。
  • 代码评审通过后,开发树被QA接手。
  • QA对功能进行测试,如发现缺陷(bugs),开发人员要进行修复.最终在测试通过后,QA将状态设置为开发过程完成(sign off).
  • 一旦QA验证完毕,功能就会被合并到TRUNK中.

通过这个过程,TRUNK上会不停的累积功能和缺陷修复的代码。额外的回归测试(Regression testing)一刻不停的在TRUNK上执行,以保证TRUNK始终能够保持候选发布版本(Release Candidate)的质量。

MySQL数据库InnoDB存储引擎中的锁机制

00 – 基本概念

  当并发事务同时访问一个资源的时候,有可能导致数据不一致。因此需要一种致机制来将访问顺序化。
  锁就是其中的一种机制。我们用商场的试衣间来做一个比喻。试衣间供许多消费者使用。因此可能有
  多个消费者同时要试衣服。为了避免冲突,试衣间的门上装了锁。试衣服的人在里边锁住,其他人就不能
  从外边打开了。只有里边的人开门出来,外边的人才能进去。

- 锁的基本类型
  数据库上的操作可以归纳为两中,读和写。多个事务同时读一个对象的时候,是不会有冲突的。
  同时读和写或者同时写才会产生冲突。因此为了提高并发性,通常定义两种锁:
  A. 共享锁(Shared Lock) 也叫读锁.
     共享锁表示对数据进行读操作。因此多个事务可以同时为一个对象加共享锁。
  B. 排他锁(Exclusive Lock) 也叫写锁.
     排他锁表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。

- S、X锁的兼容性矩阵
  对于锁,通常会用一个矩阵来描述他们之间的冲突关系。

    S  X
  S +  –
  X -  -
  + 代表兼容, -代表不兼容

- 锁的粒度
  A. 表锁(Table Lock)
     对整个表加锁,影响标准的所有记录。通常用在DDL语句中,如DELETE TABLE,ALTER TABLE等。
  B. 行锁(Row Lock)
     对一行记录加锁,只影响一条记录。通常用在DML语句中,如INSERT, UPDATE, DELETE等。
  很明显,表锁影响整个表的数据,因此并发性不如行锁好。

- 意向锁(Intention Lock)

MySQL数据库InnoDB存储引擎Log漫游(3)

本文讨论MySQL数据库InnoDB存储引擎LOG漫游的问题:

04 – Checkpoint

理论上来说,如果MySQL数据库InnoDB存储引擎的buffer足够大,就不需要将数据本身持久化。将全部的redo log重新执行一遍
就可以恢复所有的数据。但是随着时间的积累,Redo Log会变的很大很大。如果每次都从第一条记
录开始恢复,恢复的过程就会很慢,从而无法被容忍。为了减少恢复的时间,就引入了Checkpoint机制。

- 脏页(dirty page)
  如果一个数据页在内存中修改了,但是还没有刷新到磁盘。这个数据页就称作脏页。

- 日志顺序号(Log Sequence Number)
  LSN是日志空间中每条日志的结束点,用字节偏移量来表示。在Checkpoint和恢复时使用。

MySQL数据库InnoDB存储引擎Log漫游(2)

03 – 日志的内容

- 数据是什么
  从不同的角度和层次来看,我们可以将数据库中的数据看作:
  A. 关系数据
  B. 元组或对象
  C. 存在Page中的二进制序列

  因此Log中也可以记录不同的内容:
- 物理的日志(Physical Log)
  A. 记录完整的Page
  B. 记录Page中被修改的部分(page中的偏移,内容和长度).

MySQL数据库InnoDB存储引擎Log漫游(1)

本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游

00 – Undo Log
Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。

- 事务的原子性(Atomicity)
  事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在执行的过程中发生
  了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过。

- 原理
  Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方
  (这个存储数据备份的地方称为Undo Log)。然后进行数据的修改。如果出现了错误或者用户执行了
  ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。

除了可以保证事务的原子性,Undo Log也可以用来辅助完成事务的持久化。

一个有趣的SQL查询

一个朋友有这样一个SQL查询需求:
有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time)。表结构如下:
*************************** 1. row ***************************
Field: uid
Type: int(10) unsigned
Null: NO
Key: MUL
Default: NULL
Extra:
*************************** 2. row ***************************
Field: login_time
Type: timestamp
Null: NO
Key: MUL
Default: 0000-00-00 00:00:00
Extra:

问如何查询出所有在某一段时间内(如:2012-1-1至2012-1-17)连续7天都有登录的用户。

在写这个SQL时,发现一些很有意思东西,也许对大家写SQL有帮助,因此记录一下。

IT从业人员需要知道的安全知识(2)

03 – 认证(Authentication)

- 认证因子(什么东西可以用来做认证凭证)
  A. Something you know
     只有你知道的东西。如:口令。
  B. Something you have
     只有你拥有的东西。如:你的银行卡、令牌、手机等。
  C. Something you are
     你身体上和别人不一样的东西。如:指纹、视网膜、声音、DNA等。
同时使用多种认证因子进行认证是更安全的做法。例如,到银行取钱,需要同时有卡和密码。
网银交易,需要USB Key和密码。

IT从业人员需要知道的安全知识(1)

最近CSDN等网站被脱库的事情,闹得沸沸扬扬。身为程序员,我觉得软件开发人员自身安全意识的强弱和
安全知识的多寡会直接影响到所开发系统的安全性。从这个角度来分析,系统做的不安全有三种原因:
A. 不知道存在安全隐患
B. 使用了不适当的安全措施
C. 知道存在安全隐患,但是为了简单(也可能别的原因),置之不理。

你属于哪一种呢?
如果你属于前两种情况,请继续往下看。本文是从软件工程师的角度来写的,但是我觉得其中的一些知识,
对其他IT从业人员也有益处。因此命名为“IT从业人员需要知道的安全知识“。

00 – 系统架构

由浅入深理解索引的实现(2)

如果要看“由浅入深理解索引的实现(1)”,请点这里

教科书上的B+Tree是一个简化了的,方便于研究和教学的B+Tree。然而在数据库实现时,为了
更好的性能或者降低实现的难度,都会在细节上进行一定的变化。下面以InnoDB为例,来说说
这些变化。

04 - Sparse Index中的数据指针

  在“由浅入深理解索引的实现(1)”中提到,Sparse Index中的每个键值都有一个指针指向
  所在的数据页。这样每个B+Tree都有指针指向数据页。如图Fig.1所示:

由浅入深理解索引的实现(1)

00 – 背景知识

- B-Tree & B+Tree

  http://en.wikipedia.org/wiki/B%2B_tree
  http://en.wikipedia.org/wiki/B-tree

- 折半查找(Binary Search)

  http://en.wikipedia.org/wiki/Binary_search_algorithm

- 数据库的性能问题

  A. 磁盘IO性能非常低,严重的影响数据库系统的性能。
  B. 磁盘顺序读写比随机读写的性能高很多。

- 数据的基本存储结构

  A. 磁盘空间被划分为许多大小相同的块(Block)或者页(Page).
  B. 一个表的这些数据块以链表的方式串联在一起。
  C. 数据是以行(Row)为单位一行一行的存放在磁盘上的块中,如图所示.
  D. 在访问数据时,一次从磁盘中读出或者写入至少一个完整的Block。

                   Fig. 1