千金良方:MySQL性能优化金字塔法则
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 数据目录结构

本节我们从整体上来看MySQL Server包含哪些与数据相关的磁盘文件(包括数据文件和日志文件)。不同的存储引擎会有不同的数据文件,这里我们以MySQL官方版本中默认支持的存储引擎为例进行简要说明。

# 使用如下两个命令搜索datadir下的所有文件
[root@localhost~]#tree/home/mysql/data/mysqldata1/*|grep-Ei'.frm|.myi|.myd|.ibd'\|awk -F '.' '{print $2}' |sort |uniq -c
    236 frm
    36 ibd
    11 MYD
    11 MYI
[root@localhost ~]# tree /home/mysql/data/mysqldata1/* | grep -Eiv '.frm|.myi|.myd|.ibd'
/home/mysql/data/mysqldata1/binlog
├—— mysql-bin.000001
└—— mysql-bin.index
/home/mysql/data/mysqldata1/innodb_log
├—— ib_logfile0
└—— ib_logfile1
/home/mysql/data/mysqldata1/innodb_ts
└—— ibtmp1
/home/mysql/data/mysqldata1/log
└—— error.log
├—— auto.cnf
├—— localhost.log
|  ├—— db.opt
├—— mysql
|  ├—— db.opt
|  ├—— general_log.CSM
|  ├—— general_log.CSV
|  ├—— slow_log.CSM
|  ├—— slow_log.CSV
├—— performance_schema
|  ├—— db.opt
├—— qfsys
|  ├—— db.opt
├—— sbtest
|  ├—— db.opt
└—— sys
    ├—— db.opt
    ├—— sys_config_insert_set_user.TRN
    ├—— sys_config.TRG
    ├—— sys_config_update_set_user.TRN
/home/mysql/data/mysqldata1/relaylog
/home/mysql/data/mysqldata1/slowlog
├—— slow-query.log
/home/mysql/data/mysqldata1/sock
├—— mysql.pid
├—— mysql.sock
└—— mysql.sock.lock
/home/mysql/data/mysqldata1/tmpdir
/home/mysql/data/mysqldata1/undo
├—— undo001
├—— undo002
├—— undo003
└—— undo004
# 如果是备库,还会有relaylog等文件,类似如下
/home/mysql/data/mysqldata1/relaylog
├—— mysql-relay-bin.000001
└—— mysql-relay-bin.index
# 另外,加上自定义的MySQL配置文件my.cnf

从上述信息中整理出的文件列表如下。

(1)配置文件:my.cnf。MySQL读取配置文件的顺序为(非Windows系统)/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf、~/.my.cnf,可以使用mysql --help |grep '/etc/my.cnf'命令查看。如果启动MySQL时没有显式指定配置文件,则MySQL会依次按照该顺序进行读取,直到读取到最后一个配置文件为止。其间,如果读取到相同的配置参数,则以最后读取到的配置参数值为准,覆盖前面的相同参数值。

(2)数据文件:.frm、.MYI、.MYD、.ibd、.ibdata*、.ib_logfile*、undo*、ibtmp1、auto.cnf、db.opt、.CSM、.CSV、.TRN、.TRG。

● .frm:表结构定义文件。

● .MYI:MyISAM存储引擎索引文件。

● .MYD:MyISAM存储引擎数据文件。

● .ibd:InnoDB存储引擎独立表空间文件。

● .ibdata*:InnoDB存储引擎共享表空间文件。

● .ib_logfile*:InnoDB存储引擎redo log文件。

● undo*:InnoDB存储引擎独立undo文件。

● ibtmp1:InnoDB存储引擎临时表空间文件。

● auto.cnf:用于存放MySQL实例的全局唯一的server-uuid的文件。

● db.opt:用于存放MySQL实例的schema级别的默认字符集和默认校对规则的文件。

● .CSM:用于存放CSV存储引擎的元数据等相关信息的文件。

● .CSV:用于存放CSV存储引擎的数据文件,每行数据的列值之间使用逗号分隔。

● .TRN:用于存放与触发器相关的元数据。

● .TRG:用于存放触发器定义语句以及与定义相关的信息。

(3)日志文件:error.log(error log)、localhost.log(general log)、mysql-bin.*(binlog)、mysql-relay-bin.*(relay log)、slow-query.log(slow log)。

● error.log(error log):错误日志,记录着MySQL启动之后mysqld打印的相关信息。错误日志文件在MySQL Server启动之后必须存在;否则,在使用mysqld_safe启动数据库时会因为找不到错误日志文件而报错,终止启动过程(如果直接使用mysqld程序来启动数据库,则不会有这个问题,因为mysqld进程发现错误日志不存在时会重新创建)。

● localhost.log(general log):一般查询日志,启用该日志之后,在MySQL Server中执行的所有SQL语句都会被记录。查询日志可以在MySQL Server启动之后动态开关、自动创建。

● mysql-bin.*(binlog):二进制日志,用于复制架构中的数据同步(从库I/O线程从主库读取),MySQL Server中涉及数据变更的SQL语句都会被记录,可以指定单个文件的大小,写满指定大小的文件之后自动切换到一个新文件。

● mysql-relay-bin.*(relay log):中继日志,用于复制架构中的数据同步(从库I/O线程从主库读取binlog之后写入自身的中继日志中)。

● slow-query.log(slow log):慢查询日志,SQL语句的执行时间超过指定时间,被认为执行缓慢,会被记录到该文件中。

(4)其他文件:mysql.pid(pid)、mysql.sock(socket)、mysql.sock.lock(socket lock)。

● mysql.pid(pid):MySQL Server启动之后存放进程号的文件。

● mysql.sock(socket):MySQL Server启动之后用于本地UNIX Domain通信的sock文件。

● mysql.sock.lock(socket lock):MySQL Server启动之后用于锁定本地socket文件的锁标记文件。这是MySQL 5.7.x版本中新增的,如果MySQL Server非正常关闭,该文件可能残留而导致MySQL重新启动失败,删除该文件重新启动即可。

在MySQL 8.0中,数据字典库performance_schema、mysql、sys中的所有MyISAM存储引擎都改为使用InnoDB存储引擎,且所有的.frm文件也不见了,表结构文件和视图等定义信息都被放到了InnoDB存储引擎的数据字典表中,performance_schema数据字典表和mysql下的general_log、slow_log表特殊,因为不支持事务,所以使用了新的.sdi后缀的文件来代替,该文件中记录的是JSON格式的表结构描述信息