# 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("InnoDB");

#else

default_storage_engine= const_cast("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)等

mysql源码启动_mysql源码分析-启动过程相关推荐

  1. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...

  2. mysql udf提权_MySQL日志安全分析技巧

    常见的数据库攻击包括弱口令.SQL注入.提升权限.窃取备份等.对数据库日志进行分析,可以发现攻击行为,进一步还原攻击场景及追溯攻击源. 0x01 Mysql日志分析 general query log ...

  3. linux mysql 释放x锁_MySQL 加锁处理分析-转载

    背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...

  4. mysql 数据库重启命令_Mysql数据库常用的启动,停止以及重启操作命令

    Mysql数据库常用的启动,停止以及重启操作命令 1.启动: (1)使用 service 启动:service mysqld start (2)使用 mysqld 脚本启动:/etc/inint.d/ ...

  5. mysql源码启动_Mysql源码安装、配置、初始化及启动

    [在此处输入文章标题] 主机环境redhat6.5 64位 实验环境服务端ip 172.25.29.1  mysql 安装包mysql-boost-5.7.11.tar.gz cmake-2.8.12 ...

  6. mysql 源码 缓存_MySQL源码:MYSQL存储过程/函数的分析原理及缓存机制

    前言:我个人认为,有关MYSQL存储过程/函数在MYSQL中的实现比较粗糙,可扩展性不够好,其实现的耦合性太高,所以主要讲一些它的原理方面的内容,但有可能在某些方面理解不够好或者有些不正确的地方,欢迎 ...

  7. mysql导入源码包_mysql 源码包安装

    1.源码包安装 0)安装依赖 [root@db02 ~]# yum install -y ncurses-devel libaio-devel cmake glibc autoconf gcc-c++ ...

  8. mysql跨服务器链表_MySQL 源码链表的实现

    MySQL 源码链表的实现 MySQL源码关于链表的实现在ut0lst.h文件中,其设计思路与常规略有不同,基本思想是指针嵌于对象之内,如下图所示. 在这种实现方式下,构造一个链表需要同时指定对象类型 ...

  9. mysql用户阻塞数_MySQL实例阻塞分析一例(线程statistics状态)

    本文用实例来分析MySQL阻塞-线程statistics状态. 一. 现象 某日下午下班后低峰期,现网MySQL一个库突然报出大量慢sql,状态是 statistics,但是过后拿这些sql去执行的时 ...

  10. mysql多实例安装启动_MySQL多实例安装启动

    Tips:之前我们的一个实例是mysql3306,我们现在再安装一个mysql3307 1.和之前一样,创建需要的目录文件夹 mkdir -p /data/mysql/mysql3307/{data, ...

最新文章

  1. Linux笔记 软件管理
  2. codeup 1943进制转换
  3. Java 创建、填充PDF表单域
  4. 微信 for Mac 3.1.0 测试版发布(附安装包),新增「发朋友圈」功能
  5. nikon n150在电脑中不显示里面的图片的解决方法
  6. php中用js自定义弹窗,用js实现的自定义的对话框的实现代码_javascript技巧
  7. 易软门诊管理软件php,易软门诊管理系统
  8. fedora oracle使用,【解决方案】连接到Fedora 14上的Oracle数据库服务器
  9. Linux 下常用软件包安装
  10. photoshop文字变形教程:奇特的文字变形演示
  11. 如何在 Google 免费云端运行 Python 深度学习框架?
  12. 思科笔记-Four,ospf协议实现全网互通,spf算法,简短总结篇
  13. 安卓TV应用 Hello Word - 怎样新建一个Android TV 项目
  14. idea local history说明
  15. 7金5银,中国跳水梦之队背后的“黑科技“是什么?
  16. Simpletron模拟器(二)
  17. CAD绘制二维码(网页版)
  18. mysql--部门表员工表练习题
  19. 基于vivado实现FFT/IFFT
  20. 匈牙利算法——你一定可以看懂的图论算法

热门文章

  1. 九存:重新定义存储矿机
  2. 【优化算法】混沌游戏优化 (CGO)【含Matlab源码 1010期】
  3. 【手势识别】基于matlab GUI SIFT+SVM算法手势识别【含Matlab源码 1789期】
  4. 【语音采集】基于matlab语音采集及处理【含Matlab源码 1737期】
  5. 【电力负荷预测】基于matlab模拟退火算法结合狮群算法优化Elman神经网络电力负荷预测【含Matlab源码 1454期】
  6. 【瑕疵检测】基于matlab GUI灰度共生矩阵痕迹检测【含Matlab源码 863期】
  7. 【路径规划】基于matlab遗传算法多车辆路径规划【含Matlab源码 704期】
  8. 【图像分割】基于matlab 2D水平集三维医学图像分割【含Matlab源码 584期】
  9. 【游戏】基于matlab GUI万年历【含Matlab源码 257期】
  10. 【三维路径规划】基于matlab人工势场算法无人机三维路径规划【含Matlab源码 168期】