概述

本文主要讲述MySQL数据库和Innodb存储引擎表的各种类型文件,主要包括如下内容:

  • 参数文件

  • 日志文件

  • socket 文件

  • pid文件

  • MySQL表结构定义文件

  • 存储引擎文件

参数文件

启动时它告诉MySQL实例,在哪里可以找到数据库相关文件,除此之外参数文件中还指定某些初始化参数。

<linux参考:my.cnf,windows参考:my.ini>

类似Oracle的参数文件,但是MySQL如果找不到参数文件,也可以按照默认的初始化参数文件启动。

可以设置的参数非常多,例如:

  • 设置缓冲池大小:innodb_buffer_pool_size=4G
  • 开启二进制日志 binlog: log-bin=mysql-bin

参数包括动态参数和静态参数:

  • 动态参数:可以在mysql运行过程中修改,区别是,有的动态参数只支持修改全局(@@globle)的参数值;而有的只能当前会话(@@session)生效(例如事务的:autocommit);有的既可以是全局生效,又可以仅当前会话生效(例如:read_buffer_size)。

  • 静态参数:业务运行的整个生命周期中都不能修改,只能通过参数文件修改,重启后生效。

日志文件

MySQL常见的日志文件有:

  • 错误日志

  • 慢查询日志

  • 二进制日志

  • 查询日志

错误日志

错误日志记录了mysql启动、运行、关闭过程中发生的错误或预警信息,可以通过如下方式查看错误日志路径。通过错误日志可以得知数据本身需要优化的地方。

慢查询日志

通过满查询日志,可以得知需要优化的SQL;

  • mysql通过参数:long_query_time 参数来控制慢查询日志的记录,默认值:10.0 (10秒);默认不会开

  • 启慢查询日志,需要设置如下参数手动开启,log_slow_queries=ON:

  • log_queries_not_using_indexes 设置为:ON,时会记录没有使用索引的SQL;

查询日志

查询日志记录了所有对MySQL的请求,无论其是否正确执行,默认文件名为:主机名.log。

二进制日志 binary log

二进制日志的配置

二进制日志记录对MySQL数据库执行更改的所有操作:INSERT UPDATE DELETE 等。

二进制日志默认不开启,需要通过配置项开启:

# mysql主从中,不重复的数字
server_id=1996
# 启用binlog开关,log_bin=[name] 如果不指定name,默认为主机名
log_bin = mysql-bin
# binlog模式
binlog_format = ROW
# 日志保留时间
expire_logs_days = 30
# 配置需要监听的库,多个库重复配置该配置项即可
binlog-do-db = supervise
# 单个二进制日志文件大小,单位:bit,默认值:1073741824
max_binlog_size =

通过如下指令可以查看binlog信息:

二进制日志的作用

  • 恢复:某些数据的恢复需要二进制日志,用户可以通过二进制日志进行point-in-time的恢复。

  • 复制:两台mysql 服务器间,通过复制和执行二进制日志来保证数据一致,一般搭建高性能的主从结构时会用到二进制日志(主从复制架构:修改通过master进行,查询通过slave支持,两者之间不能实时同步,存在一定延迟);还有一个非常有名的应用,阿里的canal中间件,它把自己伪装成mysql的从库,接收主库发送的binlog。

  • 审计:可以通过对binlog中的信息进行安全审计,从而判断是否存在对数据库的注入攻击。

二进制日志的保存

二进制日志文件记录的是一个事务的具体操作内容,它是逻辑日志。

二进制日志文件,只在事务提交前写磁盘,即二进制日志只写一次磁盘。

  1. 当开启一个事务,对表中的数据进行操作时,所有未提交的二进制日志会记录到缓存中去,等到该事务提交时,将缓存中的二进制日志写入磁盘上的二进制日志文件中。
  • 配置项:binlog_cache_size可以控制该缓存的大小,默认值为32K,当会话二进制日志超过它时,会将缓存中的日志写入到一个临时文件中,该值不能设置得太大也不能设置得太小。

Binlog_cache_disk_use:二进制文件使用临时文件次数。

Binlog_cache_use:二进制文件使用缓冲次数。

从下图得知,使用临时文件次数为0,那么说明,当前缓冲大小合适,不需要修改。

  1. 在默认情况下,二进制日志并不是每次写的时候就刷新到磁盘
  • 配置项sync_binlog = [N] 表示每当写多少次缓存就写一次磁盘,N=1 表示二进制日志同步写磁盘,当N配置一个比较大的值的时候,可以理解成,使用操作系统的缓冲写磁盘,但是这样可能会因为宕机导致二进制日志丢失。sync_binlog = 1 可以带来高可用,但是性能会有一定的影响。
  1. 已知再使用二进制日志时,当事务提交时会先将二进制日志写入磁盘,再将进行事务提交;如果这时发生了宕机,那么二进制日志写入成功,但是事务没有提交,重启时将会回滚事务,但是二进制日志已经被记录,不能回滚,这时需要开启配置项:innodb_support_xa = 1 ,通过它可以保证二进制日志记录与事务本身提交是一个原子操作。

  2. 二进制日志模式 binlog_format

  • STATEMENT:该模式下二进制日志记录的是SQL语句,它的好处是日志体积小,确定是可靠性低。

  • ROW:该模式下,二进制日志记录的是对表中每一行的修改;该模式下可以将事务隔离级别从 REPEATABLE READ 改为 READ COMMITED 以提高并发性。ROW模式的好处是:可靠性非常高,同样因为会记录每一行,所以磁盘空间开销较大。

      例如对语句:update info_table set column_1 = 'test' where 1 =1。
    二进制日志会记录,每一行的 column_1 被修改为: 'test',而不只是简单的记录该sql。
  • MIXED:混合模式,默认使用STATEMENT 格式记录,但是在一些情况下使用ROW模式记录:

      a. 存储引擎为:NDB,这时DML操作都记录为ROW
    b. 使用了:UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不确定函数
    c. 使用了 INSERT DELAY 语句
    d. 使用了用户定义函数:UDF
    e. 使用了临时表 temporary table

socket 套接字文件

套接字文件,UNIX 系统下,本地连接MySQL可以采用UNIX域套接字方式,这种方式需要一个套接字文件。套接字文件由参数socket控制,一般在 /tmp 目录下mysql.sock 文件中。

pid文件

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

MySQL表结构定义文件

在MySQL的插件式的存储体系中,数据以表的形式进行保存,每个表都有与之对应的文件。不论采用何种引擎,MySQL都有一个以frm为后缀的文件记录该表的结构定义。

Innodb 存储引擎文件

存储引擎文件包括:

  • 表空间文件
  • 重做日志文件

表空间文件

Innodb 将存储的数据按表空间进行存放,当设置了 innodb_data_file_path = [/path1/path2:[N]M] 参数后,所有基于innodb引擎的表都会存放到该该共享表空间;当设置了参数:innodb_file_per_table = ON 后,会为每个表创建独立的表空间。

重做日志文件

重做日志(redo log) 对于innodb 非常重要,它记录了Innodb 存储引擎的事务日志。当发生宕机,需要恢复数据时,它能起到非常重要的作用。为了提高重做日志的可用性,应该在不同的磁盘上为重做日志配置多个镜像组。

重做日志文件的大小,也非常重要,如果设置太大,恢复时需要很长时间。但是如果设置太小,那么可能导致一个事务的日志要切换多次重做日志文件;此外,回忆之前提到的checkpoint技术,重做日志太小会当重做日志文件不可用时,会频繁触发checkpoint 导致性能下降。

Innodb存储引擎的重做日志文件记录的是关于每个页的变更情况。

在事务过程中,会不断有重做日志被写到重做日志文件中。

本文来自我对 《MySQL技术内幕:InnoDB存储引擎》一书阅读过后的二次创作,文件颇多截图引用书中插图,此外本文主要用作个人学习后的思考感悟的记录,不如原书讲得深入且全面,强烈建议购买原书深入了解更多的细节。

Innodb存储引擎的文件的更多相关文章

  1. 《Mysql技术内幕,Innodb存储引擎》——文件、表

    文件 日志 错误日志 对Mysql启动.运行和关闭过程进行记录,通过SHOW VARIABLES LIKE 'log_error'查看日志文件位置. 慢查询日志 Mysql启动时设置一个阈值,运行时间 ...

  2. InnoDB存储引擎的表空间文件,重做日志文件

    存储引擎文件:因为MySQL表存储引擎的关系,每个存储引擎都会有自己的文件来保存各种数据.这些存储引擎真正存储了数据和索引等数据. 表空间文件 InnoDB存储引擎在存储设计上模仿了Oracle,将存 ...

  3. MySQL内核:InnoDB存储引擎 卷1

    MySQL内核:InnoDB存储引擎卷1(MySQL领域Oracle ACE专家力作,众多MySQL Oracle ACE力捧,深入MySQL数据库内核源码分析,InnoDB内核开发与优化必备宝典) ...

  4. 018:InnoDB 存储引擎、表空间

    目录 一.InnoDB 存储引擎 1. InnoDB的历史 2. InnoDB的特点 3. InnoDB存储引擎的文件 3.1 概述 3.2 InnoDB - 表空间 3.3 General表空间 3 ...

  5. MySQL数据库和InnoDB存储引擎文件

    参数文件 当MySQL示例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定 ...

  6. InnoDB存储引擎文件

    InnoDB存储引擎文件 MySQL数据库包括数据库本身的文件和存储引擎文件.数据库自身的文件由参数文件(my.cnf).错误日志文件.慢查询日志文件.查询日志文件.二进制日志文件.套接字文件.pid ...

  7. MySQL技术内幕InnoDB存储引擎(三)——文件相关

    构成MySQL数据库和InnoDB存储引擎表的文件类型有: 参数文件:MySQL实例运行时需要的参数就是存储在这里. 日志文件:用来记录MySQL实例对某种条件做出响应时写入的文件. socket文件 ...

  8. 在MySQL的InnoDB存储引擎中count(*)函数的优化

    写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读的层面上,很少有实践,因为没有遇到真实的项目,一切都是纸上谈兵.实践是检验 ...

  9. MySQL InnoDB存储引擎

    200 ? "200px" : this.width)!important;} --> 介绍 本篇文章是对Innodb存储引擎的概念进行一个整体的概括,innodb存储引擎的 ...

  10. [MySQL Reference Manual]14 InnoDB存储引擎

    14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...

随机推荐

  1. [转帖]SQLServer的UTF8支持

    排序规则和 Unicode 支持 - SQL Server | Microsoft Learn UTF-8 支持 SQL Server 2019 (15.x) 完全支持广泛使用的 UTF-8 字符编码 ...

  2. [转帖]关系模型到 Key-Value 模型的映射

    https://cn.pingcap.com/blog/tidb-internal-2 在这我们将关系模型简单理解为 Table 和 SQL 语句,那么问题变为如何在 KV 结构上保存 Table 以 ...

  3. [转帖]k8s之PV、PVC、StorageClass详解

    https://zhuanlan.zhihu.com/p/128552232 导读 上一篇写了共享存储的概述以及一个简单的案例演示.这一篇就写一下PV和PVC. PV是对底层网络共享存储的抽象,将共享 ...

  4. [转帖]数据可视化之redash(支持43种数据源) (转自https://anjia0532.github.io/2019/07/08/redash/)

    https://www.cnblogs.com/a00ium/p/13177272.html 人类都是视觉动物,讲究一图胜千言.如果没了可视化,那么你在跟领导汇报工作时,很大程度会鸡同鸭讲.其实 ex ...

  5. [转帖]Kubernetes-18:Dashboard安装及使用

    https://www.cnblogs.com/v-fan/p/13950268.html Helm安装Dashboard 简介 Dashboard 是 kubernetes 的图形化管理工具,可直观 ...

  6. 基于Prometheus和Grafana监控redis,Oracle,mysql,pg以及sqlserver的方法总结

    基于Prometheus和Grafana监控redis,Oracle,mysql,pg以及sqlserver的方法总结 简单记录一下方法 1.获取相应的exporter 1. redis docker ...

  7. 【0基础学爬虫】爬虫基础之自动化工具 Playwright 的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...

  8. FM的一种简易解调方式

    理论来源 <高低频电路设计与制作> 铃木雅臣 著.这位作者的书写的都不错 电路图 模拟思路 设输入信号为 \[s(t) = \sin(w_0 t + \Delta w\int_{- \in ...

  9. 数组 vs. 切片

    在Go编程语言中处理数据时,经常会遇到数组和切片.这两者是不同的数据结构,有各自的特性和用途.本文将对Go中的数组和切片进行比较,以帮助大家更好地理解它们. 1. 长度不同 一个主要的区别是长度.在G ...

  10. 安装Docker填坑

    从官网下载适合win10使用的docker,但是下载后,出现了各种坑,记录一下解决方式 1.docker想要正常启动,需要做以下的准备,开启 Windows 虚拟化和 Linux 子系统(WSL2), ...