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. PyQt(Python+Qt)学习随笔:QAbstractItemView的showDropIndicator属性

    老猿Python博文目录 老猿Python博客地址 概述 QAbstractItemView的showDropIndicator属性用于控制在拖拽过程中显示当前拖拽到的位置,当释放时则在当前拖拽位置覆 ...

  2. 【开发工具】 使用阿里的 Teambition 跟踪BUG修复及需求管理

    刚入公司几个月,公司新项目一直没有用协作工具进行BUG管理,公司也没有专业的测试工程师. 第一阶段开发到了尾声,工作效率实在太低,随决定使用一个比较现代一点的管理工具. 在众多在线项目协作软件中,我选 ...

  3. Scrum 冲刺 第二篇

    Scrum 冲刺 第二篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 初步完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成部分后台首页模块数据库的接口 钟俊 ...

  4. 【Alpha冲刺阶段】Scrum Meeting Daily5

    [Alpha冲刺阶段]Scrum Meeting Daily5 1.会议简述 会议开展时间 2020/5/27 8:30-9:00 PM 会议基本内容摘要 大家讲述了自己的任务完成情况以及遇到的问题 ...

  5. 学习笔记:插头DP

    基于连通性的状压DP问题. 一般是给你一个网格,有一些连通性的限制. 例题 插头DP模板 链接 题意:网格图,去掉一些点,求哈密顿回路方案数. 一般按格递推(从上到下,从左到右). 每个格子要从四个方 ...

  6. 【Azure Developer】通过Azure提供的Azue Java JDK 查询虚拟机的CPU使用率和内存使用率

    问题描述 在Azure上创建虚拟机(VM)后,在门户上可以查看监控指标(Metrics),如CPU Usage,Memory,Disk I/O等.那如何通过Java 代码获取到这些指标呢? 关于VM ...

  7. Spring源码分析之AOP从解析到调用

    正文: 在上一篇,我们对IOC核心部分流程已经分析完毕,相信小伙伴们有所收获,从这一篇开始,我们将会踏上新的旅程,即Spring的另一核心:AOP! 首先,为了让大家能更有效的理解AOP,先带大家过一 ...

  8. Linux下常用日志说明

    /var/log/message ------------------------------------------系统启动后的信息和错误日志 /var/log/secure ----------- ...

  9. Excel优雅导出

    流程 原来写过一篇文章,是介绍EasyExcel的,但是现在有些业务需要解决,流程如下 1.需要把导出条件转换成中文并存入数据库 2.需要分页导出 3.需要上传FTP或者以后上传OSS 解决方案 大体 ...

  10. 02-Dockerfile的基本使用

    1. FROM 作用:指定基础镜像 使用:FROM 镜像名 demo: FROM mysql FROM mysql:5.6 2. RUN 作用:指令是用来执行命令行命令的 使用: shell格式:RU ...