参数文件
当 MySQL 实例启动时,数据库会先读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等。在默认情况下,MySQL 实例会按照一定的顺序在指定的文职进行读取,用户只需要通过命令 mysql --help | grep my.cnf 来寻找即可。
MySQL 启动的时候如果没有参数文件,则所有的参数值取决于编译 MySQL 时指定的默认值和源代码中指定参数的默认值。但是,如果 MySQL 实例在默认的数据库目录下找不到 mysql 架构,则启动同样会失败。
MySQL 数据库的参数文件是以文本方式进行存储的。
MySQL 数据库中的参数可以分为两类:
动态参数:运行中可以更改。
静态参数:整个实例生命周期内都不得进行更改,是只读的。
日志文件
错误日志
错误日志文件对于 MySQL 的启动、运行、关闭过程进行了记录。
用户可以通过 show variables like 'log_error'; 来定位该文件。
默认情况下,错误文件的文件名为服务器的 hostname.err。
二进制日志
二进制日志记录了对 MySQL 数据库执行更改的所有操作,但是不包括 SELECT 和 SHOW 这类操作,因为这类操作对数据本身并没有修改。
若操作本身没有导致数据库发生变化,那么该操作可能也会写入二进制文件。
作用:
恢复:某些数据的恢复需要二进制日志。
复制:其原理与恢复相似,通过复制和执行二进制日志使一台远程的 MySQL 数据库与一台 MySQL 数据库进行实时同步。
审计:用户可以通过二进制日志的信息来进行审计,判断是否有对数据库进行注入的攻击。
log-bin :配置该参数可以启动二进制日志。如果不指定 name,则默认二进制日志文件名为主机名,后缀名为二进制日志的序列号,所在路径为数据库所在目录。
二进制日志文件在默认情况下并没有启动,需要手动指定参数来启动。
启动二进制日志对数据库大约有 1% 的性能影响。
max_binlog_size :指定了单个二进制文件的最大值,如果超过该值,则产生新的二进制文件,后缀名 +1,并记录到 .index 文件。
binlog_cache_size :当使用事务的表存储引擎时,所有未提交的二进制日志会被记录到一个缓存中去,等该事务提交时直接将缓冲中的二进制文件写入二进制文件,而该缓冲的大小有该参数进行控制,默认大小为 32K。该参数是基于会话的,所以该值设置不能过大,当一个事务的记录大于设定的值时,MySQL 会把缓冲中的日志写入一个临时文件中,因此该值又不能设的太小。通过 show gloabl status 命令查看binlog_cache_use、binlog_cache_disk_use 的状态,可以判断当前 binlog_cache_size 的设置是否合适。
sync_binlog :默认情况下,二进制日志并不是在每次写的时候同步到磁盘。因此,当数据库所在操作系统发生宕机时,可能会有最后一部分数据没有写入二进制的文件中,这会给恢复和复制带来问题。该参数表示每次写缓冲多少次就同步到磁盘。为 1 时表示采用同步写磁盘的方式来写二进制日志。默认值为 0,如果使用 InnoDB 存储引擎进行复制,并且向的到最大的高可用性,建议将该值设为 ON。该值为 ON 时,会对数据库的 IO 系统带来和一定的影响。但是,即使将该值设为 1,还是会有一种情况导致问题的发生。当使用 InnoDB 存储引擎时,在一个事务发出 COMMIT 动作之前,由于该值为 1,因此会将二进制日志立即写入磁盘。如果这时已经写入了二进制日志,但是提交还没有发生,并且此时发生了宕机,那么在 MySQL 数据库下次启动时,由于 COMMIT 操作并没有发生,这个事务会被回滚掉。但是二进制日志已经记录了该事务信息,不能被回滚。这个问题可以通过将参数 innodb_support_xa 设为 1 来解决。
binlog-do-db :需要写入哪些库的日志。
binlog-ignore-db :需要忽略哪些库的日志。
log-slave-updates :如果当前数据库时复制中的 slave 角色,则它不会将从 master 取得并执行的二进制日志写入自己的二进制日志文件中去。如果需要写入,要设置该参数。如果需要搭建 master => slave => slave 架构的复制,则必须设置该参数。
binlog_format :影响了记录二进制日志的格式。该参数可设的值有:
STATEMENT:记录的是日志的逻辑 SQL 语句。
ROW:记录的是表的行更改情况。如果设置为 ROW,可以将 InnoDB 的事务隔离级别为 READ COMMITTED,以获得更好的并发性。
MIXED:默认采用 STATEMENT 格式进行二进制文件的记录,但是在一些情况下会使用 ROW 格式记录。
二进制日志文件的查看通过工具 mysqlbinlog 。
慢查询日志
默认情况下,MySQL 数据库并不启动慢查询的日志,用需要手工将参数 slow_query_log 设为 ON。
long_query_time :设置这个阈值后,MySQL 数据库会记录运行时间超过该值的所有 SQL 语句。(管理语句和未使用索引的不记录)
log_queries_not_using_indexes :如果运行的 SQL 语句没有使用索引,MySQL 数据库同样会将这条 SQL 语句记录到慢查询日志文件。
log_throttle_queries_not_using_indexes :每分钟允许记录到 slow log 的且未使用索引的 SQL 语句次数。默认为 0,表示没有限制。
mysqldumpslow :分析慢查询日志。
MySQL 5.1 开始可以将慢查询的日志记录放入一张表中。慢查询表在 mysql 架构下,名为 slow_log。
log_output :指定了慢查询输出的格式,默认为 FILE。可以将它设为 TABLE,这样慢查询日志将记录到 slow_log 表中。该参数是动态的,且是全局的。
slow_log 表用的是 CSV 引擎,对大数据量下的查询效率可能不高,用户可以将它转换到 MyISAM,并在 start_time 列上添加索引以进一步提高查询效率。不能忽视的是,这会对数据库造成额外的开销。
InnoSQL 版本加强了对于 SQL 语句的捕获方式,在原版 MySQL 的基础上在 slow_log 中增加了对于逻辑读取和物理读取的统计。这里的物理读取是指从磁盘进行 IO 读取的次数,逻辑读取包含所有的读取,不管是磁盘还是缓冲池。
long_query_io :将超过指定逻辑 IO 次数的 SQL 语句记录到 slow log 中。默认 100。
slow_query_type :启用 slow log 的方式。
0:不将 SQL 语句记录到 slow log
1:根据运行时间将 SQL 语句记录到 slow log
2:根据逻辑 IO 次数将 SQL 语句记录到 slow log
3:根据运行时间及逻辑 IO 次数将 SQL 语句记录到 slow log
查询日志
查询日志记录了所有对 MySQL 数据库请求的信息,无论这些请求是否得到了正确的执行。
默认的文件名为 hostname.log。
socket 文件
在 UNIX 系统下本地连接 MySQL 可以采用 UNIX 域套接字方式,这种方式需要一个套接字文件。套接字文件可有参数 socket 控制。一般在 /tmp 目录下,名为 mysql.sock。
show variables like 'socket';
pid 文件
当 MySQL 实例启动时,会将自己的进程 ID 写入一个文件中,该文件即为 PID 文件,改文件可由参数 pid_file 控制,默认位于数据库目录下,文件名为 hostname.pid。
MySQL 表结构文件
因为 MySQL 插件式存储引擎的体系结构的关系,MySQL 数据存储的是根据表进行的,每个表都会有与之对应的文件。但不论表采用何种存储引擎,MySQL 都有一个以 frm 为后缀名的文件,这个文件记录了该表的表结构定义。
frm 还用来存放视图的定义,这种文件时文本文件,可以直接查看。
存储引擎文件
MySQL 每个表存储引擎有其自己独有的文件。
表空间文件
InnoDB 采用将存储的数据按表空间进行存放的设计。在默认的配置下会有一个初始大小为 10MB,名为 ibata1 的文件。该文件就是默认的表空间文件,用户可以通过参数 innodb_data_file_path 对其进行设置。用户可以通过多个文件组成一个表空间,同时指定文件的属性。
设置 innodb_data_file_path 参数后,所有基于 InnoDB 存储引擎的表的数据都会记录到该共享表空间中。
若设置 innodb_file_per_table 参数,则用户可以将每个基于 InnoDB 存储引擎的表产生一个独立表空间。独立表空间的命名规则为:tablename.ibd。通过这样的方式,用户不用将所有的数据都存放于默认的表空间中。
需要注意的是,这些单独的表空间文件仅存储该表的数据、索引和插入缓冲 BITMAP 等信息,其余的信息还是存放在默认的表空间中。
重做日志文件
在默认情况下,在 InnoDB 存储引擎的数据目录下会有两个名为 ib_logfile0 和 ib_logfile1 的文件。在 MySQL 官方手册中将其称为 InnoDB 存储引擎的日志文件,不过准确的定义应该是重做日志文件。他们记录了对于 InnoDB 存储引擎的事务日志。
当实例或者介质失败时,重做日志文件就能派上用场。
每个 InnoDB 存储引擎至少有一个重做日志文件组,每个文件组下至少有 2 个重做日志文件,如上面默认的两个文件。为了得到更高的可靠性,用户可以设置多个的镜像日志组,将不同的文件组放在不同的磁盘上,以此提高重做日志的高可用性。在日志组中每个重做日志文件的大小一致,并以此循环写入的方式运行。
innodb_log_file_size :指定每个重做日志文件的大小。1.2.x版本将该限制扩大为 512GB。
innodb_log_files_in_group :指定了日志文件组中重做日志文件的数量,默认为 2.
innodb_mirrored_log_groups :指定了日志镜像文件组的数量,默认为 1,表示只有一个日志文件组,没有镜像。如果磁盘本身已经做了高可用的方案,如磁盘阵列,那么可以不开启重做日志镜像的功能。
innodb_log_group_home_dir :指定了日志文件组所在的路径,默认为 ./,表示在 MySQL 数据库的数据目录下。