首页 > 代码库 > Innodb的启动

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. 后台线程

 

......未完待续。

Innodb的启动