熬夜整理,我把MySQL最核心的文件撸干净了

Posted IT邦德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熬夜整理,我把MySQL最核心的文件撸干净了相关的知识,希望对你有一定的参考价值。

作者:IT邦德
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程
(Web\\java\\Python)工作,主要服务于生产制造
现拥有 Oracle 11g  OCP/OCM、
mysql、Oceanbase(OBCA)认证
分布式TBase\\TDSQL数据库、国产达梦数据库以及红帽子认证
从业8年DBA工作,在数据库领域有丰富的经验

擅长主流数据Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。

前言

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

一、导读

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

二、参数文件

2.1 参数文件的位置

默认的参数文件为/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

三、 socket 文件

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

3.1 操作系统查找

-bash-4.1$ ps -ef | grep mysql

3.2 命令行查找

mysql> show variables like ‘socket’;

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

四、 pid 文件

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

五、表结构文件

innodb 包括 ibd 和 frm,当你启用了 innodb_file_per_table,表被存储在他们自己的表空间里。
mysql> show variables like 'innodb_file_per_table';

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

六、日志文件

日志文件记录了影响 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';”命令查看错误日志的路径。
如下所示:

6.2 全查询日志

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

mysql> show variables like 'general_log';

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

6.3 二进制日志Binlog

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

mysql> show variables like ‘%log_bin%’;

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

二进制的主要作用有如下 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%’;

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

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

6.5 Redo

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

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

6.6 undo


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';

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

6.7 中继日志

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

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻

以上是关于熬夜整理,我把MySQL最核心的文件撸干净了的主要内容,如果未能解决你的问题,请参考以下文章

3天,我把MySQL索引锁事务分库分表撸干净了!

3天,我把MySQL索引锁事务分库分表撸干净了!

3天,我把MySQL索引锁事务分库分表撸干净了!

3天,我把MySQL索引锁事务分库分表撸干净了!

3天,我把MySQL索引锁事务分库分表撸干净了!

3天,我把MySQL索引锁事务分库分表撸干净了!