MySQL学习笔记——MySQL启动过程(一)
首先去官网或者github下载MySQL5.7的源码。
官网地址:https://dev.mysql.com/downloads/mysql/
github地址:https://github.com/mysql/mysql-server/tree/5.7
但是好像都下在不到《MySQL运维内参》中的5.7.16版本,所以我这里下载了5.7.25版本,和5.7.16版本比较接近。
我这里下载的是mysql-boost-5.7.25.tar.gz。
下载好后运行如下命令,解压,并将其移动到~/文档中:
tar -zxvf mysql-boost-5.7.25.tar.gz
mv mysql-5.7.25 ~/文档/
入口函数在sql/main.cc,该文件中又调用了mysqld_mian,从这个函数开始到结束,就完成了mysqld的启动操作。
/*
main() for mysqld.
Calls mysqld_main() entry point exported by sql library.
*/
extern int mysqld_main(int argc, char **argv);
int main(int argc, char **argv)
{
return mysqld_main(argc, argv);
}
在sql/mysqld.cc中对mysqld_main函数的定义进行一些精简,如下:
int mysqld_main(int argc, char **argv)
{
my_progname= argv[0];
orig_argc= argc;
orig_argv= argv;
/* 处理配置文件及启动参数 */
if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv))
{
flush_error_log_messages();
return 1;
}
sys_var_init();
/* 继续处理参数变量 */
ho_error= handle_options(&remaining_argc, &remaining_argv,
&all_early_options[0], mysqld_get_one_option);
mysql_audit_initialize();
/* 日志系统初始化 */
query_logger.init(); // 书上是 logger.init_base();
/* 初始化很多系统内部变量 */
if (init_common_variables())
unireg_abort(MYSQLD_ABORT_EXIT); // Will do exit
/* 信号系统初始化 */
my_init_signals();
/* 核心模块启动,包括存储引擎等 */
if (init_server_components())
unireg_abort(MYSQLD_ABORT_EXIT);
if (init_ssl())
unireg_abort(MYSQLD_ABORT_EXIT);
/* 终端重定向处理 */
reopen_fstream();
/* 网络系统初始化 */
if (network_init())
unireg_abort(MYSQLD_ABORT_EXIT);
start_signal_handler(); // Creates pidfile
if (!opt_noacl)
{
udf_init(); // 书中是 (void) grant_init();
}
/* 状态变量初始化 */
init_status_vars();
/* Binlog相关检查初始化 */
check_binlog_cache_size(NULL);
check_binlog_stmt_cache_size(NULL);
binlog_unsafe_map_init();
if (!opt_bootstrap)
{
set_slave_skip_errors(&opt_slave_skip_errors);
if (server_id != 0)
init_slave(); /* Ignoring errors while configuring replication. */
}
create_shutdown_thread();
start_handle_manager();
/* 服务监听线程创建 */
setup_conn_event_handler_threads(); // 书上是 handle_connections_sockets();
/* Wait until cleanup is done
从这里开始,服务器启动线程一直等待,直到shutdown后,继续向下执行*/
mysql_mutex_lock(&LOCK_socket_listener_active);
socket_listener_active= false;
mysql_cond_broadcast(&COND_socket_listener_active);
mysql_mutex_unlock(&LOCK_socket_listener_active);
int ret= 0;
if (shutdown_thr_handle.handle)
ret= my_thread_join(&shutdown_thr_handle, NULL);
shutdown_thr_handle.handle= NULL;
if (0 != ret)
sql_print_warning("Could not join shutdown thread. error:%d", ret);
clean_up(1);
mysqld_exit(MYSQLD_SUCCESS_EXIT);
}
所以,从上面的代码看出,mysqld启动时做了以下功能:
- 处理配置文件及启动参数
- 日志系统初始化
- 初始化很多系统内部变量
- 信号系统初始化
- 核心模块启动,包括存储引擎等
- 终端重定向处理
- 网络系统初始化
- 状态变量初始化
- Binlog相关检查初始化
- 服务监听线程创建
等。
MySQL学习笔记——MySQL启动过程(一)的更多相关文章
- MySQL学习笔记-MySQL体系结构总览
MySQL体系结构总览 不管是用哪种数据库,了解数据库的体系结构都是极为重要的.MySQL体系结构主要由数据库和数据库实例构成. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件 ...
- Oracle学习笔记--Oracle启动过程归纳整理
Oracle 启动过程分为nomount状态mount状态open状态 每个状态下Oracle都会进行不同的操作:1.nomount状态 在$ORACLE_HOME/dbs目录下寻找参数文件 参数文件 ...
- MySQL学习笔记-MySQL数据库优化实践[转]
最近一段时间,我们整理了一些关于Percona,Linux,Flashcache,硬件设备的优化经验,分享给大家: 硬件 1.开启BBWC RAID卡都有写cache(Battery Backed W ...
- MySQL学习笔记-数据库文件
数据库文件 MySQL主要文件类型有如下几种 参数文件:my.cnf--MySQL实例启动的时候在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还介绍了参数类 ...
- MySQL学习笔记-事务相关话题
事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都 ...
- MySQL学习笔记-cache 与 buffer
Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而 buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出的数据,后者是解决写 ...
- MySQL学习笔记-锁相关话题
在事务相关话题中,已经提到事务隔离性依靠锁机制实现的.在本篇中围绕着InnoDB与MyISAM锁机制的不同展开,进而描述锁的实现方式,多种锁的概念,以及死锁产生的原因. Mysql常用存储引擎的锁 ...
- MySQL学习笔记-数据库内存
数据库内存 InnoDB存储引擎内存由以下几个部分组成:缓冲池(buffer pool).重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool ...
- MySQL学习笔记-数据库后台线程
数据库后台线程 默认情况下讲述的InnoDB存储引擎,以后不再重复声明.后台线程有7个--4个IO thread,1个master thread,1个锁监控线程,1个错误监控线程.IO thread的 ...
随机推荐
- codecs 1264 芳香数
1264 芳香数 题目描述 Description This question involves calculating the value of aromatic numbers which are ...
- vuex(用了vue就上了一条不归路的贼船)
一.Vuex是干什么用的? 它是用于对复杂应用进行状态管理用的(官方说法是它是一种状态管理模式). “杀鸡不用宰牛刀”.对于简单的项目,根本用不着Vuex这把“宰牛刀”.那简单的项目用什么呢?用Vue ...
- go error=216编译错误
CreateProcess error=216, 该版本的 %1 与您运行的 Windows 版本不兼容.请查看计算机的系统信息,了解是否需要 x86 (32 位)或 x64 (64 位)版本的程序, ...
- Large Kernel Matters —— Improve Semantic Segmentation by Global Convolutional Network(GCN全局卷积网络)
作者认为语义分割的两个挑战是分类和定位,而这两个挑战又是比较对立的.对于分类问题,模型需要有变形和旋转不变形,而对于定位问题,模型有需要对变形敏感. 提出的GCN遵循两个主要原则: 1.对定位问题,模 ...
- Pytest权威教程21-API参考-01-函数(Functions)
目录 函数(Functions) pytest.approx pytest.fail pytest.skip pytest.importorskip pytest.xfail pytest.exit ...
- el-select定义初始值并且可以修改
[](https://img2018.cnblogs.com/blog/1338470/201811/1338470-20181112152013318-1731627947.png <el-f ...
- jquery选择器(1)
jQuery 元素选择器 jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") ...
- STP生成树算法
生成树算法第一:决定谁是“根网桥”对比各个网桥ID,先对比ID中的优先级,优先级相同的时候对比网桥MAC地址,对比依据是谁的值最小,谁是“根网桥” 第二:决定哪些是“根端口”窍门——每个非根网桥上都有 ...
- Oracle中查询走索引的情况
1.对返回的行无任何限定条件,即没有where子句 2.未对数据表与任何索引主列相对应的行限定条件例如:在City-State-Zip列创建了三列复合索引,那么仅对State列限定条件不能使用这个索引 ...
- 2018-2019-2 20165212《网络对抗技术》Exp9 Web安全基础
2018-2019-2 20165212<网络对抗技术>Exp9 Web安全基础 基础问题回答 1.SQL注入攻击原理,如何防御? 原理:SQL注入,就是通过把SQL命令插入到Web表单递 ...