MySQL技术内幕InnoDB存储引擎 第三章 文件

1.

参数文件

当MySQL实例启动时,MySQL会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等设置。

MySQL实例也可以不需要参数文件,这时所有的参数值取决于编译MySQL时指定的默认值和源代码中指定参数的默认值。

参数的值可以在information_schema架构下的GLOBAL_VARIABLES视图来进行查找:

select * from GLOBAL_VARIABLES where like 'innodb_buffer%'\G

show variables like 'innodb_buffer%'\G


参数可以分为两类:动态参数和静态参数

动态参数意味着你可以在MySQL实例运行中进行修改;静态参数说明在整个实例生命周期内都不得进行更改,就好像是只读的。可以通过set命令对动态的参数进行修改。

语法为:set    |     [global    |    session]  system_var_name = expr

  |     [@@global.   |    @@session.       |@@] system_var_name = expr

global和session表明该参数的修改是基于当前会话还是整个实例的生命周期。


set @@global.read_buffer_size = 1048576;

把read_buffer_size全局值更改为1MB,而当前会话的read_buffer_size的值不会改变。需要注意的是,对变量的全局值进行了修改,在这次的实例生命周期内都有效,但MySQL实例本身并不会对参数文件中的该值进行修改。也就是说下次启动时,MySQL实例还是会读取参数文件。


日志文件

记录了影响MySQL数据库的各种类型活动。常见的日志文件有错误日志,二进制日志,慢查询日志,查询日志。


错误日志

对MySQL的启动,运行,关闭过程进行了记录。MySQL DBA在遇到问题时首先查看该文件。该文件不但记录了出错信息,也记录了一些警告或者正确的信息。默认err结尾。

show variables like 'log_error';


慢查询日志

可以通过错误日志得到一些关于数据库优化的信息帮助,而慢查询能为SQL语句的优化带来很好的帮助。可以设一个阀值,将运行时间超过该阀值的所有SQL语句记录到慢查询日志文件中。该阀值可以通过参数long_query_time来设置,默认值为10,代表10秒。

默认情况下,MySQL数据库并不启动慢查询日志,需要手工将这个参数设为ON,然后启动。

另一个和慢查询日志有关的是log_queries_not_using_indexes,如果运行的SQL语句没有使用索引,则MySQL数据库同样会将这条SQL语句记录到慢查询日志文件。首先确保打开了log_queries_not_using_indexes.


mysqldumpslow命令,用于分析慢查询日志的数据。

参数log_output指定了慢查询输出的格式,默认为FILE,你可以将它设为TABLE,然后就可以查询mysql架构下的slow_log表了。

查看slow_log表的定义会发现,该表使用的是CSV引擎。



查询日志

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


二进制文件

记录了对数据库执行更改的所有操作,但是不包括select和show这类操作。因为这类操作对数据本身并没有修改。

二进制日志的作用:

恢复:某些数据的恢复需要二进制日志。

复制:通过复制和执行二进制日志使得一台远程的MySQL数据库与一台MYSQL数据库进行实时同步。

通过配置参数log-bin[=name]可以启动二进制日志。

bin_log.index为二进制的索引文件,用来存储过往产生的二进制日志序号。

二进制日志文件默认情况下并没有启动,需要手动指定参数来启动。

参数max_binlog_size指定了单个二进制日志文件的最大值,如果超过该值,则产生新的二进制日志文件,后缀名+1,并记录到.index文件。

当使用事务的表存储引擎时(如InnoDB),所有未提交的二进制日志都会被记录到一个缓存中,等该事务提交时直接将缓冲中的二进制日志写入二进制文件,而该缓冲的大小由binlog_cache_size决定。binlog_cache_size是基于会话(session)的,也就是说,当一个线程开始一个事务时,MySQL会自动分配一个大小为binlog_cache_size的缓存。

当一个事务的记录大于设定的binlog_cache_size时,MySQL会把缓冲中的日志写入一个临时文件中。

默认情况下,二进制日志并不是每次写的时候同步到磁盘。参数sync_binlog=[N]表示每写缓冲多少次就同步到磁盘。

当使用sync_binlog为1时,在一个事务发出commit动作之前,由于sync_binlog为1,因此会将二进制日志写入磁盘。如果这时已经写入了二进制日志,但提交还没有发生,并在此时发生了宕机,。。。。可使用innodb_support_xa设为1来解决。


binlog_format影响了二进制日志的格式。InnoDB存储引擎的默认事务隔离级别是REPEATABLE READ.该参数可设的值有STATEMENT, ROW和MIXED。

STATEMENT,二进制日志文件记录的是日志的逻辑SQL语句。

在ROW格式下,二进制日志记录的不是简单的SQL语句,而是记录表的行更改情况。基于ROW格式的复制可以解决在statement格式下复制的问题。这种情况下,可以将InnoDB的事务隔离基本设为READ COMMITED。

MIXED,MySQL默认采用STATEMENT格式进行二进制日志文件的记录,但在一些情况下会使用row格式,可能的情况。。。


将参数binlog_format设置为ROW,这可以为数据库的恢复和复制带来更好的可靠性。但这会带来二进制文件的增加,有些语句下ROW格式下可能需要更大的容量。。这是因为,这时MySQL数据库不再将逻辑的SQL操作记录到二进制日志中,而是记录对于每行的更改记录信息。


pid文件

当MySQL实例启动时,会将自己的进程ID写入一个文件中——该文件即为pid文件。该文件可由参数pid_file控制。


表结构定义文件

MySQL对于数据的存储是按照表的,所以每个表都会有与之对应的文件。不论采用何种存储引擎,MySQL都有一个以frm为后缀名的文件,这个文件记录了该表的表结构定义。

frm还用来存放试图的定义,如v_a视图,那么会产生一个v_a.frm用来记录视图的定义。


InnoDB所特有的文件

表空间文件

InnoDB将存储的数据按表空间进行存放。默认配置下,会有一个名为ibdata1的文件。

设置innodb_data_file_path参数后,之后对于所有基于InnoDB存储引擎的表的数据都会记录到该文件内。而通过设置innodb_file_per_table,我们可以将每个基于InnoDB存储引擎的表单独产生一个表空间,文件名为.ibd.这样不用将所有数据都存放于默认的表空间中。

这些单独的表空间文件仅存储该表的数据,索引和插入缓冲等信息,其余信息还是存放在默认的表空间中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值