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的参数。