mysql源码启动_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("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源码分析-启动过程相关推荐
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...
- mysql udf提权_MySQL日志安全分析技巧
常见的数据库攻击包括弱口令.SQL注入.提升权限.窃取备份等.对数据库日志进行分析,可以发现攻击行为,进一步还原攻击场景及追溯攻击源. 0x01 Mysql日志分析 general query log ...
- linux mysql 释放x锁_MySQL 加锁处理分析-转载
背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...
- mysql 数据库重启命令_Mysql数据库常用的启动,停止以及重启操作命令
Mysql数据库常用的启动,停止以及重启操作命令 1.启动: (1)使用 service 启动:service mysqld start (2)使用 mysqld 脚本启动:/etc/inint.d/ ...
- mysql源码启动_Mysql源码安装、配置、初始化及启动
[在此处输入文章标题] 主机环境redhat6.5 64位 实验环境服务端ip 172.25.29.1 mysql 安装包mysql-boost-5.7.11.tar.gz cmake-2.8.12 ...
- mysql 源码 缓存_MySQL源码:MYSQL存储过程/函数的分析原理及缓存机制
前言:我个人认为,有关MYSQL存储过程/函数在MYSQL中的实现比较粗糙,可扩展性不够好,其实现的耦合性太高,所以主要讲一些它的原理方面的内容,但有可能在某些方面理解不够好或者有些不正确的地方,欢迎 ...
- mysql导入源码包_mysql 源码包安装
1.源码包安装 0)安装依赖 [root@db02 ~]# yum install -y ncurses-devel libaio-devel cmake glibc autoconf gcc-c++ ...
- mysql跨服务器链表_MySQL 源码链表的实现
MySQL 源码链表的实现 MySQL源码关于链表的实现在ut0lst.h文件中,其设计思路与常规略有不同,基本思想是指针嵌于对象之内,如下图所示. 在这种实现方式下,构造一个链表需要同时指定对象类型 ...
- mysql用户阻塞数_MySQL实例阻塞分析一例(线程statistics状态)
本文用实例来分析MySQL阻塞-线程statistics状态. 一. 现象 某日下午下班后低峰期,现网MySQL一个库突然报出大量慢sql,状态是 statistics,但是过后拿这些sql去执行的时 ...
- mysql多实例安装启动_MySQL多实例安装启动
Tips:之前我们的一个实例是mysql3306,我们现在再安装一个mysql3307 1.和之前一样,创建需要的目录文件夹 mkdir -p /data/mysql/mysql3307/{data, ...
最新文章
- Linux笔记 软件管理
- codeup 1943进制转换
- Java 创建、填充PDF表单域
- 微信 for Mac 3.1.0 测试版发布(附安装包),新增「发朋友圈」功能
- nikon n150在电脑中不显示里面的图片的解决方法
- php中用js自定义弹窗,用js实现的自定义的对话框的实现代码_javascript技巧
- 易软门诊管理软件php,易软门诊管理系统
- fedora oracle使用,【解决方案】连接到Fedora 14上的Oracle数据库服务器
- Linux 下常用软件包安装
- photoshop文字变形教程:奇特的文字变形演示
- 如何在 Google 免费云端运行 Python 深度学习框架?
- 思科笔记-Four,ospf协议实现全网互通,spf算法,简短总结篇
- 安卓TV应用 Hello Word - 怎样新建一个Android TV 项目
- idea local history说明
- 7金5银,中国跳水梦之队背后的“黑科技“是什么?
- Simpletron模拟器(二)
- CAD绘制二维码(网页版)
- mysql--部门表员工表练习题
- 基于vivado实现FFT/IFFT
- 匈牙利算法——你一定可以看懂的图论算法
热门文章
- 九存:重新定义存储矿机
- 【优化算法】混沌游戏优化 (CGO)【含Matlab源码 1010期】
- 【手势识别】基于matlab GUI SIFT+SVM算法手势识别【含Matlab源码 1789期】
- 【语音采集】基于matlab语音采集及处理【含Matlab源码 1737期】
- 【电力负荷预测】基于matlab模拟退火算法结合狮群算法优化Elman神经网络电力负荷预测【含Matlab源码 1454期】
- 【瑕疵检测】基于matlab GUI灰度共生矩阵痕迹检测【含Matlab源码 863期】
- 【路径规划】基于matlab遗传算法多车辆路径规划【含Matlab源码 704期】
- 【图像分割】基于matlab 2D水平集三维医学图像分割【含Matlab源码 584期】
- 【游戏】基于matlab GUI万年历【含Matlab源码 257期】
- 【三维路径规划】基于matlab人工势场算法无人机三维路径规划【含Matlab源码 168期】