![94721876ca5ff46efaa11fe962d68bad.png](https://i-blog.csdnimg.cn/blog_migrate/63fc29e38e1310fc1aa5ceb7bb6695a9.jpeg)
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:初始化配置文件的作