文章目录
1. 参数文件
当MySQL实例启动时,数据库会先去读取一个配置参数文件(默认为my.cnf),用来寻找数据库中的各种文件所在位置以及指定某些初始化参数,这些参数定义了某种内存结构有多大等.
虽然MySQL实例启动是如果找不到my.cnf,也会使用默认的配置信息进行启动,但是如果找不到mysql架构(就是库文件中的一个数据库,其中记录了MySQL实例的各种参数信息)一样会启动失败.
(1). 什么是参数
可以看做是键值对,数据库的很多属性都是根据参数进行优化的.
可以通过命令 SHOW VARIABLES查看数据库中的所有参数
(2). 参数类型
MySQL中的参数可以分为两类:
- 动态参数:可以在MySQL实例中进行更改
- 静态参数:在整个实例的生命周期内都不能进行修改
2. 日志文件
- 错误日志
- 慢查询日志
- 查询日志
- 二进制日志
(1). 错误日志
错误日志对MySQL的启动,运行,关闭过程进行了记录.在默认情况下错误文件的文件名为服务器主机名(如benjamin.err).
(2). 慢查询日志
慢查询日志能根据SQL语句运行的时间筛选出可能有问题的SQL语句,帮助开发者进行定位,从而进行SQL语句层面的优化.
默认情况下,这个功能是不启动的,long_query_time这个参数为0,如果设置一个大于0的值,MySQL数据库运行时会记录下所有运行超出这个时间的SQL语句(不会记录刚好等于这个值的语句).从MySQL 5.1开始单位为微秒,之前是秒.
另外一种情况是,如果一个SQL语句没有使用索引,那么同样会被记录到慢查询日志中.
从MySQL 5.6.5版本新增了参数log_throttle_queries_not_using_indexes,用来表示每分钟插入到慢查询日志的条数的最大值,默认为0.
从MySQL 5.1开始可以讲慢查询日志记录到一张表中,在mysql架构下,名为slow_log.参数log_output指定了慢查询日志的输出格式,默认为FILE,可以设置为TABLE,就可以查询到mysql架构下的slow_log表了.且该参数是全局动态的,可以在线修改.
InnoSQL版本加强了对于SQL语句的不活方式,在原来的基础上在slow_log中新增了对于逻辑读取(所有读取)和物理读取(从磁盘进行IO的读取次数)的统计.
通过参数 long_query_io 将超过指定逻辑IO次数的SQL语句记录到show_log中,默认值为100
通过参数 show_query_type 来表示启用show_log的启用方式,可选值有
- 0 表示不将SQL语句记录到show log
- 1 表示根据运行时间将SQL语句记录到show log
- 2 表示根据逻辑IO次数将SQL语句记录到show log
3 表示根据运行时间及逻辑IO次数将SQL语句记录到show log
(3). 查询日志
查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到了正确的执行,都会被记录下来.默认文件名为主机名.log.
(4). 二进制日志
二进制日志记录了对MySQL数据库执行更改的所有操作,但是不包括select和show这类的操作,因为这类操作没有对数据进行修改.其他的操作数据的操作即时没有对数据进行有效的修改,也会被二进制日志记录下来.
二进制日志还包括了执行数据库更改操作的时间等其他额外信息,总的来说,有一下几种作用:
- 恢复:用于发生宕机后的数据恢复.
- 复制:通过记录对数据的修改可以得到完整的数据,从而复制数据库.
- 审计:通过二进制日志中的信息审计是否有注入攻击.
如果不指定名称,默认为主机名.序列号(如:bin_log.000001).
二进制日志文件默认情况下不开启,需要手动指定参数来启动.
bin_log.index为二进制的索引文件,用来存储过往产生的二进制日志序号
以下配置文件的参数影响着二进制日志记录的信息和行为
- max_binlog_size
- binlog_cache_size
- sync_binlog
- binlog-do-db
- binlog-ignore-db
- log-slave-update
- binlog_format
参数max_binlog_size指定了单个二进制文件的最大大小.默认值为1 073 741 824(1G).
所有未提交的事务的二进制日志会被记录到一个缓冲中去,等待该事务提交是之将从缓冲中写入二进制日志文件.当缓冲中的日志内容大于这顶的binlog_cache_size时,会生成临时文件存储缓冲中的二进制日志.
默认情况下,二进制日志并不是在每次写的时候同步到磁盘,因此,当发生宕机时,可能会有一部分没有写入,会给恢复和复制带来问题.参数sync_binlog=[N]表示没写缓冲多少次就同步到磁盘.
参数binlog-do-db与binlog-ignore-db表示需要写入或者忽略写入哪些库的日志
参数binlog_format参数十分重要,影响了记录二进制日志的格式,通常设置为ROW.可以设定的值:
- STATEMENT:记录日志的逻辑SQL语句.
- ROW:记录表的更改情况.
- MIXED:默认使用STATEMENT的形式进行记录,有一些情况下会使用ROW形式进行记录:
- 表的存储引擎为NDB
- 使用了UUID(),USER(),CURRENT_USER(),FOUND_ROWS(),ROW_COUNT()等不确定函数
- 使用了INSERT DELAY语句
- 使用了用户定义函数
- 使用了临时表
要查看二进制日志文件,必须通过MySQL提供的工具mysqlbinlog.
3. 套接字文件
UNIX系统下本地连接MySQL如果采用UNIX域套接字的方式,需要一个套接字文件,这个文件可由参数socket控制,一般在/tmp目录下,名为mysql.sock
4. pid文件
记录自己的进程id,默认位于数据库目录下,文件名为主机名.pid.
5. 表结构定义文件
因为MySQL插件式存储引擎的体系结构的关系,MySQL数据库的存储是根据表记性的,每个表都会有与之对应的文件.但不论表采用何种存储引擎,MySQL都会有一个以frm为后缀的文件,记录了该表的表结构定义.
frm还用来存放视图的定义,该文件是文本文件,可以直接使用cat查看.
6. InnoDB存储引擎文件
(1). 表空间文件
InnoDB采用将存储的数据按表空间进行存放的设计,默认配置下会有一个初始大小为10MB,名为ibdata1的文件.该文件就是默认的表空间文件.
可通过innodb_data_file_path参数对文件路径进行设置,当然也可以设置多个路径来平均磁盘的负载:
innodb_data_file_path=/dir/filename1:/dir/filename2
设置innodb_data_file_path参数后,所有基于InnoDB存储引擎的表的数据都会记录到该共享表空间中.如果设置了innodb_file_per_table参数,则用户可以为每一个基于InnoDB存储引擎的表产生一个独立表空间.命名规则为表名.ibd。这些单独的表空间文件仅存储该表的数据、索引和插入缓冲BITMAP等信息,其余信息还是存放在默认的表空间中
(2). 重做日志文件
InnoDB存储引擎的数据目录下会有两个名为ib_logfile0和ib_logfile1的文件.在MySQL官方手册中称其为InnoDB存储引擎的日志文件,准确定义应该是重做日志文件.记录了对于InnoDB存储引擎的事务日志.
当实例或者截止失败时,InnoDB存储引擎是使用重做日志恢复到发生故障前的数据库状态,以此来保证数据的完整性.
每个InnoDB存储引擎至少有1个重做日志文件组,每个文件组下面至少有2个重做日志文件.
在日志组中的每个重做日志文件的大小一致,并以循环的方式运行.
重做日志文件的几个重要参数
- innodb_log_file_size:指定每个重做日志文件的大小
- innodb_log_files_in_group:指定了日志文件组中重做日志文件的数量,默认为2
- innodb_mirrored_log_groups:指定了日志镜像文件组的数量,默认为1
- innodb_log_group_home_dir:指定了日志文件组所在的路径,默认为./
重做日志文件的二进制日志文件的区别:
- 记录的范围不同,二进制日志文件会记录所有与MySQL数据库有关的日志,包括所有引擎.而重做日志文件只记录InnoDB存储引擎本身的事务.
- 记录的内容不同,二进制日志文件记录的是一个事务的操作情况,而重做日志文件记录的是每个页在物理层面上的修改.
- 写入时间不同,二进制日志文件仅在事务提交前进行提交,只写入磁盘一次,而重做日志文件在事务进行的过程中会不断的插入条目到重做日志文件中.
在InnoDB存储引擎中,对于不同的操作有不同的重做日志格式,但是它们有着基本的格式
redo_log_type | space | page_no | redo_log_body |
---|---|---|---|
1字节,表示重做日志的类型 | 表示表空间的ID,采用压缩的方式,因此占用空间可能小于4字节 | 表示页的偏移量,同样采用压缩的方式 | 表示每个重做日志的数据部分,恢复时需要调用相应的函数进行解析 |