mysql源码分析-启动过程

概要

# sql/mysqld.cc, 不包含psi的初始化过程
mysqld_main:
// 加载my.cnf和my.cnf.d,还有命令行参数
if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv))
return 1;
init_sql_statement_names();
sys_var_init();
init_error_log_mutext();
mysql_audit_initialize(); logger.init_base(); // 读取和设置配置文件和命令行参数,并根据相关参数进行相应的初始化操作,这个函数相当庞大
if (init_common_variables())
unireg_abort(1); init_signals(); if (init_server_components())
unireg_abort(1); init_ssl();
// 网络初始化,获取监听地址,监听unix_socket,开始监听
network_init(); if (mysql_rm_tmp_tables() ||
acl_init(opt_noacl) ||
my_tz_init((THD *)0, default_tz_name, opt_bootstrap))
{ ... } if (!opt_noacl)
grant_init();
if (!opt_bootstrap)
servers_init(0); init_status_vars(); start_handle_manager(); sql_print_information(...); handle_connections_sockets(); mysql_mutex_lock(&LOCK_thread_count);
while (!ready_to_exit)
mysql_cond_wait(&COND_thread_count, &LOCK_thread_count)
mysql_mutex_unlock(&LOCK_thread_count) init_common_variables:
// 设置数据库默认的存储引擎
#if defined(WITH_INNOBASE_STORAGE_ENGINE) || defined(WITH_XTRADB_STORAGE_ENGINE)
default_storage_engine= const_cast<char *>("InnoDB");
#else
default_storage_engine= const_cast<char *>("MyISAM");
#endif
// 添加show status里的一些变量
if (add_status_vars(status_vars))
return 1; // 解析命令行参数
// 根据thread_handling设置thread_scheduler(也就是thd->scheduler), scheduler实现在sql/scheduler.cc和sql/mysqld.cc,目前有两种模型,one-thread-per-connection和no-threads
if (get_options(&remaining_argc, &remaining_argv))
return 1;
//其他,超级庞大 network_init:
// handle_connections_sockets:
// poll mysqld监听的socket(tcp,unix), 代码省略
// 新建vio实例,其实就是绑定不同的通信实例(有windows的namedpipe, 平台独立的shmem, 还有支持openssl,其他类型的连接统一处理)
// 配置一些socket 选项
if (!(vio_tmp = vio_new(new_sock,
sock == unix_sock ? VIO_TYPE_SOCKET : VIO_TYPE_TCPIP,
sock == unix_sock ? VIO_LOCALHOST : 0)) ||
// 绑定THD和vio实例
my_net_init(&thd->net, vio_tmp))
{
// 失败处理,省略
}
// 设置一些THD实例的统计信息,如连接数,检查连接数是否超出上线,触发thd->scheduler->add_connection方法
// 新建pthread执行handle_one_connection处理请求, 在sql/sql_connect.cc中定义
create_new_thread(thd) // sql/sql_connect.cc
handle_one_connetion:
do_handle_one_connection(thd) do_handle_one_connection:
// 统计slow_launch_threads, 代码省略
for (;;) { // 此处死循环是为了复用thd,下次直接初始化新的connection信息,处理下一个connection
// 用户认证,初始化请求信息,
if (thd_prepare_connection(thd)) { // 错误处理,省略} while (thd_is_connection_alive(thd)) {
// 通知plugin->release_thd,然后unlock thd->audit_class_plugins中的plugins
mysql_audit_release(thd);
if (do_command(thd))
break;
}
} // sql/sql_parse.cc, 省略对WITH_WSREP的处理,wsrep thd有很多特别的处理步骤
do_command:
if (packet_length = mysql_net_read(net)) == packet_error) { // 错误处理,省略} // 获取请求消息的起始位置
packet = (char*) net->read_pos;
// 从请求消息中获取mysql命令, include/mysql_com.h中有定义所有的mysql 支持的命令
command = (enum enum_server_command) (uchar) packet[0];
return_value = dispatch_command(command, thd, packet+1, (uint) (packet_length-1)); // sql/sql_parse.cc, 超级庞大
dispatch_command:
// 根据command来switch不同的分支,执行不同的mysql命令,执行sql语句为COM_QUERY,或者COM_STMT_EXCUTE(预处理sql语句)
// case COM_QUERY:
mysql_parse(thd, thd->query(), thd->query_length(), &parser_state); // sql/sql/parse.cc
mysql_parse:
# 解析sql语句
parse_sql(thd, parser_state, NULL);
# 如果发现分号,就开始执行sql语句
mysql_execute_command(thd) mysql_execute_command:
# 根据解析出来的sql command执行不同的命令,基本上在mysql命令行敲的每个命令都对应一个分支,比如begin(SQLCOM_BEGIN),select(SQL_SELECT)等

参看

  1. https://dev.mysql.com/doc/internals/en/

mysql源码分析-启动过程的更多相关文章

  1. Symfony2源码分析——启动过程2

    文章地址:http://www.hcoding.com/?p=46 上一篇分析Symfony2框架源码,探究Symfony2如何完成一个请求的前半部分,前半部分可以理解为Symfony2框架为处理请求 ...

  2. quartz2.x源码分析——启动过程

    title: quartz2.x源码分析--启动过程 date: 2017-04-13 14:59:01 categories: quartz tags: [quartz, 源码分析] --- 先简单 ...

  3. Symfony2源码分析——启动过程1

    本文通过阅读分析Symfony2的源码,了解Symfony2启动过程中完成哪些工作,从阅读源码了解Symfony2框架. Symfony2的核心本质是把Request转换成Response的一个过程. ...

  4. Spring Boot源码分析-启动过程

    Spring Boot作为目前最流行的Java开发框架,秉承"约定优于配置"原则,大大简化了Spring MVC繁琐的XML文件配置,基本实现零配置启动项目. 本文基于Spring ...

  5. Nginx学习笔记(六) 源码分析&启动过程

    Nginx的启动过程 主要介绍Nginx的启动过程,可以在/core/nginx.c中找到Nginx的主函数main(),那么就从这里开始分析Nginx的启动过程. 涉及到的基本函数 源码: /* * ...

  6. MySQL源码分析以及目录结构 2

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  7. MySQL源码分析以及目录结构

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  8. Zookeeper 源码分析-启动

    Zookeeper 源码分析-启动 博客分类: Zookeeper   本文主要介绍了zookeeper启动的过程 运行zkServer.sh start命令可以启动zookeeper.入口的main ...

  9. apiserver源码分析——启动流程

    前言 apiserver是k8s控制面的一个组件,在众多组件中唯一一个对接etcd,对外暴露http服务的形式为k8s中各种资源提供增删改查等服务.它是RESTful风格,每个资源的URI都会形如 / ...

随机推荐

  1. 【软件测试部署基础】maven的认识

    最近部门分享测试环境部署相关内容,在同事的分享下,学到了很多新的知识点,也是我们在测试环境部署的时候非常重要的一些基本的知识点,当你系统的去了解了一下,你会发现后端在maven相关的点上有个清晰的了解 ...

  2. java中的反射(一)

    在之前学java基础时学习过反射,但在因为没有相应的应用场景,所以也是一知半解.最近在学spring的时候发现反射是其中很重要的一部分,所以回顾一下,并看看它在spring中的应用. 目录 一.反射 ...

  3. 利用promise实现间隔1s打印1,2,3

    利用promise结合数组的rduce方法 let arr = [1, 2, 3]; arr.reduce((pre, cur) => { return pre.then(() => { ...

  4. 从.NET转GO了

    前言 近几个月刚从.NET转到GO,入职了一个使用GO微服务的互联网公司.因为需要熟悉公司的微服务架构和适应新公司的节奏,所以最近没时间写博客,现在简单做个总结. 转GO的经历 自学GO 上一年的八月 ...

  5. P7077 函数调用

    我好蠢啊... 考试的时候不会写,现在看了这么多篇题解还是似懂非懂,所以决定写一下草稿... 草稿 和 题解 就是首先,题目保证了函数不会间接的调用其本身,所以可以直接知道这是一个 \(\text{D ...

  6. 题解-洛谷P6788 「EZEC-3」四月樱花

    题面 洛谷P6788 「EZEC-3」四月樱花 给定 \(n,p\),求: \[ans=\left(\prod_{x=1}^n\prod_{y|x}\frac{y^{d(y)}}{\prod_{z|y ...

  7. 应用案例——高并发 WEB 服务器队列的应用

    在高并发 HTTP 反向代理服务器 Nginx 中,存在着一个跟性能息息相关的模块 - 文件缓存. 经常访问到的文件会被 nginx 从磁盘缓存到内存,这样可以极大的提高 Nginx 的并发能力,不过 ...

  8. RocketMQ(六):nameserver队列存储定位解析

    在rocketmq中,nameserver充当了一个配置管理者的角色,看起来好似不太重要.然而它是一个不或缺的角色,没有了它的存在,各个broker就是一盘散沙,各自为战. 所以,实际上,在rocke ...

  9. 没有部署ingress pod的woker节点telnet slb的80 443端口不通

    一,问题描述 没有部署ingress pod的woker节点telnet slb的80 443端口不通 二,解决办法 方法一:改用svc地址调用 方法二:让每台woker节点都部署ingress po ...

  10. Unity射击实例讲解—主角创建

    前言: 经过三分钟的思考决定换个标题,这两天其实游戏制作进度推了大半了,加入了许多自我创作的素材,不过想一想用来讲解的实例不该这么花哨,决定还是参照我的一些教材做一些简单的示例不然要说的东西太多,本人 ...