mysql5.7 源码分析--初始化

集中在sql\mysqld.cc文件的mysqld_main函数中():

主程序入口

在sql\main.cc文件中:

int main(int argc, char **argv)
{
  return mysqld_main(arg, argv);
}

一、mysql为了跨平台,对win32系统做了单独的初始化:

主要包括:

1.my_init函数

my_init()

包括:

1)文件和文件目录权限初始化

  /* Default creation of new files */
  if ((str= getenv("UMASK")) != 0)
    my_umask= (int) (atoi_octal(str) | 0600);
  /* Default creation of new dir's */
  if ((str= getenv("UMASK_DIR")) != 0)
    my_umask_dir= (int) (atoi_octal(str) | 0700);

2)全局错误提示初始化

init_glob_errs();

3)全局线程和互斥锁初始化

 if (my_thread_global_init())
    return 1;

#if defined(SAFE_MUTEX)
  safe_mutex_global_init();		/* Must be called early */
#endif

#if defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX)
  fastmutex_global_init();              /* Must be called early */
#endif

2.windows系统的上服务初始化

主要是为了windows上的服务机制单独做处理

 if (Service.GetOS())  /* true NT family */
  {
...
      /* start the default service */
      start_mode= 1;
      Service.Init(MYSQL_SERVICENAME, mysql_service);
      return 0;
...
  }

二、mysql服务初始化

主要包括:

1.配置文件加载,读取配置文件如:stonedb.cnf

load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv

2.解析初始化

将命令存储在sql_statement_names全局数组里,如SQLCOM_SELECT对应select

init_sql_statement_names()

3.系统变量初始化

将系统变量放入哈希表中

sys_var_init();

4.初期选项初始化

有部分系统变量需要在mysqld --initialize时使用,所以越早初始化越好,handle_early_options函数就是为了初始化这部分系统变量。

handle_early_options()

5.日志互斥锁初始化

init_error_log_mutex();

6.审计初始化

mysql_audit_initialize();

7.日志初始化

  logger.init_base();

8.mysql通用变量初始化

如所有线程的互斥锁初始化,线程缓存大小、日志名称等

init_common_variables()

9.信号初始化

my_init_signals()

10.设置线程栈大小

pthread_attr_setstacksize(&connection_attrib,
                            my_thread_stack_size + guardize);

检查启动时用户的选项

user_info = check_user(mysqld_user)

设置以该用户运行

set_user(mysqld_user, user_info);

11.服务组件初始化

包括一些插件的初始化、默认存储引擎的初始化、最大连接数等

init_server_components()

12.UUID的创建

每个服务都应该有一个自己的UUID,如果没有的话,就创建一个

if (!opt_bootstrap)
{
    if (init_server_auto_options())
    {
    ...
}

13.ssl初始化

如果打开openssl,就初始化ssl

init_ssl()

14.网络初始化

创建连接tcp/ip套接字、命名管道、UNIX socket(共享内存在连接时处理)

network_init()

创建pid文件

start_signal_handler()

删除tmp_table并初始化数据库级别的权限

mysql_rm_tmp_tables() || acl_init(opt_noacl)

初始化status变量

init_status_vars()

binlog初始化

check_binlog_cache_size(NULL);
check_binlog_stmt_cache_size(NULL);
binlog_unsafe_map_init();

初始化information_schema权限

initialize_information_schema_acl();

ddl日志恢复

execute_ddl_log_recovery();

创建shutdown线程

create_shutdown_thread()

创建manager线程

start_handle_manager();

开启连接处理线程

handle_connections_sockets()--unix/ handle_connections_methods()--windows

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/500527.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常见手撕项目C++

常见手撕项目C 设计模式单例模式饿汉模式懒汉模式 策略模式策略接口实现具体的策略(虚函数重写)定义上下文用户调用 设计模式 单例模式 单例模式是一种常用的软件设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来…

Modbus转Profinet网关快速解决PLC插槽数量不够用的烦恼

通过Modbus转Profinet(XD-MDPN100)网关的应用,不仅可以实现Modbus设备与Profinet网络的平滑对接,还能有效解决PLC插槽限制和Modbus指令轮询等问题,Modbus转Profinet网关(XD-MDPN100)在解决PLC插…

Linux多进程开发2 - 孤儿、僵尸进程

参考学习:彻底搞懂孤儿/僵尸/守护进程 一、孤儿进程(Orphan Process) 父进程运行结束,但子进程还在运行,这样的子进程就称为孤儿进程每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init (即养父)Init 会等待被收养…

阿里云实时计算Flink的产品化思考与实践【下】

摘要:本文整理自阿里云高级产品专家黄鹏程和阿里云技术专家陈婧敏在 FFA 2023 平台建设专场中的分享。内容主要为以下五部分: 阿里云实时计算 Flink 产品化思考 产品化实践 SQL 产品化思考及实践 展望 接上篇:阿里云实时计算Flink的产品…

Centos服务器Open Gauss 部署

近期很多的项目由于信创要求使用一些国产的数据库,比如OpenGauss。OpenGuass是华为高斯DB的开源版,内核还是PostgreSQL,商业版是收费的。这里记录一下是如何安装部署 的。 官方中文文档 官方下载地址 部署要求 操作系统要求 ARM&#xff…

《数据结构学习笔记---第六篇》---栈和队列的实现

目录 1.栈 1.1栈的概念及结构 1.2栈的实现 2.队列 2.1队列的概念及结构 ​2.2队列的实现 3.顺序栈的具体实现 3.1建头文Stack.h” 3.2创建具体接口实现文件Stack.c 3.2.1初始化 3.2.2入栈出栈 3.2.4判空 3.2.5栈的大小 3.2.6销毁栈 3.3主函数的实现 4.链队的具体实现…

iOS UIFont-真香警告之字体管理类

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS UIFont-实现三方字体的下载和使用 第三弹搭建字体管理类:iOS UIFont-真香警告之字体管理类 前言 不知道友们是否有过这种经历,项目已经迭代了很多版本,项目中的文件已经上千个了…

钉钉服务端API报错 错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确

problem 调用钉钉服务端API,机器人发送群聊消息,后台返回报错信息: 钉钉服务端API报错 错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确; reason 定位: 登录后台,查看机器人是存在查看机器人调用权限接…

DARTS-PT: RETHINKING ARCHITECTURE SELECTION IN DIFFERENTIABLE NAS

Rethinking Architecture Selection in Differentiable NAS 论文链接:https://arxiv.org/abs/2108.04392v1 项目链接:https://github.com/ruocwang/darts-pt ABSTRACT 可微架构搜索(Differentiable Neural Architecture Search, NAS)是目前最流行的网…

上位机图像处理和嵌入式模块部署(qmacvisual透视变换)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 说到透视变换,以前我也不明白为什么有这样一个需求。后来在tier1做车道线检测的时候,才知道如果把camera拍摄到的图像做一次…

FebHost:意大利.IT域名一张意大利网络名片

.IT域名是意大利的国家顶级域名,对于意大利企业和个人而言,拥有一个属于自己的”.IT”域名无疑是件令人自豪的事。这个被誉为意大利互联网标志性代表的域名,不仅隐含着浓厚的意大利文化特色,还为使用者在当地市场的推广铺平了道路。 对于那些希望在意大利市场建立强…

HEVC的Profile和Level介绍

文章目录 HEVCProfile(配置):Level(级别):划分标准 HEVC HEVC(High Efficiency Video Coding),也称为H.265,是一种视频压缩标准,旨在提供比先前的…

Linux(CentOS7.5) 安装部署 Python3.6(超详细!包含 Yum 源配置!)

文章目录 1.配置 Yum 源2.下载 Python3 包3. 解压4.安装依赖环境5.安装出错场景 6.创建软链接7.配置 Python3 的环境变量8.验证补充:安装 openssl-devel补充:pip3 源配置 1.配置 Yum 源 # 注意!!!请先切换到 root 账号…

stable diffusion如何下载预处理器?

如何下载预处理器? 具体位置:SD文件>extensions>sd-webui-controlnet>annotator” 把整个文件夹复制到SD的文件夹里面 里面有一个“downloads”文件夹 把这些模型复制到“downloads”文件夹里

【QT学习】1.qt初识,创建qt工程,使用按钮,第一个交互按钮

1.初识qt--》qt是个框架,不是语言 1.学习路径 一 QT简介 ,QTCreator ,QT工程 ,QT的第一个程序,类,组件 二 信号与槽 三 对话框 四 QT Desiner 控件 布局 样式 五 事件 六 GUI绘图 七 文件 八 …

constexpr与std::is_same_v碰撞会产生什么火花?

1. 只编译会用到的if分支 示例代码一中,checkType_v1和checkType_v2两个函数的区别就是if的条件里一个加了constexpr一个没加,加与不加从结果来看都一样,那在编译时和运行时各有什么区别呢? 示例代码一,test_01.cpp&…

数字孪生项目的开发工具

数字孪生项目的开发工具是实现数字孪生技术应用的关键。它们使得开发者能够创建、管理和优化数字孪生模型,以及与真实世界的实体进行交互。以下是一些数字孪生项目开发中常用的工具,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件…

软件工程学习笔记14——案例解析篇

一、大型开源项目对软件工程的应用 以VS Code为例,看大型开源项目是如何应用软件工程的。 软件工程的核心,就是围绕软件项目开发,对开发过程的组织,对方法的运用,对工具的使用。 所以当我们去观察一个软件项目&#…

主流好用的 Markdown 编辑器介绍

在当今程序员的日常工作中,Markdown 已经成为了一种常用的文本标记语言,它简洁、易读、易写,被广泛应用于写作、文档编写、博客撰写等场景。为了更高效地编辑和管理 Markdown 格式的文档,选择一款功能强大、易用的 Markdown 编辑器…

基于jdbc+mysql+java的简单货物管理系统

智能软件(后端测试) 路线篇 第一阶段: javamysqljdbc综合实战应用ai企业级框架工具:eclipse 第二阶段 seevletssm框架vueai综合实战serclet工具: ideaiflycode大模型gitmaven 组内任务 项目开发答辩 第三阶段 基…