首先去官网或者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启动过程(一)的更多相关文章

  1. MySQL学习笔记-MySQL体系结构总览

    MySQL体系结构总览 不管是用哪种数据库,了解数据库的体系结构都是极为重要的.MySQL体系结构主要由数据库和数据库实例构成. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件 ...

  2. Oracle学习笔记--Oracle启动过程归纳整理

    Oracle 启动过程分为nomount状态mount状态open状态 每个状态下Oracle都会进行不同的操作:1.nomount状态 在$ORACLE_HOME/dbs目录下寻找参数文件 参数文件 ...

  3. MySQL学习笔记-MySQL数据库优化实践[转]

    最近一段时间,我们整理了一些关于Percona,Linux,Flashcache,硬件设备的优化经验,分享给大家: 硬件 1.开启BBWC RAID卡都有写cache(Battery Backed W ...

  4. MySQL学习笔记-数据库文件

    数据库文件 MySQL主要文件类型有如下几种 参数文件:my.cnf--MySQL实例启动的时候在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还介绍了参数类 ...

  5. MySQL学习笔记-事务相关话题

    事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都 ...

  6. MySQL学习笔记-cache 与 buffer

    Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而 buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出的数据,后者是解决写 ...

  7. MySQL学习笔记-锁相关话题

    在事务相关话题中,已经提到事务隔离性依靠锁机制实现的.在本篇中围绕着InnoDB与MyISAM锁机制的不同展开,进而描述锁的实现方式,多种锁的概念,以及死锁产生的原因.   Mysql常用存储引擎的锁 ...

  8. MySQL学习笔记-数据库内存

    数据库内存 InnoDB存储引擎内存由以下几个部分组成:缓冲池(buffer pool).重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool ...

  9. MySQL学习笔记-数据库后台线程

    数据库后台线程 默认情况下讲述的InnoDB存储引擎,以后不再重复声明.后台线程有7个--4个IO thread,1个master thread,1个锁监控线程,1个错误监控线程.IO thread的 ...

随机推荐

  1. Longest Continuous Increasing Subsequence II

    Description Given an integer matrix. Find the longest increasing continuous subsequence in this matr ...

  2. SSM整合Dubbo登陆案例

    登陆案例 一.创建Service项目存放共同数据 1.1  创建实体类 private long id; private String loginName; private String userNa ...

  3. nameserver

    --- deployments: - apiVersion: "apps/v1beta1" kind: "Deployment" metadata: annot ...

  4. 1.5 synchronized其他概念

    synchronized锁重入: 关键字synchronized拥有锁重入的功能,也就是使用synchronized时,当一个线程得到了一个对象的锁后,再次请求此对象时是可以再次得到对象的锁. 输出结 ...

  5. WSAStartup() - 使用方法

    当一个应用程序调用WSAStartup函数时, 操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中. 以后应用程序就可以调用所请求的Socket库 ...

  6. linux 安装gcc 和 g++

    以CentOS为例,安装后是没有C语言和C++编译环境的,需要手动安装,最简单的是用yum的方式安装,过程如下: 1.安装gcc yum install gcc 询问是否,按y键回车即可,或者 yum ...

  7. 【概率论】5-9:多项式分布(The Multinomial Distributions)

    title: [概率论]5-9:多项式分布(The Multinomial Distributions) categories: - Mathematic - Probability keywords ...

  8. 本地spark报:java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createFileWithMode0(Ljava/lang/String;JJJI)Ljava/io/FileDescriptor;

    我是在运行rdd.saveAsTextFile(fileName)的时候报的错,找了很多说法……最终是跑到hadoop/bin文件夹下删除了hadoop.dll后成功.之前某些说法甚至和这个解决方法自 ...

  9. エンジニア死滅シタ世界之高層ビル [MISSION LEVEL: B]-Python3

    n = input() pre="" next_str = "" new_str = "" for i in range(int(n)): ...

  10. GCN: Graph Convolutional Network

    从CNN到GCN的联系与区别: https://www.zhihu.com/question/54504471/answer/332657604 更加详解Laplacian矩阵: https://ww ...