mysqld一直正在启动_MySQL源码阅读1-启动初始化

这篇博客详细介绍了MySQL服务器的启动初始化过程,从配置文件解析到各种组件的初始化,如PSI、定时器、字符集、存储引擎、线程管理等。还提到了MySQL启动时涉及的主要线程及其功能,包括连接监听线程、处理线程、slave/relay线程、信号处理线程等。文章通过函数调用链展示了初始化的步骤,并强调了初始化的复杂性。
摘要由CSDN通过智能技术生成

94721876ca5ff46efaa11fe962d68bad.png

0. 背景

决定将mysql的代码看一下,并且记录下来,希望能够学习一下mysql的内核相关知识。

目前是采取这么一种策略,即看到哪里记录到哪里,也不知道最后会有多少产出。

当然因为是初次阅读,当然会存在很多错误或遗漏,也希望相关人士能够指出。估计在后续的阅读中也会进一步对之前的笔记进行修改,望见谅。

1. MySQL初始化

当然第一篇就是mysql的启动初始化和终止阶段逻辑。以下是初始化简单的小结,更多的话可以在后面的代码函数栈可以看到。终止阶段的逻辑相对简单些。

代码路径:https://github.com/mysql

入口函数:mysql-server-8.0/sql/mysqld.cc::mysqld_main

初始化的内容

  • 参数配置解析:
    • 分别从/etc/my.conf, /etc/mysql/my.conf, SYSCONFDIR/my.cnf, "$MYSQL_HOME"/my.conf, defaults-extra-file, ~/my.conf, DATADIR/mysqld-auto.cnf, 命令行 加载配置文件中的配置项。SYSCONFDIR/my.cnf是在编译时指定的路径,DATADIR是指定的数据目录 ,如果不指定特定的配置的,将按照上面逐步查找配置。
  • performance schema interface(PSI)初始化;PSI主要用于监控/诊断MySQL服务运行状态,可以阅读官方文档:https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html 和(PFS)初始化
  • 初始化定时器timer;
  • 时间相关的
  • 基础的锁结构;
  • 资源池,通知消息等初始化;
  • 字符集/collation
  • 元数据
  • 系统库表,information_schema
  • DDL/DQL/DML/ACL支持的命令
  • plugin,存储引擎
  • binlog
  • 优化器optimizer代价
  • 恢复持久化中的事务数据,
  • ACL相关的初始化,授权相关的初始化
  • SSL
  • 信号处理
  • 审计相关初始化
  • 各类管理器
  • MySQL中的线程

MySQL中的线程

MySQL中主要会启动以下线程处理各种任务:

  • 连接监听主线程,用于监听处理客户端的连接请求,然后将连接请求分发到单独的线程,并处理该连接上的所有请求;
  • 处理线程,是一个线程池,具体在后面会介绍;
  • slave/relay线程,连接到主服务的线程,并且从主服务器中读取binlog更新,在本机上应用更新;
  • 信号处理线程,用来处理信号,具体的信号包括了:SIGTERM, SIGQUIT, SIGHUP, SIGUSR1 and SIGUSR2
  • event_scheduler_thread,事件调度线程,用来调度执行每个表上定义事件,即Event。
  • compress_gtid_table_thread开启一个线程用来压缩GTID_Table,具体的压缩逻辑在mysql-server-8.0/sql/http://rpl_gtid_persist.cc中,估计后续会进一步阅读。
  • helper_thread,辅助线程来分发计时器timer到期通知消息,具体逻辑在timer_notify_thread_func。
  • admin_socket_thread,如果开启了该线程,并且以端口监听,则可以用handle_admin_socket处理请求的逻辑,具体的连接也会用一个新的线程处理。

2. 函数调用链

代码块为初始化的调用链,每一个缩进表示函数调用。

substitute_progpath:将命令行的程序名替换成全路径的程序名,可能是“全路径”,home路径解释,环境变量PATH解释。 

sysd::notify_connect:在环境变量(“NOTIFY_SOCKET“)中查找socket的文件名,如果存在的话则连接该Socket 

sysd::notify:向Notify Socket发送正在启动的消息。 

my_init:初始化my_sys函数,资源和变量 
	my_thread_global_init:初始化线程的环境(初始化一堆资源锁) 
		PSI_mutex_key 结构 
	my_thread_init:申请mysys线程的内存,主要用于debug 

load_defaults -> my_load_defaults:从配置文件中读取配置项 
	init_default_directories:获取配置的目录 
	my_search_option_files:处理在缺省目录下的配置文件,即上一步结果 
		get_defaults_options:从命令行中获取配置选项; 
		init_variable_default_paths:初始化配置文件的作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值