# mysql文件

## 一、简介

我们在学习和使用mysql中，不可避免的涉及到与mysql相关的文件打交道，了解mysql文件更有助于理解mysql的运行原理和日常使用。mysql的文件主要包括几种类型：

* 配置文件：指定一些mysql运行的参数，比如在哪可以找到数据库文件，内存结构大小等；
* 日志文件：用来记录影响mysql实例的文件，比如错误日志、二进制日志、慢查询日志、查询日志等；
* socket文件：当用Unix域套接字方式进行连接时需要的文件；
* pid文件：mysql实例的进程id文件；
* mysql表结构文件：用来存放mysql表结构定义文件；
* **存储引擎文件**：存储记录和索引等数据；

## 二、配置文件

使用下面的命令可以查看mysql的配置文件：

```
# 左边的优先加载，如果都没有就使用代码中的默认配置
$ mysql --help|grep cnf
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
```

在mysql中有动态参数和静态参数，动态参数可以再mysql运行期间修改，比如事务的隔离级别。查看修改配置：

```
# 查看全局参数
show global variables；
show global variables like '%name%';
# 修改全局参数
set global read_buffer_size=8192;
# 查看当前会话参数
show variables；
show variables like '%name%';
# 修改当前会话参数
set read_buffer_size=8192;
```

## 三、日志文件

日志文件记录了影响mysql数据库的各种类型的活动。mysql数据库常见的日志文件有：错误日志、二进制日志、慢查询日志和查询日志。

* 错误日志：记录mysql启动、运行、关闭过程。使用`show variables like '%log_error%';`查看日志位置；、
* 慢查询日志：记录查询慢的语句，帮助定位可能存在问题以及可以优化的SQL，通过设置一个值，大于这个值的sql语句就会被记录到慢查询日志中；
* 查询日志：记录了所有对mysql请求的信息，无论这些请求是否得到了正确执行。查看查询日志是否打开和位置：

  ```
  > show variables like '%general_log%';
  +------------------+-----------------+
  | Variable_name    | Value           |
  +------------------+-----------------+
  | general_log      | OFF             |
  | general_log_file | raspberrypi.log |
  +------------------+-----------------+
  2 rows in set (0.004 sec)
  ```

  和慢查询日志一样，可以设置`log_output=TABLE`将查询记录记录在mysql.general\_log表中；
* 二进制日志：记录了对mysql数据库执行的所有更改操作，但不包括select和show这类操作，因为这类操作并没有对mysql进行修改，若操作本身没有导致数据库发生变化可能也会写入二进制文件，二进制日志可以用于数据的恢复、复制和审计；

## 四、Socket文件

在UNIX系统下本地连接mysql可以采用UNIX域套接字方式。这种方式需要一个套接字（socket）文件。

```
> show variables like 'socket';
+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| socket        | /run/mysqld/mysqld.sock |
+---------------+-------------------------+
```

## 五、pid文件

当mysql实例启动时，会将自己的进程id写入一个文件中，即pid文件。

```
> show variables like '%pid_file%';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| pid_file      | /run/mysqld/mysqld.pid |
+---------------+------------------------+
```

## 六、表结构定义文件

mysql数据存储是根据表划分的，mysql对于每一张表都有一个frm为后缀的文件来存储表结构定义。frm文件还用来存放视图的定义，如用户创建了一个v\_a视图，那么对应地会产生一个v\_a.frm的文本文件，用来记录视图的定义。

通过`show variables like '%datadir%';`查看表结构定义文件存储位置，下面是一个视图的表结构定义文件：

```
root@raspberrypi:/var/lib/mysql/test# cat v_test.frm 
TYPE=VIEW
query=select `test`.`test`.`id` AS `id`,`test`.`test`.`name` AS `name` from `test`.`test` where `test`.`test`.`id` = \'5\'
md5=d7463ae9e9d4606bcd1ea22b1836fdd4
updatable=1
algorithm=0
definer_user=wangjun
definer_host=localhost
suid=2
with_check_option=0
timestamp=2020-06-03 11:25:30
create-version=2
source=select id,name from test where id=\'5\'
client_cs_name=utf8mb4
connection_cl_name=utf8mb4_general_ci
view_body_utf8=select `test`.`test`.`id` AS `id`,`test`.`test`.`name` AS `name` from `test`.`test` where `test`.`test`.`id` = \'5\'
mariadb-version=100315
```

## 七、存储引擎文件
