mysql 启动

51 阅读5分钟

好的,我们来详细解释一下 MySQL 文档“链接”部分中提到的“启动”环节(对应文档中的 Startup 部分),其核心入口点是 mysqld_main 函数。

核心概念:mysqld_main

  • mysqld_main 函数是 MySQL 服务器进程 (mysqld) 在操作系统上启动后执行的 主入口函数。它是整个服务器启动序列的起点和协调中心。
  • 这个函数通常位于 MySQL 源代码的 sql/mysqld.cc 文件中(路径可能因版本略有差异)。

启动过程详解 (mysqld_main 内部主要步骤):

mysqld_main 函数内部执行一系列复杂而有序的步骤来初始化服务器并使其准备好接受客户端连接。主要阶段包括:

  1. 早期初始化和参数解析 (opt_initialize 相关):

    • 解析命令行参数: 读取并处理用户在启动 mysqld 时传递的所有命令行选项(如 --datadir, --port, --basedir, --defaults-file 等)。
    • 加载配置文件: 读取并解析 MySQL 配置文件(如 my.cnfmy.ini),将配置设置与命令行参数合并或覆盖。
    • 设置全局变量: 根据解析得到的配置和参数,设置服务器运行所需的大量内部全局变量。
    • 初始化内部组件: 进行一些非常基础的初始化工作,例如设置错误日志的路径、初始化内存管理结构等。
  2. 平台和子系统初始化:

    • 操作系统适配: 执行与操作系统特性相关的初始化(例如设置信号处理器、设置文件描述符限制、初始化线程子系统、设置本地化环境等)。
    • 安全上下文: 如果配置了,切换到运行 MySQL 的指定用户/组权限(通常是为了安全,避免以 root 运行)。
    • 资源限制检查: 检查必要的系统资源(如内存、文件描述符)是否充足。
  3. 关键模块初始化:

    • 存储引擎初始化: 加载并初始化配置的存储引擎(如 InnoDB, MyISAM)。对于 InnoDB,这涉及初始化其缓冲池、日志文件、表空间等。
    • 插件系统初始化: 加载并初始化服务器插件(认证插件、审计插件、全文解析器插件、半同步复制插件等)。
    • 网络模块初始化: 初始化服务器监听客户端连接的套接字(TCP/IP 和可能的 Unix Socket)。文档中提到的 Viovio_init 属于这一层,提供了网络 I/O 的抽象。
    • 线程管理器初始化: 设置线程池或连接处理线程的基础。
    • 权限系统初始化: 加载 mysql 系统数据库中的权限表(user, db, tables_priv, columns_priv, procs_priv 等),构建访问控制信息。这发生在存储引擎初始化之后,因为权限表本身也是存储在引擎(通常是 InnoDB)中的。
    • 复制初始化(如配置): 如果服务器配置为复制节点(主库或从库),初始化复制相关的结构和线程。
    • 事件调度器初始化: 如果启用,初始化事件调度器线程。
    • 其他子系统: 初始化查询缓存(如果启用且版本支持)、性能模式、信息模式等。
  4. 启动核心服务:

    • 启动网络监听: 开始监听配置的端口(如 3306),准备接受客户端连接。此时,服务器在网络上变得可见。
    • 启动管理线程: 启动后台线程,例如:
      • 主线程: 执行后台任务(刷新日志、刷新脏页、清理等)。
      • 信号处理线程: 处理操作系统信号(如 SIGHUP 重载配置、SIGTERM 优雅关闭)。
      • 从库 I/O 线程 / SQL 线程 (如配置): 启动复制线程。
      • 事件调度器线程 (如启用): 开始执行预定事件。
      • 其他监控或维护线程。
  5. 启动完成与就绪:

    • 状态标记: 将服务器内部状态标记为 RUNNING
    • 写入日志: 在错误日志中记录一条 “ready for connections” 消息,这是服务器启动成功的最关键标志。这条消息会包含监听的端口和协议信息(如 X Plugin 端口)。
    • 预热 (可选): 某些配置或工具可能在启动后进行预热操作(如加载数据到缓冲池),但这通常在 RUNNING 状态后由外部或内部机制触发,不是 mysqld_main 核心启动流程的一部分。

与文档其他部分的联系:

  • opt_initialize / bootstrap::run_bootstrap_thread首次安装初始化(例如执行 mysqld --initializemysqld --initialize-insecure)或 恢复崩溃后的系统表 时使用。这与正常的服务器启动 (mysqld) 是 不同的流程。正常启动时,服务器是直接加载已有的数据目录和系统表;而初始化是 创建 这些基础结构。
  • handle_fatal_signal, signal_hand 这些是用于处理服务器 异常终止(崩溃)正常或强制关闭 时信号的函数,属于 Shutdown 环节,与 Startup 相对。
  • Vio, vio_init 属于 Virtual Input Output 层,在启动过程的 网络模块初始化 阶段被调用和使用,为服务器提供跨平台(Unix, Windows)的网络通信抽象。
  • native_mutex_t 等: 这些同步原语在整个启动过程的各个步骤中被广泛使用,以确保多线程初始化的正确性和数据一致性。
  • my_open, my_dir 这些文件 I/O 包装函数在启动过程中用于读取配置文件、打开数据文件、扫描数据目录等。

总结:

在 MySQL 的文档上下文中,“启动” (Startup) 指的就是 mysqld 服务器进程从操作系统启动到准备好接受客户端连接 (ready for connections) 的整个过程。mysqld_main 函数是这个过程的中央控制器,负责协调所有必要的初始化步骤,包括配置加载、操作系统适配、关键模块(存储引擎、网络、权限、插件)初始化、服务线程启动等。这与首次安装的“初始化” (opt_initialize) 和“关闭” (Shutdown) 过程是截然不同的阶段。理解 mysqld_main 的执行流是理解 MySQL 服务器如何“活”起来的关键。

参考

dev.mysql.com/doc/dev/mys…