从今天开始我每周都会更新一篇文章,用于深度、详细、全方位的解释MySQL5.7源码
本人用的环境是MacOS 10.11.6,编译器用的是Xcode 7.3.1,mysql版本是5.7.12
既然是看源码,开始当然是找main方法,mysql服务端的启动入口位于mysqld/main.cc中,代码很简单,加上注释也不过十行
也就是说真正执行的就是这个mysqld_main这个函数,我们来看看他到底做了哪些事情,点进去之后会发现很多#ifndef _WIN32之类预编译指令,由于我们的电脑并非Windows,所以这些代码直接忽略,这个函数做的第一件事情当然是各种初始化工作,本节内容也就详细说一下这部分代码。
/*
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);
}
首先是预初始化performance_schema相关的一些全局变量,这些全局变量可以理解为是performance_schema里面的内存表
这里都是些重复的代码,就截取一部分好了,说到这就顺便简单介绍一下performance_schema这个新的数据库,这个库是一个确实存在的库,这个看mysql的存储数据的文件夹就能看出,其中的内存表由数据库自己维护,用于记录监控信息,不允许用户直接写。
他包括的表主要包含以下几类:
1.配置表,这些表是能手工修改的,用于配置管理的对象
既然都说到这里了就顺便说一下配置表的用法,配置表一共有5个,分别是
setup_actors:用于配置哪些主机、用户是否开启监控和监控内容是否储存,默认是全部主机全部用户都开启,值得一提的是这个表的role字断是个暂时没用的字段(修改后新连接的客户端)
setup_consumers:根据目标用于配置哪些事件会被监控,例如语句、事务 (修改后立刻生效)
setup_instruments:根据工具配置哪些事件会被收集,例如select功能,createtable功能 (修改后部分内容生效)
setup_objects:那些对象被监控,表、函数等 (修改后立刻生效)
setup_timers:监控使用的计时器种类 (修改后立刻生效)
2.瞬时表,就是那些当前监控数据的表,通常以current结尾
3.历史表,记录了历史的监控数据,通常以history和history_long结尾
4.按照一定维度的汇总表,通常是summary_by什么
5.实例表,记录了那些类型的对象实例被监控了,这里文档中写的是instance所以我翻译成实例,其实这个概念有一点绕,我解释一下,mysql的某一种监控会监控一些对象,这一组对应关系以及相关的信息就是一个实例
PFS_builtin_memory_class builtin_memory_program;
...
...
PFS_builtin_memory_class builtin