mysql数据库逻辑文件存放地址,MySQL数据库及InnoDB存储引擎的日志文件

本文主要是介绍mysql数据库逻辑文件存放地址,MySQL数据库及InnoDB存储引擎的日志文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击关注万能小皇子,尊享每日新鲜互联网资讯热辣点评

船头上迎面而来的海风特别有劲道但却总有种苦咸的味道,他睁着通红的眼睛,紧绷着嘴。尽管眼前一望无垠的海面平静如清晨的托雷维耶哈盐湖湖面,但他的心仍然翻涌着昨晚暴风雨中的激浪。这是离开陆地,在海上航行这么久以来最可怕的一晚。

船帆在暴风中被撕开一道口子,桅杆眼看着就要被折断,他赶紧指示水手长去抢救。巨浪打在他身上,如果不是大副及时的帮助,他也许已经被冲得撞在舱门上粉身碎骨。恐怖吗?恐怖,这也许是他在海上离死亡最近的一次。但黄金、香料、珠宝和宝石的影子在他脑中浮现,对财富的欲望战胜了恐惧。也许是幸运女神的眷顾,那夜海上的暴风雨没有击垮他的船队。

思绪再次回来了眼前,他凝视着船头激起的浪花在明媚的阳光的照耀下如金子般闪耀,似乎散发着财宝独有的色彩。“哥伦布船长,前面有陆地!”,在瞭望台上的水手长对他喊到。迎面而来的海风似乎没有了苦咸的味道,通红的眼睛闪着光芒,哥伦布紧绷着的嘴角也渐渐上扬。

哥伦布发现美洲新大陆是大航海时代的一个重要标志。而后世人要研究当时航海先驱们的惊险旅程,首先需要看的就是航海日志。像哥伦布的航海日志就让后人得知当时他的心路历程。

除了在航海领域,日志在其它领域的重要程度也是非常高的。如在MySQL领域,数据库的日志与InnoDB存储引擎的日志对深入了解数据的运作起到非常关键的作用。下面就让我用思维导图的方式带你去一趟关于MySQL数据库及InnoDB存储引擎日志文件的旅程。

51691e9903ada00e1def6492d0d3a316.png

我们首先来看一下MySQL数据库的日志文件。

1,MySQL数据库的日志文件

7456648dc30fcfc5b9feb3e7c81c3c1e.png

MySQL数据库的日志文件记录了影响 MySQL 数据库的各种类型的活动。MySQL数据库的日志文件可以分为4大类,分别是:

错误日志(error log)慢查询日志(slow query log)查询日志(log)二进制日志(binlog)

acb3d7a6b6fcfc13ad94035a444d9920.png

1.1 错误日志(error log)

错误日志文件会对整个MySQL启动、运行以及关闭的过程进行记录,除了记录错误信息以外,还会记录一些告警信息和正确的信息。当在启动MySQL的时候如果遇到错误,首先可以查看错误日志。

a1f63d857fde8224caf67ff015e56186.png

1.2 慢查询日志(slow query log)

慢查询日志是可以帮助定位可能存在问题的 SQL 语句,以便在 SQL 语句层面进行优化。可以通过参数slow_query_log来设置是否记录慢查询日志。

MySQL 会在运行时将超过一定时间阈值的所有 SQL 语句都记录到慢查询日志中。如果SQL的运行时间刚好等于阈值的话就不会记录。慢查询只记录运行花时间大于阈值的SQL。通过参数 long_query_time 来是指定慢SQL的阈值。

在生产环境中,SQL如果在运行时没有使用索引的话,可能会出现运行非常慢的情况。我们可以通过设置参数 log_queries_not_using_indexes 来让MySQL数据库将没有使用索引的SQL记录到慢查询日志文件中,便于查询。没有使用索引的SQL虽然可以帮助我们找出那些可能存在问题的SQL,但如果非常频繁地记录到慢查询日志文件的话,文件大小会过快增长,可能会导致生产问题,因此我们需要权衡记录的频率。此时我们可以使用参数 log_throttle_queries_not_using_indexes。这个参数用于设置每分钟允许记录到慢查询日志的未使用索引的 SQL 次数,默认为0,即不限制。

慢查询日志既可以记录到文件中,也可以记录到表里面。参数log_output可以指定慢查询的输出格式,默认为FILE(记录到文件中),可以将它设置为TABLE(记录到表中)。当设置为TABLE后可以在mysql.slow_log表中查看慢查询日志。

MySQL 中慢查询日志对于SQL语句的捕获是通过运行时间来进行的,不过在InnoSQL版本中有所增强。InnoSQL版本中增加了逻辑读取(logical reads)和物理读取(physical reads)。逻辑读取是指从磁盘中进行 IO 读取的次数。物理读取是指所有的读取次数,包括对磁盘、缓冲池等地方读取操作。通过参数 slow_query_type可以指定slow log的方式(是InnoSQL 为兼容MySQL原有的运行方式二增加的),值有:

0,表示不将SQL语句记录为slow log中1,表示根据运行时间将SQL语句记录到slow log中2,表示根据逻辑IO次数将SQL语句记录到slow log3,表示根据运行时间及逻辑IO次数将SQL语句记录到 slow log里面

4060c1a5a6a587afdd5adb8c0ec9c080.png

1.3 查询日志(log)

查询日志会记录下MySQL数据库受到的所有请求的信息,不管请求是否有被正确执行。查询日志默认文件名为:主机名.log。通过参数 general_log 可以查看查询日志是否开启。通过参数general_log_file可以查看文件的路径。

500d78cbbcc1fb9288673f1a50856a9a.png

1.4 二进制日志(binlog)

二进制日志(下称binlog)记录了所有对MySQL数据库执行更多的操作,包含了更改的时间等信息。但binlog不会记录SELECT和SHOW等对数据本身没有修改的操作,像变更记录数为0的UPDATE SQL之类的也不会记录。

binlog可以起到恢复(recovery)、复制(replication)、审计(audit)等强大作用,但binlog也会带来一定的性能损失,开启binlog后MySQL数据库的性能可能会有1%左右的下降。不过这1%的性能损失对于binlog所提供的强大作用来看,是可以不用担心的。binlog并不是直接写入到二进制日志文件中的,它会先写入binlog缓存中。对于尚未提交的binlog会先被记录到缓存中,在提交的时候再从缓存中写入二进制日志文件。通过参数binlog_cache_size(默认为32K)可以设置binlog缓存的大小。binlog缓存的大小需要设置在一个合理值上,如果太大的话会导致分配的空间用不完,造成资源的浪费。如果太小的话当一个事务的记录大于binlog缓存大小时,会将日志写入到一个临时文件中。

对于binlog缓存中的数据写入到磁盘中策略,我们可以通过参数sync_binlog进行设置。sync_binlog的默认值为0,即表示MySQL不控制缓存的刷新,刷新的策略交由文件系统来控制。这样设置的性能最好,但一旦出现宕机缓存中未来得及同步的数据会丢失。sync_binlog被设置为1时,表示每次都采用同步写磁盘的方式来写入二进制日志文件。这样做的好处是安全性高,但同时会带来性能的下降,并且存在事务无法回滚的情况(关于“存在事务无法回滚的情况”这一点的详情,大家可以查看思维导图,这里就不展开讨论)。

binlog的格式有STATEMENT、ROW、MIXED三种,可以通过参数binlog_format进行设置。三种值可以实现不同的功能,但同时也带来不同的影响。

设置为STATEMENT时记录的是日志的逻辑SQL语句。这种方式可能会在主从数据库中出现数据不一致的情况,例如SQL仲使用了函数(如uuid)、触发器等,或者设置了READ COMMOTTED级别,会出现更新丢失的情况。设置为ROW时记录的是表中行的更改情况,不存在STATEMENT会有数据不一致的情况。但是二进制日志文件会变得更大,需要更多磁盘空间,主从复制时也会增加网络开销。设置为MIXED时默认按STATEMENT格式保存二进制日志文件,但在下面这些情况下会使用ROW格式:表的存储引擎是NDB;使用了UUID(),USER(),CURRENT_USER(),FOUND_ROWS(),ROW_COUNT()等具有不确定性的函数;使用了INSERT DELAY语句;使用了用户定义的函数;使用了临时表(temporary table);

402089527d9e963e2a690b98361315b9.png

2,InnoDB存储引擎的日志文件

f23a7765bf790ecfe3a6274f68702867.png

2.1 重做日志文件

InnoDB存储引擎的重做日志用于记录InnoDB存储引擎的事务日志,在存储介质或实例出现问题时,对恢复数据有非常大的作用。

2.1.1 重做日志文件组

每个InnoDB存储引擎至少有1个重做日志文件组,可以设置多个镜像日志组(mirrored log groups),不同文件组可以存放在不同的磁盘上从而提高重做日志的高可用性。

42a99f9c119117d32d8a9728bb41fd94.png

2.1.2 重做日志文件

重做日志文件位于InnoDB存储引擎的数据目录下,至少有两个,默认名称为ib_logfile0与ib_logfile1。同一个日志组中的重做日志文件的大小相同,采用循环写入的方式。引擎先写ib_logfile0,当ib_logfile0写满后会切换到写ib_logfile1。当ib_logfile1也写满后,就又会重新切换到写ib_logfile0。

10744419dc7a597551a0f6cc4dc8f0d2.png

2.1.3 重做日志的capacity变量

重做日志的capacity变量表示最后的检查点不能超过capacity的值,一旦超过就必须将缓冲池(innodb buffer pool)里面脏页列表(flush list)中的一部分脏页刷新会磁盘中,这样会导致用户线程出现阻塞。

a6097d435306819d6feb66d592a1e286.png

2.1.4 重做日志与二进制日志的区别

重做日志与二进制日志看着很相似,但两者其实还是有不小的差别的。

记录的日志记录的区别。InnoDB存储引擎重做日志只记录与InnoDB存储引擎本身有关的事务日志。二进制日志会记录所有域MySQL数据库有关的日志记录(包括其他存储引擎的日志)记录的内容区别。InnoDB存储引擎的重做日志文件记录的是关于每个页的更改的物理情况。二级制日志文件记录的是关于个事务的具体操作内容,也就是逻辑情况写入时间的区别。重做日志文件再事务进行的过程中会被不断写入重做日志条目(redo entry)。二进制日志文件只在事务(不论这个事务有多大)提交前写入磁盘。

0e21ee1be457d192eb139d47bdc612b1.png

2.1.5 重做日志条目(redo entry)

重做日志条目分为4部分,格式为:redo_log_type|space|page_no|redo_log_body。

redo_log_type 表示重做日志类型,占1个字节。space 表示表空间的ID,因为进行了压缩,所以占用的空间可能会小于4个字节。page_no 表示页的偏移量,进行过压缩。redo_log_body 表示每个重做日志的数据部分。在进行恢复时,需要调用对应的函数才能成功解析。

0654a241afd28b9cee77234ef6343e45.png

2.1.6 重做日志缓冲(redo log buffer)

重做日志会先写入到重做日志缓冲中,然后再根据一定的条件顺序来写入到重做日志文件中。重做日志缓冲向磁盘写入时是按照一个扇区的大小(512个字节)进行写入的。扇区是写入的最小单位,所以可以保证写入操作是一定会成功的,并且重做日志的写入过程不需要有doublewrite。

重做日志从重做日志缓冲写入到磁盘中是按照一定条件进行的,会根据参数innodb_flush_log_at_trx_commit配置的值进行控制。

值为0,表示事务被提交是不将事务的重做日志写到磁盘的重做日志文件中,而是等待主线程的每秒刷新。无法保证在数据库,或操作系统,甚至服务器出现宕机时可以通过重做日志文件进行恢复,有可能丢失部分事务值为1,在执行commit时将重做日志缓冲同步写入磁盘中(会有fsync调用)。可以保证即使宕机也能从重做日志中恢复已提交的事务值为2,重做日志会采用一步的方式写到磁盘,即利用文件系统的缓存。可保证在数据库宕机而操作系统或服务器正常时从重做日志中恢复数据(因为事务日志保存在文件系统的缓存里),但操作系统或服务器宕机时数据还是会丢失

70a182afeb04d8a4f6273e8784826666.png

参考资料:《mysql技术内幕 innodb存储引擎》

举报/反馈

这篇关于mysql数据库逻辑文件存放地址,MySQL数据库及InnoDB存储引擎的日志文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/206716

相关文章

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock