想学明白MySQL,得先捋一捋核心的文件

3,078 阅读6分钟

​「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

摘要:工作中要用到MySQL,面试被问到MySQL,此文对MySQL的文件结构做了详细的阐述

🍁 1.简介

MySQL主要文件类型有如下几种:
1.参数文件:MySQL实例启动的时候在哪里可以找到数据库文件,
并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还介绍了参数类型以及定义作用域。
2.日志文件:记录 MySQL对某种条件做出响应时候写入的文件,
包括错误日志、慢查询日志、全查询日志、二进制日志、中继日志、Redo 日志、Undo 日志
3.Socket文件:当用 linux 的 mysql 命令行窗口登录的时候需要的文件
4.Pid 文件:mysql 实例的进程文件
5.MySQL表结构文件:存放 MySQL表结构定义文件
6.存储引擎文件:记录存储引擎信息的文件。

image.png

🍁 2. 参数文件

✨2.1 参数文件的位置

image.png

默认的参数文件为/etc/my.cnf,但是也不排除其他位置的参数文件,具体要看启动的命令。 
在 mysqld 启动的时候,可以加上--defaults-file 参数,
该参数指定了参数文件的名称。 Linux中的默认位置为:/etc/my.cnf

✨2.2 参数文件内容

[mysqld]
#basedir=/usr/local/mysql
basedir=/usr/local/mysql5730
datadir=/usr/local/mysql/data
port=3306
#socket=/tmp/mysql.sock
log-error=/usr/local/mysql/data/log.err
server_id=55623306
log-bin
skip-name-resolve
character_set_server=utf8mb4

🍁 3.socket 文件

Linux 系统下 本地连接 mysql 可以采用 linux 域套接字 socket 方式 , 
需要一个套接字 socket 发文件, 
可以由参数 socket控制,一般默认在/tmp 目录下, 
也可以通过如下 2 种方式查看:

✨3.1 操作系统查找

-bash-4.1$ ps -ef | grep mysql

image.png

✨3.2 命令行查找

mysql> show variables like ‘socket’;

image.png

如果 socket 录 文件丢失,那么会导致不能从本地登录 mysql ,可以通过重启的方式来重新生成。

🍁4.pid 文件

当 mysql 实例启动的时候,会将自己的进程 id 写入一个文件中,
该文件即为 pid 文件,由参数 pid_file 控制,
默认路径位于数据目录下,可以通过以下方式查看:
mysql> show variables like '%datadir%';
mysql> show variables like 'pid_file';

image.png

🍁5.表结构文件

innodb_data_file_path 用来指定 innodb tablespace 文件,
如果我们不在 My.cnf 文件中指定innodb_data_home_dir 和 innodb_data_file_path 
那么默认会在 datadir 目录下创建 ibdata1 作为 innodb tablespace。
当你启用了 innodb_file_per_table,表被存储在他们自己的表空间里,
但是共享表空间仍然在存储其它的 InnoDB 内部数据:
✓ 数据字典,也就是 InnoDB 表的元数据
✓ 变更缓冲区
✓ 双写缓冲区
✓ 撤销日志

✨5.1 frm

frm为表结构文件 
[root@Jeames pecvd]# strings aoi.frm

✨5.2 ibd

ibd为数据文件
[root@Jeames pecvd]# strings aoi.ibd

🍁6.日志文件

日志文件记录了影响 mysql 数据库的各种类型活动, 
常见的日志文件有:
错误日志
二进制日志
慢查询日志
全查询日志
redo 日志
undo 日志

✨6.1 错误日志

错误日志对 mysql的启动、运行、关闭过程进行了记录,
mysql dba 在遇到问题时候,第一时间应该查看这个错误日志文件,
该文件不但记录了出错信息,还记录了一些警告信息以及正确信息,
这个 error 日志文件类似于 oracle 的 alert 文件,只不过默认情况下是以 error 结尾。
可以通过 show variables like 'log_error';
DBA 在遇到问题的时候,第一时间应该查看这个错误日志文件,
该文件不但记录了出错信息,还记录了一些警告信息以及正确信息,
这个 error 日志文件类似于 Oracle的 alert 文件,只不过默认情况下是以 err 结尾。
可以通过“show variables like 'log_error';”命令查看错误日志的路径。
如下所示:

image.png

✨6.2 全查询日志

全查询日志记录了所有对数据库请求的信息,
正确的 SQL 才会被记录下来(错误写法的 SQL 语句不会记录),
包括 show、查询 select 语句、权限不足的语句(ERROR 1044 (42000): Access denied for user)。
默认位置在变量 datadir 下,默认文件名为:主机名.log。
MySQL 的通用查询日志默认情况下是不开启的。当需要进行采样分析时手工开启:
mysql> show variables like 'general_log';

image.png

##日志开启 mysql> SET GLOBAL general_log=1;
mysql> show variables like 'general_log';
默认名称为:变量 datadir 下:主机名.log

✨6.3 二进制日志Binlog

Binlog 是 MySQL 中一个很重要的日志,记录了对数据库进行变更的操作,
但是不包括 select操作以及 show 操作,因为这类操作对数据库本身没有没有修改。
如果想记录 selectshow 的话,那就需要开启全查询日志。
另外 binlog 还包括了执行数据库更改操作时间和执行时间等信息。
binlog 是 MySQL Server 层记录的二进制日志文件。

mysql> show variables like ‘%log_bin%’;

image.png

mysql> flush logs; --滚动日志
mysql> show binary logs;

image.png

二进制的主要作用有如下 2 个:
(1 )恢复 recovery 。某些数据的恢复需要二进制日志,
在全库文件恢复后,可以在此基础上通过二进制日志进行
point-to-time 的恢复(mysqldump 全量恢复+binlog增量恢复)。
(2 )复制(replication )。其原理和恢复类似,
通过复制和执行二进制日志使得一台远程的 mysql数据库(slave)
于一台 mysql 数据库(master)进行实时同步。

✨6.4 慢查询日志

当查询超过一定时间没有返回结果的时候,才会记录进慢查询日志。 
• 慢查询日志可以帮助 DBA 找出执行效率缓慢的 SQL 语句,为数据库优化工作提供帮助。
• 慢查询日志默认是不开启的,建议开启慢查询日志。 
• 当需要进行采样分析时手工开启。

mysql> show variables like ‘%long_query_time%’;

image.png

慢查询日志开启方法如下:
mysql> show variables like ‘%slow_%’;

image.png

mysql> set global slow_query_log=1;
mysql> show variables like ‘%slow_%’;

image.png

✨6.5 Redo

记录 InnoDB 等支持事务的存储引擎执行事务时产生的日志。 
事务型存储引擎用于保证原子性、一致性、隔离性和持久性。 
其变更数据不会立即写到数据文件中,而是写到事务日志中。
事务日志文件名为“ib_logfile0”和“ib_logfile1”,默认存放在表空间所在目录。

查看参数设置:show variables like ‘innodb%log%’;

image.png

✨6.6 undo

image.png

8.0 中的 Undo 日志

开始从 L SQL 理 层面非常方便的管理 Undo 表空间,
MySQL 服务启动后, 默认有两个 Undo 表空间:undo01,undo02。
这两个默认产生的 Undo 表空间文件, 
不能在 SQL 层面来管理。直接删除会被 MySQL 阻止。

mysql> select name from information_schema.innodb_tablespaces where space_type='Undo';

image.png

undo表空间是不能删除的
mysql> drop undo tablespace innodb_undo_001; mysql> show errors;

image.png

✨6.7 中继日志

从主服务器的二进制日志文件中复制而来的事件, 
并保存为二进制的日志文件。 
中继日志也是二进制日志,用来给 slave 库恢复。

相关推荐阅读: MySQL8.0新特性抢先看,性能又双叒提升了
MySQL武林秘籍,SQL学废必过考试
Linux7.6源码安装Mysql8
Oracle巡检脚本大全,服务器可直接部署
MySQL root密码忘记找回妙招
监控神器Zabbix,从部署到应用
Oracle监听日志清除

大家可以点赞、收藏、关注、评论我啦 、有数据库相关的问题随时联系我或交流哟~!

image.png