带你读Mysql技术内幕[3]——你所不知道的Mysql文件

前言:本文是自己的阅读《Mysql技术内幕——InnoDB存储引擎》的笔记,主要是为了将阅读和实践结合起来,途中会穿插自己的理解及自己工作中的实践。我理解阅读一本经典的书,无论是技术书籍还是生活数据,带着目的去读,知道书讲得是什么,并且结合自己的理解,输出一定的文字。

文章目录

    • 0. 文件概述
    • 1. 参数文件
      • 1.1 参数
      • 1.2 参数类型
    • 2. 日志文件
      • 1. 错误日志
      • 2. 慢查询日志
      • 3. 查询日志
      • 4. 二进制日志
    • 3. 套接字文件
    • 4. pid文件
    • 5. 表结构定义文件
    • 6. InnoDB存储引擎文件
      • 1. 表空间文件
      • 2. 重做日志文件(redo log file)
    • 7. 总结

0. 文件概述

  1. 参数文件:告诉MYSQL实例启动时在哪里找到数据库文件,并且制定某些初始化参数。
  2. 日志文件:用来记录MYSQL实例对某种条件作出响应时写入的文件。比如错误日志文件、二进制文件、慢查询文件
  3. socket文件:当用UNIX域套接字方式进行连接时需要的文件。
  4. pid文件:MYSQL实例的进程ID文件
  5. MySQL表结构文件:用来存放MYSQL表结构定义文件。
  6. 存储引擎文件:存储真正的记录和索引等数据

1. 参数文件

告诉MySQL实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还会介绍各种参数的类型

默认情况下,mysql会按照一定的顺序在指定的位置进行读取,可以通过命令mysql --help | grep my.cnf查找配合文件
在这里插入图片描述

1.1 参数

mysql中的参数一般是一个键值(key/value)的方式
可以通过 show variables 查看所有的参数,当然也可以加上like进行筛选

可以在表中查询具体的数据

SHOW VARIABLES LIKE 'innodb_buffer%'\G;

1.2 参数类型

  • 动态参数:在mysql实例运行中可以更改
  • 静态参数:在整个实例生命周期中不得进行修改 ,可以理解为是一种只读模式。
    可以通过SET方式对参数值进行修改
SET 
| [global | session ] system_var_name = expr     //global和session判别基于当前会话还是整个生命周期
| [@@global. | @@session. | @@] system_var_name=expr

配合全局设置

SET @@session.read_buffer_size=13421;

2. 日志文件

用来记录MySQL实例对某种条件做出响应时写入的文件。如错误日志文件、二迸制日志文件、慢查询日志文件、查询日志文件等。

1. 错误日志

错误日志文件对MySQL的启动、运行、关闭过程进行了记录。MySQL DBA在遇到问题时应该首先查看该文件以便定位问题。该文件不仅记录了所有的错误信息,也记录一些警告信息或正确的信息。

show variables like 'log_error'\G;

带你读Mysql技术内幕[3]——你所不知道的Mysql文件_第1张图片

2. 慢查询日志

慢查询日志( slow log)可帮助DBA定位可能存在问题的SQL语句,从而进行SQL语句层面的优化。
例如,可以在MySQL启动时设一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。
DBA每天或每过一段时间对其进行检查,确认是否有SQL语句需要进行优化。
该阈值可以通过参数long_query_time来设置,默认值为10,代表10秒。
参数设置

SHOW VARIABLES LIKE 'long_query_time'\G;
// 查看是否开启慢查询日志
SHOW VARIABLES LIKE 'log_slow_queries\G';

带你读Mysql技术内幕[3]——你所不知道的Mysql文件_第2张图片

与慢查询有关的语句,检查是否开启了索引

SHOW VARIABLES LIKE 'log_queries_not_using_indexes'\G;

针对于慢查询,MYSQL数据库提供了mysqldumpslow命令

mysqldumpslow xxx.log

将慢查询日志记录到一张表中,默认放到表slow_log表

-- 查看慢查询表的结构
SHOW CREATE TABLE mysql.slow_log\G;

3. 查询日志

查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到了正确的执行。
默认文件名为:主机名.log。
如查看一个查询日志:

cat  xx.log

4. 二进制日志

二进制日志(binary log)记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作。
因为这类操作对数据本身并没有修改。然而,若操作本身并没有导致数据库发生变化,那么该操作可能也会写入二进制日志。

比如:如果需要监听数据库修改之后,再做其他的动作,可以监听二进制日志的变化

主要作用

  1. 恢复(recovery):某些数据的恢复需要二进制日志,例如,在一个数据库全备文件恢复后,用户可以通过二进制日志进行point-in-time的恢复。
  2. 复制( raplication):其原理与恢复类似,通过复制和执行二进制日志使一台远程的MySQL数据库(一般称为slave或standby)与一台MySQL数据库(一般称为mastcr或primary)进行实时同步。
  3. 审计(audit):用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。

查看二进制文件的路径

show variables like 'datadir';

带你读Mysql技术内幕[3]——你所不知道的Mysql文件_第3张图片
如下命令会影响二进制日志记录的信息和行为:

  1. max_binlog_size:单个二进制文件的最大值,超过该值会产生新的binlog
  2. binlog_cache_size:所有未提交的二进制日志会被记录到缓存中,提交后再将缓存中写入到二进制日志中,该值用于确定缓存大小。默认32k。
  3. sync_binlog:设置为1时,同步写磁盘来写二进制日志;设置为0时,使用Innodb引擎来进行复制。
  4. binlog_do_db:表示需要写入哪些库的日志。默认为空,表示同步所有库。
  5. binlog_ignore_db:表示需要忽略写入哪些库的日志。默认为空,表示同步所有库。
  6. log-slave_update:用于主备复制
  7. binlog_format:记录二进制日志文件格式。
    • STATEMENT:记录的是逻辑SQL格式。
    • ROW:记录表的行更改情况,一般设置为这种模式,可以为数据库恢复和复制带来更好的性能,但是空间消耗更大。
    • MIXED:混合模式。
设置方式
SET SESSION binlog_format='ROS'\G;

如何查看二进制文件

mysqlbinlog --start-position=20 binlog.000018

3. 套接字文件

当用UNIX域套接字方式进行连接时需要的文件。
查看套接字文件:

show variables like 'socket'\G;

4. pid文件

MySQL实例的进程ID文件。
当MySQL实例启动时,会将自己的进程ID写入一个文件中——该文件即为pid文件。
该文件可由参数pid_file控制,默认位于数据库目录下,文件名为主机名.pid:

show variables like 'pid_file'\G;

5. 表结构定义文件

用来存放MySQL表结构定义文件,以frm为后缀名的文件。

6. InnoDB存储引擎文件

因为MySQL表存储引擎的关系,每个存储引擎都会有自己的文件来保存各种数据。

1. 表空间文件

将存储数据按照表空间进行存放(可以设置每个表一个表空间),默认情况下,会有一个初始化大小为10MB,名为ibdata1的文件
设置方式

innodb_data_file_path = 'xxx'
//可以设置每个表一个表空间
SHOW VARIABLES LIKE 'innodb_file_per_table'\G;

带你读Mysql技术内幕[3]——你所不知道的Mysql文件_第4张图片

2. 重做日志文件(redo log file)

主要作用:用于保证数据的稳定性,例如,数据库由于所在主机掉电导致实例失败,InnoDB存储引擎会使用重做日志恢复到掉电前的时刻,以此来保证数据的完整性。这也就是事务中持久化的保证。

记录对于InnoDB存储引擎的事务日志

  • ib_logfile0
  • ib_logfile1

同样是记录事务,二进制日志和重做日志文件区别?

  1. 二进制日志会记录myqsl所有的日志,包括其他存储引擎的,而redo log只会记录Innodb存储引擎的事务日志。
  2. 二进制日志记录的是事务具体操作的逻辑日志,redo log记录的是每页的更改物理情况。
  3. 写入时间不同,二进制日志仅在事务提交前进行提交,只写入磁盘一次;而redo log会不断的被写入。

注意:重做日志不是直接写入,而是先写入一个重做缓冲区,然后再按照一定的顺序写入到文件中。

如何做到持久化?
每当有事务提交时,必须确保事务都已经写入重做日志文件(写入到磁盘),如果数据库发生意外宕机时,可以通过重做日志文件恢复,并且可以保证已经提交的事务。

7. 总结

本篇文章主要介绍数据库中的一些文件,包括各个文件的作用,其中二进制文件(binlog)和重做日志文件(redo log)尤其重要,前者可以用来恢复和复制数据库,后者用来确保事务的持久性。

思考题:如果保证事务的隔离性和原子性呢?

你可能感兴趣的:(msyql)