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 异步写。