不多废话,先上流程图
sequenceDiagram
participant main as sql/main.cc
participant mysqld as mysqld.cc
participant my_init as my_init.c
participant my_default as my_default.cc
participant logger as log.cc
participant connection_acceptor as /sql/conn_handle/connection_acceptor.h
participant Connection_handler_manager as /sql/conn_handle/Connection_handler_manager.cc
main->>mysqld: 入口函数调mysqld进入主逻辑
mysqld->>my_init: win32下调用my_bool my_init()
mysqld->>my_default: 处理配置文件以及 解析、设置启动参数
mysqld->>mysqld: 调用handle_early_options()尽早初始化一些参数,下面要用
mysqld->>logger: 日志系统初始化
mysqld->>mysqld: init_common_variables()初始化一些公共变量
mysqld->>mysqld: my_init_signals()信号系统初始化
mysqld->>mysqld: init_server_components() 括存储引擎
mysqld->>mysqld: init_ssl() 初始化安全加密通信
mysqld->>mysqld: reopen_fstreams() 终端重定向
mysqld->>mysqld: network_init() 网络初始化
mysqld->>mysqld: start_signal_handle() 信号处理
mysqld->>mysqld: init_status_vars() 状态变量初始化
mysqld->>mysqld: check_binlog_cache_size()、check_binlog_stms_cache_size() binlog配置相关检查
mysqld->>mysqld: 如果配置了server_id则初始化slave节点
mysqld->>mysqld: create_shutdown_thread() mysql停止线程
mysqld->>mysqld: 创建“句柄管理器”
mysqld->>mysqld: windwos平台调用setup_conn_event_handler_threads()
mysqld->>connection_acceptor: 类unix内核的调用mysqld_socket_acceptor->connection_event_loop();
connection_acceptor->>Connection_handler_manager: mgr->process_new_connection(channel_info) 得到连接
mysqld->>mysqld: 一直等待直到shutdown回收相关资源
c++程序入口main.cc运行之后 一路往下。 做的事情简单归几类
- 初始化些必须的变量设置;
- 信号系统初始化;
- 存储引擎启动;
- ssl;
- 主从配置
- kill监听
// Some code
reopen_fstreams()函数在5.6版本被去掉,bug#29751 https://bugs.mysql.com/bug.php?id=29751
// 创建“句柄管理器” 后面在《运维内存》里面说的是handle_connections_sockets()
// 来创建socket连接句柄 根据代码追踪并不是
// 代码如下
#if defined(_WIN32)
setup_conn_event_handler_threads();
#else
mysql_mutex_lock(&LOCK_socket_listener_active);
// Make it possible for the signal handler to kill the listener.
socket_listener_active= true;
mysql_mutex_unlock(&LOCK_socket_listener_active);
if (opt_daemonize)
mysqld::runtime::signal_parent(pipe_write_fd,1);
// 事件循环
mysqld_socket_acceptor->connection_event_loop();
#endif /* _WIN32 */
// 连接分三种 套接字、命名管道、共享内存 其余两种不常用 ,常用的是套接字 以下2个函数分别是其逻辑
// 命令管道连接方式
extern "C" void *named_pipe_conn_event_handler(void *arg)
{
my_thread_init();
Connection_acceptor<Named_pipe_listener> *conn_acceptor=
static_cast<Connection_acceptor<Named_pipe_listener>*>(arg);
conn_acceptor->connection_event_loop();
decrement_handler_count();
my_thread_end();
return 0;
}
// 共享内存连接方式
extern "C" void *shared_mem_conn_event_handler(void *arg)
{
my_thread_init();
Connection_acceptor<Shared_mem_listener> *conn_acceptor=
static_cast<Connection_acceptor<Shared_mem_listener>*>(arg);
conn_acceptor->connection_event_loop();
decrement_handler_count();
my_thread_end();
return 0;
}