MySQL进阶03 — 数据目录

概述

本章,您将学习 MySQL 的数据目录。

数据目录:存储数据库文件、表结构和索引等数据的核心位置

在前面 《MySQL基础02 — 安装与启动相关》 文章中提到,初次使用 MySQL 需要执行初始化:

Shell > /usr/local/mysql8/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql8/ --datadir=/usr/local/mysql8/data/
2025-07-27T04:56:20.682579Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2025-07-27T04:56:20.684346Z 0 [System] [MY-013169] [Server] /usr/local/mysql8/bin/mysqld (mysqld 8.4.6) initializing of server in progress as process 1606
2025-07-27T04:56:20.696137Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-07-27T04:56:20.960314Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-07-27T04:56:22.001144Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: eD04kGLYJo<r
2025-07-27T04:56:23.708005Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.

一旦 MySQL 初始化成功,则数据目录下就会生成相应的文件或目录。

文件解读

Shell > ls -lh /usr/local/mysql8/data/
total 86M
-rw-r----- 1 mysql mysql   56 Jul 27 12:56  auto.cnf
-rw-r----- 1 mysql mysql  181 Oct  7 15:32  binlog.000035
-rw-r----- 1 mysql mysql  181 Oct  7 15:33  binlog.000036
-rw-r----- 1 mysql mysql  181 Oct  7 21:52  binlog.000037
-rw-r----- 1 mysql mysql 1.1K Oct 11 15:29  binlog.000038
-rw-r----- 1 mysql mysql  181 Oct 11 19:36  binlog.000039
-rw-r----- 1 mysql mysql 1.9K Oct 13 22:55  binlog.000040
-rw-r----- 1 mysql mysql 1.6K Oct 14 10:42  binlog.000041
-rw-r----- 1 mysql mysql 1.6K Oct 16 22:36  binlog.000042
-rw-r----- 1 mysql mysql 3.6K Oct 17 21:34  binlog.000043
-rw-r----- 1 mysql mysql 8.6K Oct 18 12:22  binlog.000044
-rw-r----- 1 mysql mysql 2.8K Oct 25 20:19  binlog.000045
-rw-r----- 1 mysql mysql 3.8K Oct 29 14:36  binlog.000046
-rw-r----- 1 mysql mysql  13K Nov  1 11:58  binlog.000047
-rw-r----- 1 mysql mysql  181 Nov  2 14:48  binlog.000048
-rw-r----- 1 mysql mysql  181 Nov  2 15:05  binlog.000049
-rw-r----- 1 mysql mysql  181 Nov  2 17:40  binlog.000050
-rw-r----- 1 mysql mysql  181 Nov  6 19:24  binlog.000051
-rw-r----- 1 mysql mysql  272 Nov  6 12:51  binlog.index
-rw------- 1 mysql mysql 1.7K Jul 27 12:56  ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Jul 27 12:56  ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Jul 27 12:56  client-cert.pem
-rw------- 1 mysql mysql 1.7K Jul 27 12:56  client-key.pem
drwxr-x--- 2 mysql mysql 4.0K Oct 29 14:36  home
-rw-r----- 1 mysql mysql 4.0M Nov  6 12:53 '#ib_16384_0.dblwr'
-rw-r----- 1 mysql mysql  12M Sep 16 22:51 '#ib_16384_1.dblwr'
-rw-r----- 1 mysql mysql 3.7K Nov  6 19:24  ib_buffer_pool
-rw-r----- 1 mysql mysql  12M Nov  6 19:24  ibdata1
-rw-r----- 1 mysql mysql  12M Nov  6 11:56  ibtmp1
drwxr-x--- 2 mysql mysql 4.0K Nov  6 12:51 '#innodb_redo'
drwxr-x--- 2 mysql mysql 4.0K Nov  6 19:24 '#innodb_temp'
drwxr-x--- 2 mysql mysql 4.0K Jul 27 12:56  mysql
-rw-r----- 1 mysql mysql   14 Oct  7 19:32  mysqld-auto.cnf
-rw-r----- 1 mysql mysql  64K Nov  6 19:24  mysqld_start.err
-rw-r----- 1 mysql mysql  25M Nov  6 12:51  mysql.ibd
-rw-r----- 1 mysql mysql  124 Jul 27 12:56  mysql_upgrade_history
drwxr-x--- 2 mysql mysql 4.0K Jul 27 12:56  performance_schema
-rw------- 1 mysql mysql 1.7K Jul 27 12:56  private_key.pem
-rw-r--r-- 1 mysql mysql  452 Jul 27 12:56  public_key.pem
-rw-r--r-- 1 mysql mysql 1.1K Jul 27 12:56  server-cert.pem
-rw------- 1 mysql mysql 1.7K Jul 27 12:56  server-key.pem
drwxr-x--- 2 mysql mysql 4.0K Jul 27 12:56  sys
-rw-r----- 1 mysql mysql  16M Nov  6 12:53  undo_001
-rw-r----- 1 mysql mysql  16M Nov  6 12:53  undo_002
drwxr-x--- 2 mysql mysql 4.0K Aug 22 12:14  world

文件说明如下:

  • auto.cnf - MySQL 服务器在启动时自动生成或读取的配置文件,主要用于存储服务器的唯一标识符(server-uuid)

    Shell > cat /usr/local/mysql8/data/auto.cnf
    [auto]
    server-uuid=099d47b3-6aa6-11f0-8491-000c29b341fd
  • binlog.xxxxxx - 每当 MySQL 实例重启或启动时,binlog 就会自动生成带数字后缀的文件名,如 binlog.000001、binlog.000002 这样的。由于有 binlog_expire_logs_seconds 以及 binlog_expire_logs_auto_purge 系统变量的存在,一些旧的 binlog 文件在过期时间之后会自动被删除。

    show binary log status;
    +---------------+----------+--------------+------------------+-------------------+
    | File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +---------------+----------+--------------+------------------+-------------------+
    | binlog.000052 |      158 |              |                  |                   |
    +---------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    可以看到,我们当前的 MySQL 实例使用的是 binglog.000052 这个文件,查看该文件的内容:

    Shell > /usr/local/mysql8/bin/mysqlbinlog /usr/local/mysql8/data/binlog.000052
    
    # The proper term is pseudo_replica_mode, but we use this compatibility alias
    # to make the statement usable on server versions 8.0.24 and older.
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #251106 20:07:13 server id 1  end_log_pos 127 CRC32 0xfae255e7  Start: binlog v 4, server v 8.4.6 created 251106 20:07:13 at startup
    # Warning: this binlog is either in use or was not closed properly.
    ROLLBACK/*!*/;
    BINLOG '
    cY8MaQ8BAAAAewAAAH8AAAABAAQAOC40LjYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAABxjwxpEwANAAgAAAAABAAEAAAAYwAEGggAAAAAAAACAAAACgoKKioAEjQA
    CigAAAHnVeL6
    '/*!*/;
    # at 127
    #251106 20:07:13 server id 1  end_log_pos 158 CRC32 0xc4d82385  Previous-GTIDs
    # [empty]
    SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
    DELIMITER ;
    # End of log file
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
  • *.pem - 未加密的文本证书文件或私钥文件

  • home、world、sys、performance_schema、mysql - 这五个目录对应着数据库的 5 个库

  • HOME01.pid - 当前 MySQL 实例的 pid 文件,文件内容即当前 MySQL 进程的 pid

    Shell > cat /usr/local/mysql8/data/HOME01.pid
    1972
    
    Shell > ps -lef  | grep 1972 | grep -v grep
    4 S mysql       1972    1642  0  80   0 - 713589 x64_sy 20:07 pts/0   00:00:08 /usr/local/mysql8/bin/mysqld --basedir=/usr/local/mysql8/ --datadir=/usr/local/mysql8/data --plugin-dir=/usr/local/mysql8//lib/plugin --user=mysql --log-error=/usr/local/mysql8/data/mysqld_start.err --pid-file=HOME01.pid --socket=/tmp/mysql.sock --port=3306
  • '#ib_16384_0.dblwr''#ib_16384_1.dblwr' - InnoDB 存储引擎的双写缓冲区文件,由 InnoDB 存储引擎内部管理,通常不需要人工干预。双写缓冲区是保证数据安全的一种重要机制,防止出现 "部分页写入" 的问题。这里的 16384 是当前 MySQL 的实例编号。MySQL innodb 存储引擎的架构图如下,关于架构方面的内容后面还会有详细介绍

    innodb_8.x

  • ib_buffer_pool - 用于提升数据库重启性能的一个特殊文件,它的核心作用是‌保存缓冲池的状态。当 MySQL 服务器正常关闭时,InnoDB 会将当前内存中 Buffer Pool(缓冲池)里缓存的热点数据页的页号信息转储到 ib_buffer_pool 文件中。这样,在数据库下次启动时,InnoDB 就可以预先将这个文件中记录的数据页加载到 Buffer Pool 中,从而让缓冲池能够更快地恢复到关闭前的 "预热" 状态,避免数据库在启动初期因缓冲池为空而导致性能下降。需要注意的是,ib_buffer_pool 文件‌并不存储实际的数据内容‌,它只保存了表空间 ID 和数据页 ID 等元信息,用于标识哪些页是热点数据。

    Shell > cat /usr/local/mysql8/data/ib_buffer_pool
    4294967294,460
    4294967278,327
    4294967279,331
    4294967278,326
    4294967293,131
    4294967293,130
    4294967293,129
    4294967293,128
    4294967293,127
    4294967293,126
    4294967293,125
    4294967293,124
    4294967293,123
    4294967293,122
    4294967293,121
    ...
术语
预热:MySQL 中的一种机制或功能,指的是将磁盘中的数据提前放入到内存缓冲池中,相当于 MySQL 程序自动填充缓存(而不是等待客户端的访问然后逐个缓存),其本质是 LRU(最近最少使用)的算法变体。有了预热,当 MySQL 重启时不会丢失访问的性能。
  • ibdata1 - Innodb data1 的缩写,是 InnoDB 存储引擎的系统表空间文件,用于集中存储多种核心系统数据。表空间 指的是 InnoDB 存储引擎用于组织和管理数据的逻辑存储结构,它最终会映射到磁盘上的一个或多个 物理文件,表空间根据用途可划分为 System Tablespace、File-Per-Table Tablespaces、General Tablespaces、Undo Tablespaces、Temporary Tablespaces

    系统表空间是 InnoDB 的默认表空间,主要包含以下内容:

    • 变更缓冲区(Change Buffer)的存储区域
    • 在 MySQL 8.0.20 之前的版本中还包含双写缓冲区(Doublewrite Buffer)的存储区域,之后版本则位于单独的双写文件中
    • 在 MySQL 8.0 之前的版本中,系统表空间还包含 InnoDB 数据字典
    • 如果表是在系统表空间而非独立表空间或通用表空间中创建的,那么这些表的数据和索引也会存储在系统表空间中

    系统表空间可以有一个或多个数据文件,默认情况下会在数据目录中创建一个名为 ibdata1 的系统表空间数据文件。可通过系统变量 innodb_data_file_path 进行定义,该系统变量可以定义名称、大小和属性。

  • ib_tmp1 - 全局临时表空间,存储临时表的 Undo 信息

  • '#innodb_redo' - 专门用于存放重做日志(Redo log)文件的目录,这些文件记录了事务执行过程中对数据页的物理修改

  • '#innodb_temp' - 会话临时表空间的存放目录,目录下是以 .ibt 后缀结尾的文件,这些文件会在 MySQL 服务器启动时被创建(通常为 10 个文件)。当客户端连接后执行复杂的 DQL 操作(如分组、排序或多表连接等)时,若中间产生的结果集过大且无法在内存中完成,MySQL 就会使用此目录下的文件,当连接会话断开后,占用的临时表空间会被截断并释放回池中(而不是直接删除文件),等待后续新的连接会话重新使用

术语
截断(Truncate) - 快速删除表中的数据,使文件恢复到初始的空白状态
释放(Release) - 被清空的临时表空间文件归还到临时表空间池中,使其可以被后续新的连接会话重新分配和使用
  • mysqld-auto.cnf - 在 MySQL 8.x 版本中引入了新的 persistpersist_only 关键字,可将 set 修改的设置保存到数据目录的 mysqld-auto.cnf 持久化文件中,该持久化文件会被最后加载,即覆盖掉 /etc/my.cnf 中同名的配置。在前面的 《MySQL基础17 — 变量》 文章中见到过了
  • mysqld_start.err - MySQL 的错误日志文件
  • mysql.ibd - InnoDB 存储引擎使用的‌独立表空间文件‌,用于存储表的数据和索引‌
  • mysql_upgrade_history - 记录数据库升级的历史信息,内容主要是如版本号、时间戳等元数据
  • undo_001undo_002 - 回滚表空间文件,用于存储回滚日志
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇