InnoDB 存储引擎的文件学习

学习《mysql 技术内幕:InnoDB 存储引擎》 第三章关于数据库文件以及 innodb 存储引擎相关文件介绍,学习心得总结以下:mysql

mysql 文件主要包括参数文件,日志文件,socket 文件,pid文件,表结构文件,存储引擎文件。sql

参数文件

mysql 启动时会读取配置参数文件,若是找不到文件,会使用默认值和源代码中指定参数的默认值。数据库

查看参数的两种方式:缓存

  • show variables
show varables like "%innodb_use_native_aio%";
复制代码
  • information_schema.GLOBAL_VARIABLES
select * from GLOBAL_VARIABLES where varable_name like "%innodb_use_native_aio%";
复制代码

参数分类:bash

  • 动态参数:

在实例运行中能够修改,可是只在当前生命周期中有效,若是 mysql 重启,仍是会从新读取参数文件。因此若是想要在全部生命周期中有效,必须修改参数文件。服务器

对参数的修改能够分为 global 和 session,表示影响的是整个生命周期仍是当前会话。有些参数只能在当前会话中修改,有的参数只能在整个生命周期中修改,有些参数既能够在当前会话中修改也能够在整个生命中期中修改。网络

set @@global.read_buffer_size=104876;
set @@session.read_buffer_size=78929;
select @@session.read_buffer_size;
select @@global.read_buffer_size;
复制代码
  • 静态参数:

在整个生命中期中不能够修改。session

日志文件

记录了 Mysql 数据库各类类型的操做行为,主要包括错误日志,慢查询日志,查询日志,二进制日志。架构

错误日志

不只记录了全部错误信息,还有一些告警和正确的提示信息,方便定位问题。能够查看参数 log_error 来找到 mysql 错误日志文件的位置异步

show variables like "%log_error%"
复制代码
慢查询日志

能够经过参数 log_slow_queries 设置是否开启慢查询日志。

主要能够记录三种慢查询 SQL:

  • 查询时间大于参数 long_query_time 的 SQL
  • 没有使用索引的查询,是否记录取决于 log_queries_not_using_indexes 参数的设置
  • 对逻辑读取次数大于参数 long_query_io 次数的 SQL 记录到慢查询中

慢查询日志的输出格式,由 log_output 格式指定,主要有两种格式:

  • FILE 若是是文件格式,可使用 mysqldumpslow 命令分析慢查询日志
- 查询执行时间最长的 10 条 SQL 语句
mysqldumpslow -s al -n 10 david.log
复制代码
  • TABLE:记录在 mysql 架构下的 slow_log 表中。
查询日志

查询日志记录了全部对 MYSQL 数据库请求的信息,不管这些请求是否获得正确的执行。经过 general_log 和 general_log_file 参数设置。

二进制日志

二进制日志(binary log) 记录了对 MYSQL 数据库执行更改的全部操做,可是不包括 SELECT 和 SHOW 类型操做,经过参数 log-bin 参数来开启,主要用途以下:

  • 恢复数据
  • 复制:经过 binary log 将本数据库和其它数据库进行同步
  • 审计:对数据的修改作审计

开启 binary log 会对性能形成必定的影响,可是这个影响有限,差很少 1% 的降低。

一些关于二进制日志的配置参数:

  • max_binlog_size:指定了二进制文件的最大值,若是超过该值,则产生新的二进制文件
  • binlog_cache_size:该参数记录二进制文件缓存的大小
当使用事务时,二进制文件的记录会被先放入缓存,当事务提交时后面再写入二进制文件,该参数记录二进制文件缓存的大小。当超过这个值可是事务没有被提交,这个时候会把缓存中的值写入临时文件。
复制代码
  • binlog_cache_use:记录使用缓存写二进制日志的次数
  • binlog_cache_disk_use:记录了使用临时文件写二进制日志的次数
  • sync_binlog:表示二进制文件每次写缓存多少次被同步到磁盘。
  • binlog_do_db:表示须要写入哪些库的二进制文件
  • binlog_ingore_db:忽略哪些库的二进制文件
  • log_slave_update:是否主动将 master 取得的并执行的二进制日志写入 slave 角色中,高可用状况下,该参数必须开启
  • innodb_support_xa: 该参数能够确保二进制日志与 InnoDb 存储数据文件的同步,若是不开启该参数,有些状况下虽然事务回滚了,可是仍然记录了二进制文件,会致使数据不一致
  • binlog_format:记录二进制日志的格式,5.1 版本引入,动态参数,能够运行时修改。一共有三种日志格式:
- STATEMENT
记录日志文件执行的逻辑 SQL 语句,可是若是在服务器上运行 rand,uuid 等函数或者使用触发器,均可能致使主从服务器数据不一致,默认的日志格式就是 STATEMENT。

- ROW
记录表的行的更改状况,不会出现数据不一致状况,但因为记录的是行数据的更改,二进制文件有时候会很大,开启该参数对于磁盘的开销和复制的网络开销都有必定的成本
- MIXED
采用 STATEMENT 和 ROW 混合的方式记录日志,一般状况下使用 STATEMENT 方式,一些特殊状况下使用 ROW 方式:
    1) 存储引擎为 NDB
    2)使用 UUID,USER,CURRENT_USER,FOUND_ROWS,ROW_COUNT 等不肯定函数
    3)使用了 INSERT DELAY 语句
    4)使用了用户定义的函数
    5)使用了临时表
复制代码

binary log 文件格式二进制的,不能直接查看,必须用工具 mysqlbinlog 命令分析查看

mysqlbinlog --start-position=203 test.000004
复制代码

socket 文件

在本地链接 MYSQL 时使用 UNIX 域套接字方式时会用到的链接文件,经过参数 socket 来设置套接字文件的存储位置

pid 文件

存放 mysql 进程 ID,经过参数 pid_file 来设置 pid 文件存放位置

表结构文件

以 frm 为后缀名的文件,记录了相关表和视图的结构定义。

InnoDB 存储引擎文件

上面介绍的查询日志,二进制日志等都是 mysql 数据库自己的问题,和存储引擎无关,而每一个存储引擎有本身独立文件,其中InnoDB 存储引擎文件包括重作日志文件和表空间文件:

表空间文件
  • 经过参数 innodb_data_file_path 设置表空间文件的共享空间
  • 经过 innodb_data_per_table 设置是否基于每一个表产生一个独立的表空间
  • 单独的表空间只存储了该表的数据,索引和插入缓存 BITMAP 等信息,其它信息仍然存放在默认共享表空间中。
重作日志文件
  • 重作日志文件记录了 InnoDB 存储引擎的事务日志,在发生宕机的状况下,对事务操做进行恢复操做。
  • 重作日志文件至少有一个重作日志文件组,每一个重作日志文件组至少有 2 个重作日志文件。
  • 为了保证高可用性,能够设置镜像日志文件组,将日志组存储在不一样的磁盘上。
  • 重作日志的写入不须要 doublewrite,由于写入是按照一个扇区的大小进行写入的,是写入的最小单位,因此能够保证写入的可靠性。
  • 重作日志也有缓存,可是缓存不大,默认为 8MB,将重作日志缓存刷新到日志文件文件的三个条件:
- Master Thread 会每一秒刷新一次
- 每一个事物提交时会将刷新,由 innodb_flush_log_at_trx_commit 参数控制:
    0 表示事务提交时,不写入重作日志文件,而是等待 Master Thread 的定时刷新
    1 表示每当事务提交时,就必须同步写入重作日志文件,为了保证 ACID 中的持久性,事务必须设置为 1。才能保证宕机时能够恢复
    2 表示重作日志文件异步写入磁盘
- 当重作日志缓存池剩余空间小于 1/2 时会刷新,重作日志缓存不能设置过小,不然会致使频繁的执行 checkpoint 操做,致使性能的抖动。
复制代码
  • 重作日志文件几个相关的参数:
- innodb_log_file_size:指定每一个重作日志文件的大小
- innodb_log_files_in_group:每一个日志文件中重作日志文件的数量
- innodb_mirrored_log_groups:日志镜像文件组的数量
- innodb_log_group_home_dir:日志文件组所在路径
复制代码
  • 重作日志文件和二进制文件的区别:
- 二进制日志文件记录全部与 MYSQL 数据库有关的记录,而重作日志文件只记录了关于 InnoDB 的事务日志
- 二进制日志文件记录的是关于一个事务的具体操做内容,而重作日志文件记录了 InnoDB 关于每一个页的更改的物理状况
- 二进制日志文件仅在事务提交前进行提交,而重作日志文件在事务进行的过程当中,却有不断重作日志条目被写入
复制代码

本文涉及到的相关配置参数

  • log_error:错误日志文件所在位置
  • long_query_time:慢查询日志阈值,默认是 10 s
  • long_slow_queries:是否开启慢查询日志记录,默认是 off
  • long_queries_not_using_indexes:是否开启查询没有使用索引时记录到慢查询日志中,默认为 0
  • long_throttle_queries_not_using_indexes:表示每分钟允许记录到慢查询日志中未使用索引的 SQL 个数
  • log_output:指定慢查询日志的输出格式,默认是 FILE,能够将其设置为 TABLE,就能够 slow_log 表中查询了
  • long_query_io:将超过指定逻辑 IO 次数的 SQL 语句记录到慢查询日志中
  • general_log:是否开启查询日志
  • general_log_file:查询日志记录文件
  • log-bin:是否开启 binary log
  • max_binlog_size:指定了二进制文件的最大值,若是超过该值,则产生新的二进制文件
  • binlog_cache_size:该参数记录二进制文件缓存的大小
  • binlog_cache_use:记录使用缓存写二进制日志的次数
  • binlog_cache_disk_use:记录了使用临时文件写二进制日志的次数
  • sync_binlog:表示二进制文件每次写缓存多少次被同步到磁盘。
  • binlog_do_db:表示须要写入哪些库的二进制文件
  • binlog_ingore_db:忽略哪些库的二进制文件
  • log_slave_update:是否主动将 master 取得的并执行的二进制日志写入 slave 角色中,高可用状况下,该参数必须开启
  • innodb_support_xa: 该参数能够确保二进制日志与 InnoDb 存储数据文件的同步
  • binlog_format:记录二进制日志的格式,5.1 版本引入,动态参数,能够运行时修改。
  • socket:套接字文件的存储位置
  • pid_file:pid 文件存放位置
  • innodb_data_file_path:定义 innodb 表空间文件位置
  • innodb_file_per_table:设置是否每一个表都会产生一个独立的表空间
  • innodb_flush_log_at_trx_commit:是否在事务提交时将重作日志缓存文件写入磁盘文件
  • innodb_log_file_size:指定每一个重作日志文件的大小
  • innodb_log_files_in_group:每一个日志文件中重作日志文件的数量
  • innodb_mirrored_log_groups:重作日志镜像文件组的数量
  • innodb_log_group_home_dir:重作日志文件组所在路径
相关文章
相关标签/搜索