【书 : InnoDB 存储引擎】第3章 文件

3.1 参数文件

参数类型分为两类: 动态(dynamic)和静态(static)

动态参数意味着可以在 MYSQL 实例运行中进行更改, 静态参数说明在整个实例生命周期内都不能进行更改。

对动态参数,可以用 set@@global|@@session 来更改。

3.2 日志文件

3.2.1 错误文件

3.2.2 慢查询文件

相关参数查看:

mysql>show variables like '%slow%'

设置 long_query_time 这个阈值胡, MySQL 会记录运行时间超过该值的所有 SQL 语句, 单运行时间正好等于 long_query_time 的情况并不会被记录下。从 Mysql 5.1 开始, long_query_time 开始以微秒记录 SQL 语句运行时间, 之前禁用 秒为单位。

参数 log_queries_not_using_indexes: 如果运行的 SQL 语句没有使用索引, 则 Mysql 数据库同样会将这条 SQL 语句记录到慢查询日志文件。

Mysql 5.6.5 新增 log_throttle_queries_not_using_indexes, 用来表示每分钟允许记录到 slow log 的且未使用索引的 SQL 语句次数。 默认为 0 , 表示没有限制。

Mysql 提供命令 mysqldumpslow 命令,来分析 慢查询文件。

Mysql 5.1 开始, 慢查询日志记录可以放入一张表中, 是的用户的查询更加方便和直观。在 mysql 数据库中的 表 slow_log. 

参数 log_output 指定了慢查询输出格式, 默认为 FILE, 可以将它设为 table , 然后就可以查询 slow_log 表。

查看 slow_log 表的定义会发现该表使用的是 CSV 引擎, 对大数据量下的查询效率可能不高。 用户可以把 slow_log 表的引擎转换为 MyISAM , 并在 start_time 列上添加索引以进一步提高查询的效率。 但是, 如果已经启动了慢查询, 将会提示错误。

Mysql 增加了对于逻辑读取(logical reads)和物理读取(physical reads)的统计。这里的物理读取时指从磁盘进行 IO 读取的次数, 逻辑读取包含所有的读取, 不管是磁盘还是缓冲池。

用户可以通过额外的参数 long_query_io 将超过逻辑 IO 次数的 SQL 语句记录到 slow log 中, 该值默认为 100.

参数 slow_query_tye 表示启用 show log 的方式。 // 在 mysql 5.6.33 测试时, 未发现该参数。

3.2.3 查询日志

查询日志记录了所有对 Mysql 数据库请求的信息,无论这些请求是否得到了正确的执行。 默认文件名: 主机名.log

从 mysql 5.1 开始, 可以将查询日志的记录放入 数据库 mysql 下的 general_log 表中, 该表的使用方法和 slow_log 基本一样。

3.2.4 二进制日志

二进制文件(binary log)记录了对 mysql 数据库执行更改的所有操作, 单不包含 select 和 show 这类操作, 因为这类操作对数据本身并没有修改。

可以通过 show binlog event 查看二进制的修改记录。

二进制日志的主要作用:恢复(recovery), 复制(replication), 审计(audit)

参数 max_binlog_size 指定了单个二进制日志文件的最大值, 如果超过该值, 则产生新的二进制日志文件。 从 Mysql 5.0 开始, 默认值 为 1G。

参数 binlog_cache_size, 默认值 32K 。 当使用事务的表存储引擎(如 Innodb )是, 所有未提交的二进制日志会被记录到一个缓存中去, 等该事务提交时直接将该缓冲中的二进制日志写入二进制日志文件。 当一个线程开始一个事务时, Mysql 会自动分配一个大小为 binlog_cache_size 的缓存, 设置该值需要相当小心。

通过 show global status 查看 binlog_cache_use, binlog_cache_disk_use 的状态, 可判断当前 binlog_cache_size 的设置是否合适。

参数 sync_binlog=[N] 表示每写缓冲多少次就同步到磁盘。默认值为 0 , 如果使用 innodb 进行复制, 并且想得到最大的高可用性, 建议该值设为 on。

设为 1 时, 会出现一种情况, 一个事务 commit 之前,会将二进制日志立即写入磁盘。  如果已经写入了日志,但提交还没有发生, 此时发生了宕机,在下次启动时, commit 并没有发生, 事务会被回滚。 但 二进制日志已经记录了该事务信息, 不能被回滚。 这个问题可通过参数 innodb_support_xa 设为 1 来解决, 虽然 innodb_support_xa 与 XA 事务有关, 单它同时也确保了二进制日志和 innodb 引擎数据文件的同步。

参数 binlog-do-db 和 binlog-ignore-db 表示需要写入或忽略那些库的日志。 默认为空, 表示需要同步所有库的日志到二进制日志。

Mysql 5.1 引入了 binlog_format 参数, 该参数可设的值有 statement, row 和 mixed.

(1) statement . 二进制日志文件记录的是日志的逻辑 sql 语句。

(2) row . 记录表的行更改情况。statement 的复制问题得到解决。 从 mysql 5.1 开始, 如果设置了 binlog_format 为row, 可以将 innodb 事务隔离级别设为 read commited ,以获得更好的并发性。

(3) mixed. 默认采用 statement 格式, 但是在一些情况下回使用 row 格式。 

在通常情况下, 将参数 binlog_format 设置为 row , 可以为数据库的恢复和复制带来更好的可靠性。 的那会这会使二进制文件大小增加, 某些情况下, 会增大很多。

要查看二进制文件的内容, 必须通过 mysql 提供的工具 mysqlbinlog . 

[root]#mysqlbinlog --start-position=203 mysql-bin.000184

binlog_format 为 row 时, 查看需要加上参数 -v 或 -vv 。 -vv 比 -v 多显示出更新的类型。

3.3 套接字文件

3.4 pid 文件

3.5 表结构定义文件

无论采用何种存储引擎, mysql 都有一个 以 frm 为后缀名的文件, 这个文件记录了该表的表结构定义。

3.6 InnoDB 存储引擎文件

3.6.1 表空间文件

在默认配置下会有一个初始大小为 10MB, 名为 ibdata1 的文件。 该文件就是默认的表空间文件(table space).

若设置了参数 innodb_file_per_table, 则用户可以将每个基于 Innodb 引擎的表产生一个独立表空间。 命名规则为: 表明.ibd。

需要注意的是, 这些单独的表空间仅存储该表的数据、索引和插入缓冲 bitmap 等信息, 其余信息还是存在默认的表空间中。

3.6.2 重做日志文件

在默认情况下, 在 innodb 存储引擎的数据目录下会有两个名为 ib_logfile0 和 ib_logfile1 的文件, 其为重做日志文件(redo log file)。

参数 innodb_log_file_size 指定每个重做日志文件的大小 。 innodb 1.2.x 之前, 为 4GB. 而 1.2.x 将其扩大为 512GB。

参数 innodb_log_files_in_group 指定了日志文件组中重做日志文件的数量, 默认为 2。 参数 innodb_mirrored_log_groups 制定了日志镜像文件组的数量, 默认为 1, 表示只有一个日志文件组, 没有镜像。

重做日志文件与二进制日志文件的区别:

(1) 二进制日志会记录所有与 MYSQL 数据库有关的日志记录,包裹 Innodb , MYISAM, Heap 等其他存储引擎的日志。 而 Innodb 重做日志只记录有关该存储引擎本事的事务日志。

(2) 记录的内容不同, 无论用户将二进制文件记录格式谁 statement 还是 row 或是 mixed , 其记录的都是关于一个事务的具体操作内容, 即该日志是逻辑日志。 而 innodb 村粗引擎的重做日志记录的是关于每个页的更改的物理情况。

(3) 写入时间也不同, 二进制日志文件仅在事务提交前进行提交, 即只写磁盘一次, 不论这是该事务多大。 而在事务进行过程中, 却不断有重做日志文件条目(redo entry) 被写入到重做日志文件中。

从重做日志缓冲往磁盘写入时, 是按 512 个字节, 也就是一个扇区的大小进行写入。 因为扇区是写入的最小单位, 因此可以保证写入必定是成功的。 因此在重做日志的写入过程中不需要有 doule write。(why?)

日志缓冲写入磁盘的重做日志文件按一定条件:

(1) 主线程中每秒会将重做日志缓冲写入磁盘的重做日志文件中, 无论事务是否已经提交。 

(2) 通过 参数 innodb_flush_log_trx_commit 控制, 表示在提交(commit)时,处理重做日志的方式。 0 时不写, 1 同步写, 2 异步写。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容