学习《mysql 技术内幕:InnoDB 存储引擎》 第三章关于数据库文件以及 innodb 存储引擎相关文件介绍,学习心得总结以下:mysql
mysql 文件主要包括参数文件,日志文件,socket 文件,pid文件,表结构文件,存储引擎文件。sql
mysql 启动时会读取配置参数文件,若是找不到文件,会使用默认值和源代码中指定参数的默认值。数据库
查看参数的两种方式:缓存
show varables like "%innodb_use_native_aio%";
复制代码
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:
慢查询日志的输出格式,由 log_output 格式指定,主要有两种格式:
- 查询执行时间最长的 10 条 SQL 语句
mysqldumpslow -s al -n 10 david.log
复制代码
查询日志记录了全部对 MYSQL 数据库请求的信息,不管这些请求是否获得正确的执行。经过 general_log 和 general_log_file 参数设置。
二进制日志(binary log) 记录了对 MYSQL 数据库执行更改的全部操做,可是不包括 SELECT 和 SHOW 类型操做,经过参数 log-bin 参数来开启,主要用途以下:
开启 binary log 会对性能形成必定的影响,可是这个影响有限,差很少 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
复制代码
在本地链接 MYSQL 时使用 UNIX 域套接字方式时会用到的链接文件,经过参数 socket 来设置套接字文件的存储位置
存放 mysql 进程 ID,经过参数 pid_file 来设置 pid 文件存放位置
以 frm 为后缀名的文件,记录了相关表和视图的结构定义。
上面介绍的查询日志,二进制日志等都是 mysql 数据库自己的问题,和存储引擎无关,而每一个存储引擎有本身独立文件,其中InnoDB 存储引擎文件包括重作日志文件和表空间文件:
- 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 关于每一个页的更改的物理状况
- 二进制日志文件仅在事务提交前进行提交,而重作日志文件在事务进行的过程当中,却有不断重作日志条目被写入
复制代码