Innodb的启动

Innodb的启动与关闭

1. 启动函数的流程

  innobase_start_or_create_for_mysql

启动的主要步骤包括:
  1. 初始化innodb的参数
  2. 初始化系统结构
    主要结构:srv_sys_t
  3. 加载或者创建文件
    如果是第一次启动,Innodb会创建系统表空间和log file
    如果是重启,Innodb会加载文件
  4. 恢复
    如果系统非正常关闭,则进入恢复过程
  5. 创建相关后台线程

2. 线程并发控制

我们先来看srv_sys的结构:

  

/** The server system struct */
struct srv_sys_t{
    ib_mutex_t    tasks_mutex;        /*!< variable protecting the
                        tasks queue */
    UT_LIST_BASE_NODE_T(que_thr_t)
            tasks;            /*!< task queue */
    ib_mutex_t    mutex;            /*!< variable protecting the
                        fields below. */
    ulint        n_sys_threads;        /*!< size of the sys_threads
                        array */
    srv_slot_t*    sys_threads;        /*!< server thread table */
    ulint        n_threads_active[SRV_MASTER + 1];
                        /*!< number of threads active
                        in a thread class */
    srv_stats_t::ulint_ctr_1_t
            activity_count;        /*!< For tracking server
                        activity */
};

其中:所有的用户线程进入tasks队列, 所有的Innodb的后台线程在sys_threads数组中保存。

有了这个全局结构,就可以很好的控制Innodb的并发线程。

线程控制函数:

1. :srv_conc_enter_innodb

  所有使用Innodb资源的用户线程,调用这个函数,进行并发控制。
2. :srv_conc_force_exit_innodb:

  所有用户线程使用完资源后,退出并发线程(比如一个sql结束后)

3. 防止过度占用资源,为每一个事务设置了一个tickets,如果这个事务有过多的sql,就会递减ticket。

当tickets减少为0的时候,会sleep本线程,让出系统资源。

3. shutdown Innodb

innobase_shutdown_for_mysql:
  1. 刷新buffer pool,并写入最新的lsn到表空间的header。
  2. 关闭所有的后台线程。
  3. 释放所有的内存结构和空间。

4. 后台线程

......未完待续。

时间: 2024-11-05 13:39:18

Innodb的启动的相关文章

修改MySql默认存储引擎为InnoDB,启动报错

修改my.cnf [mysqld] 后加入default-storage-engine=InnoDB后 否启动mysql时会遇到下述错误:[ERROR] Plugin 'InnoDB' init function returned error.[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.[ERROR] Unknown/unsupported table type: InnoDB[ERROR] Aborting 删

InnoDB引擎的启动过程

一 前言 一直对InnoDB引擎的启动过程不太了解,查资料整理了下InnoDB引擎启动的过程和关闭过程,后续会整理些有关redo   undo 的知识点. 二 思维导图 三 参考文章 MySQL运维内参  

Innodb引擎 long semaphore waits

上一篇介绍了因为子表过多,导致innodb crash的情况,但crash的原因是long semaphore waits.long semaphore waits又为何物? 背景:Innodb使用了mutex和rw_lock来保护内存数据结构,同步的机制要么是互斥,要么是读写阻塞的模式, Innode认为mutex和rw_lock hold的时间足够短,所以,如果有线程wait mutex或者rw_lock时间过长,那么 很可能是程序有bug,所以就会异常主动crash. 关于innodb的锁

[MySQL Reference Manual]14 InnoDB存储引擎

14 InnoDB存储引擎 14 InnoDB存储引擎... 1 14.1 InnoDB说明... 5 14.1.1 InnoDB作为默认存储引擎... 5 14.1.1.1 存储引擎的趋势... 5 14.1.1.2 InnoDB变成默认存储引擎之后... 5 14.1.1.3 InnoDB表好处... 6 14.1.1.4 InnoDB表最佳实践... 6 14.1.1.5 InnoDB表提升... 6 14.1.1.6 InnoDB作为默认存储引擎测试... 6 14.1.1.7 验证In

MySQL 5.6 Reference Manual-14.4 InnoDB Configuration

14.4 InnoDB Configuration 14.4.1 InnoDB Initialization and Startup Configuration 14.4.2 Configuring InnoDB for Read-Only Operation 14.4.3 InnoDB Buffer Pool Configuration 14.4.4 Configuring the Memory Allocator for InnoDB 14.4.5 Configuring InnoDB Ch

mysql 使用 Forcing InnoDB Recovery 恢复数据库

环境: CentOS release 6.6 (Final) Server version: 5.5.42-37.1-log Percona Server (GPL), Release 37.1, Revision 39acee0 现象: 数据库挂掉,重启报错 The server quit without updating PID file (/var/lib/mysql/cm.data.dingkai.com.pid).[失败] 日志: 150721 12:38:37  InnoDB: Da

InnoDB存储引擎介绍-(3)InnoDB缓冲池配置详解

原文链接  http://www.ywnds.com/?p=9886 一.InnoDB缓冲池 InnoDB维护一个称为缓冲池的内存存储区域 ,用于缓存内存中的数据和索引.了解InnoDB缓冲池的工作原理,并利用它来保存内存中经常访问的数据,这是MySQL调优的一个重要方面. 1.1 LRU(least recently used) InnoDB将buffer pool作为一个list管理,基于LRU算法.当有新的页要读入到buffer pool的时候,buffer pool就将最近最少使用的页从

mysql启动故障(简写)

问题描述和思路 下午做svn钩子文档时,开发大哥跑来,说mysql启动报错,半个小时没找到解决的办法,报错内容为:StartingMySQL. ERROR! The server quit without updating PID file! 根据大哥的描述,马上想到可能是mysql高速运行下,做大量数据查询时候,卡的时候,强制杀掉mysql数据库,由于主主模式不是很熟悉,判断是两边数据写入不一样,导致起不来,马上想到单个服务器启动,进入127服务器,打开my.cnf文件,server-id注销

InnoDB的4个特性

innodb 的四个特性 insert buffer innodb使用insert buffer"欺骗"数据库:对于为非唯一索引,辅助索引的修改操作并非实时更新索引的叶子页,而是把若干对同一页面的更新缓存起来做合并为一次性更新操作,转化随机IO 为顺序IO,这样可以避免随机IO带来性能损耗,提高数据库的写性能. 1.1 原理: a 先判断要更新的这一页在不在内存中. b 如果不在,则读取index page 存入Insert Buffer,按照Master Thread的调度规则来合并