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的 ... 
随机推荐
- [TypeScript] Modifier
			TypeScript 2.8 adds the ability for a mapped type to either add or remove a particular modifier. Spe ... 
- NOIP2013积木大赛 [贪心]
			大意 自己查去... 说明 这道题正解是贪心,但标程里是有这样一句话的:把序列分成(a1,..ai)(ai+1,...aj)......(ak,...an)多个非递减序列.然后所有段中最大值的和减去除 ... 
- map json 字符串 对象之间的相互转化
			1.对象与字符串之间的互转 将对象转换成为字符串 String str = JSON.toJSONString(infoDo); 字符串转换成为对象 InfoDo infoDo = JSON.pars ... 
- Spring入门(一)——IOC
			1. IOC定义 Inversion of Control,减低计算机代码间的耦合度,对象的创建交给外部容器完成,不用再new了 2. 流程 2.1 创建Bean对象 package bean; pu ... 
- Cogs 763. [USACO Open09] 数字的游戏(博弈)
			[USACO Open09] 数字的游戏 ★☆ 输入文件:cdgame.in 输出文件:cdgame.out 简单对比 时间限制:1 s 内存限制:128 MB Bessie正跟FJ玩一个数字游戏,她 ... 
- codevs 4028 EZ系列
			4028 EZ系列之愤怒的一天 题目描述 Description 有一天,在某某教学楼某某课室某某课桌旁,某某某大声尖叫起来. 在那一瞬间,勇敢的丁畅大大站了出来,向某某某讨好,结果被揍得半死. ... 
- 10分钟手把手教你运用Python实现简单的人脸识别
			欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 前言:让我的电脑认识我 我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现高大上的人脸识别技术! Python里,简单的 ... 
- windows下powershell的包管理工具
			scoop github 开源地址:https://github.com/lukesampson/scoop 安装命令->powershell管理员模式下输入 Invoke-Expression ... 
- JSP迭代标签
			1. 新建LoopTag类,代码如下: package bid.zhazhapan.fims.tag; import java.io.IOException; import java.util.Col ... 
- leaflet地图框架
			leaflet 中文API LeafLet js 官网:http://leafletjs.com/index.html LeafLet js 官网demo: http://leafletjs.com/ ... 
