一、MySql数据库和Innodb引擎的各种类型文件,归类下可以分为:
1)参数文件
告诉mysql启动实例在哪儿可以找到数据库数据文件,并指定某些参数的初始值。
2)日志文件
用来记录MySql实例对某种条件作出的响应时写入的文件。如:错误日志、二进制日志、慢查询日志、查询日志文件等。
3)socket文件
当用Unix域套接字连接Mysql的时候用到的文件。
注:在Linux和Unix环境下,可以使用Unix域套接字来连接数据库实例,Unix套接字并不是一种网络协议,所以当使用Unix套接字连接Mysql时,需要Mysql客户端和数据库实例在同一台服务器上,
用户可以在配置文件中指定套接字文件,如:--socket=/tmp/mysql.sock,当数据库实例启动后可以用以下命令连接:mysql -uRoot -S /tmp/mysql.sock
查看套接字文件配置:show variables like 'socket';
4)pid文件
Mysql进程的ID文件。
5)Mysql的表结构文件
用来存放表结构定义的文件
6)存储引擎文件
每个存储引擎都会有自己的文件存储各种数据,包括记录和索引等数据。
二、分开详细介绍各类文件
1)参数文件
-在默认情况下,Mysql会按照一定的顺序在指定的位置读取,用户可以通过命令mysql --help | grep my.cnf 来寻找即可。
-查看具体配置项,可以通过show variables命令,各版本都适用的方法,在5.1版本后,还可以通过informa_schema框架下的GLOBAL_VARIABLES视图查看。
-参数文件中的参数类型:动态参数和静态参数。静态参数是在整个实例周期内不允许更改的,就好像是只读的文件。动态参数可以在实例运行中,通过set命令来进行修改。
set命令中又有两个核心的关键字global和session,global标志参数的修改是针对实例的整个生命周期,而session则是针对的单次会话。如果重开一个会话,session设置的参数就会失效。
global示例:
set @@global.read_buffer_size=524288 -设置参数
select @@global.read_buffer_size; -查询参数
session示例同上。
2)日志文件
-错误日志
对Mysql实例的启动、运行、结束的过程进行记录。当Mysql数据库启动异常,首先就应该去查看该日志。该文件不仅记录了错误日志,还记录一些警告信息。查着错误日志配置
可以通过命令:show variables like 'log_error';
-慢查询日志
可以定位一些有问题的SQL问题,从而进行SQL层面上的优化。可以在Mysql启动时,设置一个查询阈值,将运行时间超过(不包含等于,必须大于)此阈值的语句记录到该日志中。然后可以通过该日志找到这些
查询较慢的SQL,并加以分析和优化。设置的参数为:long_query_time,默认为10s,查询命令:show variables like 'long_query_time';
在默认情况下,Mysql是不启动的慢查询日志的,可以手动设置为ON,查看是否打开的命令:show variables like 'log_slow_queries'
另一个相关参数,log_queries_not_using_indexes,该参数如果是ON,则慢查询日志还会记录查询时,未使用索引的语句。MYSQL5.6版本之后,新添加了log_throttle_queries_not_using_indexes
用来记录每分钟往slow_log里记录未使用索引SQL语句的次数。默认为0,表示没有限制。
Mysql5.1版本之后,可以将慢查询的记录输出到一张表中,该表在mysql架构下,名为slow_log,设置输出格式的参数为log_output,该参数为全局动态参数,可以在线设置修改,查询参数命令
show variables like 'log_output';
-查询日志文件
该日志记录所有对数据库发起的请求记录,在5.1版本后,该日志记录被放到mysql下的general_log表中。
-二进制日志文件
二进制日志记录所有的修改操作,不包括SELECT和SHOW,因为这类操作并未对数据进行修改。如果操作并未对数据造成修改,也可能被记录下来,比如:
update xx set a=1 where b=2,但是xx表中并没有b=2这条数据,因此没有实质性的改变数据,但是同样会记录到改日志文件中。
该日志的几个重要作用:
1、恢复
某些数据的恢复需要二进制文件,比如某个数据进行全被恢复后,用户可以通过二进制日志文件进行point-in-time的恢复。
2、复制
与恢复原理类似,通过复制和二进制文件,保持几台服务器上数据的同步。
3、审计
用户可以通过二进制的文件里的信息来进行审计,判断是否有对数据库进行的注入攻击。
二进制日志文件可以通过设置参数log-bin[name=]来进行启动,不设置name的时候,默认为主机名,后缀为二进制的序列号,文件位置通过show variables like 'datadir';
查询可以获得。
设置二进制文件几个重要参数:
1、max_binlog_size
设置单个二进制文件的允许的最大值。
2、binlog_cache_size
针对支持事务的引擎,事务未提交前,会记录到一个缓存中,等该事务提交后,将该操作记录到二进制文件中。该缓存的大小就是由该参数控制,默认为32k,该参数是基于
会话的,因此新开一个会话,就会新分配一个binlog_cache_size大小的缓存。因此该值的设置需要特别小心。当一个事务的记录大于该块缓存大小时,则会记录到一个临时
文件中,因此该值又不能设置的太小。通过show global status命令查看binlog_cache_use、binlog_cache_disk_use的状态,来判断当前设置的缓存大小是否合适。
Binlog_cache_use记录了使用缓冲写二进制日志的次数,binlog_cache_disk_use记录了使用临时文件写二进制日志的次数
3、sync_binlog
默认情况下,二进制日志文件不是在每次写的时候就都写入磁盘的,因此在数据库发生宕机时,很有可能最后一部分日志信息为同步到磁盘中。这会给复制和恢复带来麻烦
。该参数就是用来控制同步到磁盘的写入的次数。当sync_binlog=1表示,采用同步写磁盘的方式来写日志文件。这是写操作就不会再使用系统的缓冲。该参数的默认值为0,
表示具体写入几次同步写入磁盘全由系统决定。
将sync_binlog设置为1时,在一个事务提交前,会立即写入到磁盘中,如果该事务因别的问题未能成功提交,日志是没有办法回滚回去,这个问题可以通过将参数innodb_su
pport_xa设为1来解决,虽然innodb_support_xa与XA事务有关,但它同时也确保了二进制日志和InnoDB存储引擎数据文件的同步。
4、binlog-do-db和binlog-ignore-db
参数binlog-do-db和binlog-ignore-db表示需要写入或忽略写入哪些库的日志。默认为空,表示需要同步所有库的日志到二进制日志
5、log-slave-update
如果当前数据库是复制中的slave角色,则它不会将从master取得并执行的二进制日志写入自己的二进制日志文件中去。如果需要写入,要设置log-slave-update。如果需要搭
建master=>slave=>slave架构的复制,则必须设置该参数
6、binlog_format
该参数很重要,它影响了日志的存储格式。在5.1版本前,是没有这个参数设置的,所有二进制日志存储都是基于SQL级别的。
5.1版本后,增加了该参数,可设置的值为STATEMENT、ROW和MIXED。
STATEMENT
-和之前的Mysql版本一样,是基于SQL语句级别的。
ROW
-二进制日志记录的不再是简单的SQL语句了,而是记录表的行更改情况,设置成row会造成二进制文件变大,增加磁盘压力和网络传输的开销。
MIXED
-在MIXED格式下,MySQL默认采用STATEMENT格式进行二进制日志文件的记录,但是在一些情况下会使用ROW格式,可能的情况有:
1)表的存储引擎为NDB,这时对表的DML操作都会以ROW格式记录。
2)使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不确定函数。
3)使用了INSERT DELAY语句。
4)使用了用户定义函数(UDF)。
5)使用了临时表(temporary table)。
binlog_format是动态参数,因此可以在数据库运行环境下进行更改
-套接字文件
在UNIX系统下本地连接MySQL可以采用UNIX域套接字方式,这种方式需要一个套接字(socket)文件。套接字文件可由参数socket控制。一般在/tmp目录下,
名为mysql.sock:
-pid文件
当MySQL实例启动时,会将自己的进程ID写入一个文件中——该文件即为pid文件。该文件可由参数pid_file控制,默认位于数据库目录下,文件名为主机名.pid
-表结构定义文件
因为MySQL插件式存储引擎的体系结构的关系,MySQL数据的存储是根据表进行的,每个表都会有与之对应的文件。但不论表采用何种存储引擎,MySQL都有一个以frm为后缀名的文件,
这个文件记录了该表的表结构定义。
frm还用来存放视图的定义,如用户创建了一个v_a视图,那么对应地会产生一个v_a.frm文件,用来记录视图的定义,该文件是文本文件
-存储引擎文件
1、表空间文件
InnoDB采用将存储的数据按表空间(tablespace)进行存放的设计。在默认配置下会有一个初始大小为10MB,名为ibdata1的文件。该文件就是默认的表空间文件(tablespace file),
用户可以通过参数innodb_data_file_path对其进行设置
用户可以通过多个文件组成一个表空间,同时制定文件的属性
innodb_data_file_path=/db/ibdata1:2000M;/dr/ibdata2:2000M:autoextend
这里将/db/ibdata1和/dr2/db/ibdata2两个文件用来组成表空间。若这两个文件位于不同的磁盘上,磁盘的负载可能被平均,因此可以提高数据库的整体性能。同时,两个文件的文件名后都跟了属性,
表示文件idbdata1的大小为2000MB,文件ibdata2的大小为2000MB,如果用完了这2000MB,该文件可以自动增长(autoextend)
设置innodb_data_file_path参数后,所有基于InnoDB存储引擎的表的数据都会记录到该共享表空间中。若设置了参数innodb_file_per_table,则用户可以将每个基于InnoDB存储引擎的表产生一个独
立表空间。独立表空间的命名规则为:表名.ibd。通过这样的方式,用户不用将所有数据都存放于默认的表空间中。下面这台MySQL数据库服务器设置了innodb_file_per_table
2、重做日志文件
在默认情况下,在InnoDB存储引擎的数据目录下会有两个名为ib_logfile0和ib_logfile1的文件
当实例或介质失败(media failure)时,重做日志文件就能派上用场。例如,数据库由于所在主机掉电导致实例失败,InnoDB存储引擎会使用重做日志恢复到掉电前的时刻,
以此来保证数据的完整性
每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组下至少有2个重做日志文件,如默认的ib_logfile0和ib_logfile1。为了得到更高的可靠性,用户可以设
置多个的镜像日志组(mirrored log groups),将不同的文件组放在不同的磁盘上,以此提高重做日志的高可用性。
下列参数影响着重做日志文件的属性:
□ innodb_log_file_size(文件日志大小)
□ innodb_log_files_in_group(每个文件组中的日志个数)
□ innodb_mirrored_log_groups(镜像文件组的个数)
□ innodb_log_group_home_dir(文件组的存储地址)