Mysql系统文件--日志文件、数据文件

系统文件包数据文件、配置文件、pid进程文件、socket网络链接文件,这些文件都可以理解为日志文件。

日志文件分类:

  • 错误日志(error log) :  记录mysql服务的启停时正确和错误的信息,还记录启动、停止、运行过程中的错误信息。默认开启, 查看命令 --- show variables like '%log_error%'
  • 通用查询日志(general query log) :  记录一般查询语句, 查看命令 --- show variables like '%general%'
  • 中继日志(relay log): 主从复制,从服务器保存从主服务器读取的二进制文件中的事件。
  • 二进制日志(binary log / binlog) :  记录了对MySQL数据库执行的更改操作,并且记录了语句的发生时间、执行时长;但是它不记录select、show等不修改数据库的SQL。主要用于数据库恢复和主从复制。
    • show variables like '%log_bin%'; // 是否开启
    • show variables like '%binlog%'; //参数查看
    • show binary logs;// 查看日志文件
  • 慢查询日志(slow query log) : 记录所有执行时间超时的查询SQL, 默认10S
    • show variables like '%slow_query%'; // 是否开启
    • show variables like '%long_query_time%';   // 时长   
  • 重做日志(redo log): 记录的是物理数据页面的修改的信息, 确保事务的持久性。
  • 回滚日志(undo log):  记录事务大声之前的数据的一个版本, 用于事务回滚。

数据文件: 

  • db.opt文件, 记录这个库的默认使用的字符集和校验规则
  • frm文件, 存储与表相关的元数据(meta)信息, 包括表结构的定义信息等, 每张表都有一个frm文件
  • ibd文件、ibdata文件, 存放innoDB的数据文件(包括索引), innoDB存储引擎有两种表空间:独立表空间和共享表空间, 独立表空间使用.ibd文件存放数据, 且一张表对应一个.ibd文件;共享表空间使用.ibdata文件, 所有表共同使用一个或多个(自行配置).ibdata文件。
  • MYD文件,是MyISAM存储引擎专用文件,存放表数据,一张表对应一个.MYD文件
  • MYI文件,是MYISAM存储引擎专用文件,存放索引相关信息, 一张表对应一个.MYI文件
  • ibdata1文件,系统表空间数据文件,存放表元数据、undo日志等
  • ib_logfile0、ib_logfile1文件: redo log日志文件

下面是我本地mysql的系统文件信息

Mysql系统文件--日志文件、数据文件_第1张图片

二进制日志--binlog

binlog日志作用: 

binlog 是记录所有数据库表结构变更及数据变更的二进制日志, 不会记录select 和show 这类操作。binlog日志以事件的形式记录,还包含sql语句执行消耗的时间。开启binlog日志主要有两个应用场景:

  • 主从复制:在主库中开启binlog, 从库从主库的binlog中获取信息存储到自己的relaylog中时间数据同步
  • 数据恢复: 通过mysqlbinlog工具来恢复数据

下面是一段binlog日志信息: 

从中可以看出,binlog日志文件中记录了我们对表的所有操作过程。

binlog日志什么时候产生: 

在事务提交的时候,mysql会一次性将事务中的sql与按照一定的格式记录到binlog中。

binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。

慢查询日志--slow query log

慢查询日志在我们做性能优化时可以帮助我们记录程序运行过程中,查询时间超过预定时间的SQL语句。具体指运行时间超过long_query_time值的SQL,long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志。

慢查询日志相关参数: 

  •  slow_query_log : 是否开启慢查询日志,ON/OFF
  • slow_query_log_file:  慢查询日志路径
  • long_query_time: 慢查询阈值, 当SQL查询时间超过设定的阈值时,记录日志。
  • log_queries_not_using_index: 记录未使用索引的查询语句, ON/OFF
  • log_output: 日志存储方式。 
    • FILE: 日志存入文件, 默认值
    • TABLE:日志存入数据库 mysql.slow_log 

查看这些参数的设置使用show variables 语句即可查询, 设置参数值使用 set global 语句, 如开启慢查询: set global slow_query_log=1;   这里,1--ON, 0--OFF

但是, 这里慢查询的设置只对本次服务有效, 一旦mysql服务重启, 需要重新设置, 如果要永久设置, 需要修改my.cnf文件,增加或修改对应的参数值,然后重启mysql。不过一般慢查询我们只会在需要对系统进行性能优化时才会开启, 手动设置其参数就可以了。

这里介绍个mysql自带的慢查询日志分析工具mysqldumpslow:

mysqldumpslow:

  •  -s:表示按照何种方式排序
    • c: 访问计数
    • l:锁定时间
    • r:返回记录
    • t:查询时间
    • al:平均锁定时间
    • ar:平均返回记录数
    • at:平均查询时间
  • -t : 可以理解为 top n
  • -g: grep 正则表达匹配
# 得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

重做日志(redo log)

redo log保证事务的持久性,防止发生故障时,有未写入磁盘的数据,重启mysql服务时,根据redo log进行重做,从而保证事务的持久性。

redo log在事务开始之后就产生,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中便开始写入redo log文件中。

redo log 相关参数: 

  • innodb_log_group_home_dir : 指定日志文件组所在的路径, 默认./ , 表示数据库的数据目录
  • innodb_log_files_in_group :指定重做日志文件组中文件的数量, 默认2
  • innodb_log_file_size:重做日志文件的大小
  • innodb_mirrored_log_groups :制定日志镜像文件组的数量, 默认1,5.7中被移除

redo log文件写入过程:

innodb存储引擎先将重做日志写入到innodb_log_buffer中, 默认大小为8M, 然后通过下面三种方式从缓冲区将日志刷新到磁盘日志中:

  • Master Thread每秒一次执行刷新innodb_log_buffer 到重做日志文件
  • 每个事务提交时将重做日志刷新到重做日志文件
  • 当缓存区可用空间小于一半时,重做日志缓存被刷新到redo log文件中

        由此可以看出,重做日志通过不止一种方式写入到磁盘,尤其是对于第一种方式,Innodb_log_buffer到重做日志文件是Master Thread线程的定时任务。因此重做日志的写盘,并不一定是随着事务的提交才写入重做日志文件的,而是随着事务的开始,逐步开始的。

另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:

即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。
这一点是必须要知道的,因为这可以很好地解释再大的事务的提交(commit)的时间也是很短暂的。

回滚日志(undo log)

undo log 保存了事务发生之前的数据的一个版本,用于回滚操作,同事可以提供多版本并发控制下的读(MVCC) 。 

事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性。

undo log中存储的是逻辑格式日志信息, 记录各个事务之间前后链路关系,仅仅是将数据从逻辑上恢复至事务之前的状态。

释放日志:

当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

undo log的相关参数配置:

  • innodb_undo_directory : undo log的独立表空间存放目录
  • innodb_undo_logs :回滚段大小
  • innodb_undo_tablespaces : undo log 文件个数

你可能感兴趣的:(mysql,mysql)