概述
本章,您将学习 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 存储引擎的架构图如下,关于架构方面的内容后面还会有详细介绍
-
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 ...
-
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 就会使用此目录下的文件,当连接会话断开后,占用的临时表空间会被截断并释放回池中(而不是直接删除文件),等待后续新的连接会话重新使用
释放(Release) - 被清空的临时表空间文件归还到临时表空间池中,使其可以被后续新的连接会话重新分配和使用
- mysqld-auto.cnf - 在 MySQL 8.x 版本中引入了新的
persist和persist_only关键字,可将set修改的设置保存到数据目录的 mysqld-auto.cnf 持久化文件中,该持久化文件会被最后加载,即覆盖掉 /etc/my.cnf 中同名的配置。在前面的 《MySQL基础17 — 变量》 文章中见到过了 - mysqld_start.err - MySQL 的错误日志文件
- mysql.ibd - InnoDB 存储引擎使用的独立表空间文件,用于存储表的数据和索引
- mysql_upgrade_history - 记录数据库升级的历史信息,内容主要是如版本号、时间戳等元数据
- undo_001 和 undo_002 - 回滚表空间文件,用于存储回滚日志











