天天看点

MySQL源码之mysqld启动

启动mysqld,并进入listen阶段

函数调用栈:

mysqld_main():  

     my_init();初始化变量,锁,错误串

     my_thread_global_init(): 初始化互斥锁,信号量,线程独享变量

     load_defaults();查找my.cnf

     sys_var_init();初始化system variables

     init_common_variables:初始化mutex,status变量

     init_signals:初始化信号量处理

     init_server_components:装载innodb引擎

     network_init: 初始化网络组件

     start_signal_handler:处理信号的线程

     execute_ddl_log_recovery:执行innodb的recovery

     handle_connections_sockets:开始处理connection请求

my_init():

     文件/目录 umask

     结构化标准io的文件handler:mysql_file

     init_glob_errs():初始化global错误文本数组

     获取home环境变量

 my_thread_global_init():

     1. 线程独享变量:

[pthread_key]thr_key_mysys来控制线程独享结构体变量[st_my_thread_var:包含线程id,error,锁等信息],后续都通过

 pthread_getspecific在线程内进行获取。

      2.

init全局互斥锁:thr_lock_malloc,thr_lock_open,thr_lock_charset,thr_lock_threads,thr_lock_lock,

          thr_lock_isam,

 thr_lock_myisam,thr_lock_myisam_mmap,thr_lock_heap,thr_lock_net,

      3. init全局信号量:thr_cond_threads

      4. 创建一个样本thread,随即就结束【dummy_thread】

load_defaults():

     获取my.cnf的候选目录包括:/etc/my.cnf  /etc/mysql/my.cnf

 $mysql_home/my.cnf  ~/my.cnf ./my.cnf

sys_var_init():

     系统中所有的system

variables都实例化成继承类[sys_var]的static对象,并加入到链表中sys_var_chain all_sys_vars中,

     最后通过链接全部加入到[system_variable_hash]hash表中。

init_common_variables():

     init了大量的mutex和condition:还没有看明白是啥用途

     初始化mysqld.cc定义的全局变量

     初始化默认storage engine

     所有show status 需要的变量加入到all_status_vars

init_server_components():

     初始化user_state,client_state,thread_state.

     装载innodb引擎

network_init():

     初始化网络接口,建立socket,并开始listener。

start_signal_handler():

     创建处理signal的一个独立线程

handle_connections_sockets:

     开始处理connection请求,使用epoll socket描述符的方式listen connect

request,

并对没有请求连接创建一个thd对象,并作为一个新thread的参数。

继续阅读