MySQL启动与关闭流程详解

MySQL启动流程 启动命令: mysqld --defaults-file=/etc/my.cnf 完整流程(8个阶段): 1. 读取配置文件 2. 初始化文件系统 3. 初始化InnoDB存储引擎 4. 加载系统表 5. 执行崩溃恢复(如需要) 6. 启动后台线程 7. 监听客户端连接 8. 完成启动 1. 读取配置文件 查找顺序 # MySQL配置文件查找顺序(Linux) 1. /etc/my.cnf 2. /etc/mysql/my.cnf 3. /usr/etc/my.cnf 4. ~/.my.cnf 5. --defaults-file指定的文件 # 查看实际读取的配置 mysqld --verbose --help | grep -A 1 "Default options" 关键配置 [mysqld] # 数据目录 datadir = /var/lib/mysql # 端口 port = 3306 # 字符集 character-set-server = utf8mb4 # Buffer Pool大小 innodb_buffer_pool_size = 8G # 日志文件 log-error = /var/log/mysql/error.log 2. 初始化文件系统 # 检查数据目录 1. 检查datadir是否存在 2. 检查datadir权限(mysql用户可读写) 3. 创建临时目录(tmpdir) # 检查必要文件 1. ibdata1(系统表空间) 2. ib_logfile0/ib_logfile1(redo log) 3. mysql/(系统数据库目录) # 如果文件不存在 → 初始化数据库:mysqld --initialize 3. 初始化InnoDB存储引擎 步骤: 1. 分配Buffer Pool内存 ├─ 默认128MB,生产环境建议50-80%内存 └─ innodb_buffer_pool_size = 8G 2. 打开表空间文件 ├─ ibdata1(系统表空间) └─ *.ibd(独立表空间) 3. 打开redo log文件 ├─ ib_logfile0 └─ ib_logfile1 4. 打开undo表空间(MySQL 8.0+) ├─ undo_001 └─ undo_002 5. 初始化Change Buffer、Adaptive Hash Index 4. 加载系统表 -- 加载系统数据库 mysql/ ├─ user.frm/ibd -- 用户表 ├─ db.frm/ibd -- 数据库权限 ├─ tables_priv.frm/ibd -- 表权限 └─ ... -- 加载存储引擎信息 information_schema/ performance_schema/ sys/ 5. 崩溃恢复(Crash Recovery) 检查是否需要恢复 判断条件: IF MySQL未正常关闭(如kill -9、断电) THEN 执行崩溃恢复 ELSE 跳过恢复 END IF -- 判断依据:redo log的checkpoint LSN 恢复流程 1. 读取redo log ├─ 从checkpoint开始读取redo log └─ 找到所有未刷盘的数据页修改 2. 重做(Redo) ├─ 对于已提交的事务 └─ 应用redo log,恢复数据 3. 回滚(Undo) ├─ 对于未提交的事务 └─ 使用undo log回滚 4. 清理 ├─ 清理临时表 └─ 清理未完成的DDL操作 -- 恢复时间:取决于redo log大小和修改量 -- 通常:几秒到几分钟 示例: ...

2025-01-15 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...