MySQLStudy之--MySQL体系结构深入解析(三)

2015-07-24 08:18:33 · 作者: · 浏览: 1
L关闭时,InnoDB需要完成所有的full purge和merge insert buffer操作。耗时

? 比较长。

? 1: 是默认值。表示不需要完成full purge和merge insert buffer操作,但是在缓冲池中的一

? 些数据脏页会刷新到磁盘。

? 2: 表示不完成full purge和merge insert buffer操作,也不将缓冲池中的数据脏页写回到磁

? 盘,而是将日志写入到日志文件。MySQL下次启动时,会执行恢复操作。

? innodb_force_recovery

? 影响InnoDB的恢复状况。默认为0,表示需恢复时执行所有的恢复操作。若不能有效恢复,则MySQL有可能宕机,错误信息会被写入错误日志文件。还有 1~6等不同值,根据

? 需要可以设置。

? 0 :正常的关闭和启动,不会做任何强迫恢复操作;

? 1 :跳过错误页,让mysqld服务继续运行。跳过错误索引记录和存储页,可以执行备份操作

? 2 :阻止InnoDB的主线程运行。清理操作时出现mysqld服务崩溃,则会阻止数据恢复操作;

? 3 :恢复的时候,不进行事务回滚;

? 4 :阻止INSERT缓冲区的合并操作。不做合并操作,为防止出现mysqld服务崩溃。不计算表的统计信息

? 5 :mysqld服务启动的时候不检查回滚日志:InnoDB引擎对待每个不确定的事务就像提交的事务一样;

? 6 :不做事务日志前滚恢复操作;

?

Mysql内存结构—buffer pool

InnoDB存储引擎内存主要由几个部分组成:缓冲池(bufferpool)、重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool)

缓冲池是占内存最大的部分,用来存放各种数据的缓存。因为InnoDB的存储引擎的工作方式总是将数据库文件按页(每页16K)读取到缓冲池,然后按最近最少使用(LRU)的算法来保留在缓冲池中的缓存数据。如果数据库文件需要修改,总是首先修改在缓存池中的页(发生修改后,该页即为脏页),然后再按照一定的频率将缓冲池的脏页刷新(flush)到文件。

buffer pool是通过三种list来管理的:

1) free list

2) lru list

3) flush list

buffer pool中的最小单位是page,在innodb中定义三种page

1) free page :此page未被使用,此种类型page位于free链表中

2) clean page:此page被使用,对应数据文件中的一个页面,但是页面没有被修改,此种类型

page位于lru链表中

3) dirty page:此page被使用,对应数据文件中的一个页面,但是页面被修改过,此种类型page

位于lru链表和flush链表中

?

插入缓冲:

不是缓冲池的一部分,InsertBuffer是物理页的一个组成部分,它带来InnoDB性能的提高。根据B+算法(下文会提到)的特点,插入数据的时候会主键索引是顺序的,不会造成数据库的随机读取,而对于非聚集索引(即辅助索引),叶子节点的插入不再是顺序的了,这时需要离散地访问非聚集索引,插入性能在这里变低了。InnoDB引入插入缓冲,判断非聚集索引页是否在缓冲池中,如果在则直接插入;不在,则先放在插入缓冲区中。然后根据上述master thread中介绍的,会有一定的频率将插入缓冲合并。此外,辅助索引不能是唯一的,因为插入到插入缓冲时,并不去查找索引页的情况,否则仍然会造成随机读,失去插入缓冲的意义了。插入缓冲可能会占缓冲池中内存,默认也能会占到1/2,所以可以将这个值调小点,到1/3。通过IBUF_POOL_SIZE_PER_MAX_SIZE来设置,2表示1/2,3表示1/3。

两次写:

它带来InnoDB数据的可靠性。如果写失效,可以通过重做日志进行恢复,但是重做日志中记录的是对页的物理操作,如果页本身损坏,再对其进行重做是没有意义的。所以,在应用重做日志前,需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是doublewire。
恢复数据=页副本+重做日志

\

Mysql内存结构—log buffer与管理池

日志缓冲:

日志缓冲将重做日志信息先放入这个缓冲区,然后按一定频率将其刷新到重做日志文件。该值一般不需要设置为很大,因为一般情况下每一秒钟就会将重做日志缓冲刷新到日志文件,因此我们只需要保证每秒产生的事务量在这个缓冲大小之内即可。

额外的内存池:

额外的内存池同样十分重要。在InnoDB存储引擎中,对内存的管理是通过一种称为内存堆(heap)的方式进行的,他是用于缓存InnoDB引擎的数据字典信息和内部数据结构,在对一些数据结构本身分配内存时,需要从额外的内存池中申请,当该区域的内存不够时,会从缓冲池中申请,若是mysqld服务上的表对象数量较多,InnoDB引擎数据量很大,且innodb_buffer_pool_size的值设置较大,则应该适当地调整innodb_additional_mem_pool_size的值。若是出现缓存区的内存不足,则会直接向操作系统申请内存分配,并且会向MySQL的error log文件写入警告信息。

binlog和redolog区别:

1) binary log,会记录所有与MySQL有关的日志记录,包括 Innodb、MyISAM、Heap等其他存储引

擎的日志而 innodb存储引擎的重做日志(redolog),只记录有关其本身的事务日志


2) 记录内容不同:
binary log:不管你将二进制日志文件的记录格式设置为STATEMENT,还是ROW,又或是

MIXED, 其记录的都是关于一个事务的具体操作内容.
redo log: 记录innodb 每个页的更改的物理情况

3)写入时间不同:
binary log:事务提交前进行记录
redo log :事物进行过程中,不断写入。