参数文件
动态参数
动态参数可以在Mysql实例运行中进行更改,可以通过SET命令对动态参数值进行修改。
SET [global|session] key = value;
静态参数
静态参数在整个实例生命周期内不得进行更改,需要重新启动实例才会生效。
日志文件
错误日志
记录了对Mysql的启动、运行、关闭过程中所有的错误、警告和正确的信息。
慢查询日志
可以帮助定位可能存在问题的SQL语句,从而进行SQL层面的优化。Mysql在启动时设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。
通过设置 long_query_time 来设置,单位为秒。
log_queries_not_using_indexes: 记录没有使用索引的查询日志。
log_throttle_queries_not_using_indexes:每分钟允许记录到showLog的且未使用索引的SQL语句次数,0表示不限制。
查看慢日志
1 | mysqldumpslow *.log |
查询日志
查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到了正确的执行。
查看查询日志:
1 | tail *.log |
二进制日志
二进制日志记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类对数据本身没有修改的操作。二进制日志还包括了执行数据库更改操作的时间等其他额外信息。
作用
- 恢复
某些数据的恢复需要二进制日志,如在一个数据库全备文件恢复后,用户可以通过二进制日志进行pint-in-time的恢复。 - 复制
与恢复类似,通过复制和执行二进制日志使另一台远程的MySQL数据库与当前数据库进行实时同步。 - 审计
通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。
配置
- max_binlog_size: 单个日志文件的最大值,默认1G
- binlog_cache_size: 所有未提交的二进制日志会被记录到一个缓存中,等该事务提交时直接将缓冲中的二进制日志写入二进制日志文件,该缓冲的大小默认为32。该值是基于会话的,每个会话会申请32K的空间。
- binlog_cache_use: 记录了使用临时文件写二进制日志的次数。
- sync_binlog:表示每写缓冲多少次就同步到磁盘,为1时,表示采用同步写磁盘的方式来写二进制日志,这时写操作不使用操作系统的缓冲来写二进制日志。默认值为0.
- binlog-do-db:写入哪些库的日志,默认为空表示同步所有库的日志到二进制日志。
- binlog-ignore-db:忽略哪些库的日志
- log-slave-update:当前库为slave时,如果需要将从master取得并执行的二进制日志写入自己的二进制日志文件中时需要设置该值。
- binlog_format:STATEMENT/ROW/MIXED
STATEMENT:格式基于SQL语句,如果主服务器运行rand、uuid等函数或者触发器等操作时,就会导致主从服务器上表中的数据库表中的数据库不一致。
ROW:二进制的日志,记录了表的更改情况,解决了Statement下复制的问题。可以设置InnoDB的事务隔离设置为READ_COMMITTED,以获得更好的并发性。
MIXED:默认采用STATEMENT,但是在特殊情况下会转为ROW。
套接字文件
名为mysql.sock,可以通过Unix域套接字方式进行与本地MySQL进行连接。套接字文件由参数socket控制。
PID文件
MySQL实例启动时,会将自己的进程ID写入一个文件中,该文件为PID文件。
表结构定义文件
因为MySQL插件式存储引擎的体系结构关系,MySQL数据的存储是根据表进行的,每个表都会有与之对应的文件。但不论表采用哪种存储引擎,MySQL都有一个以frm为后缀名的文件,记录了这个表结构或者视图的定义。
Innodb存储引擎文件
表空间文件
InnoDB采用将存储的数据按照表空间进行存放的设计。默认配置喜爱会有一个初始大小为10MB,名为ibdata1的默认表空间文件。
将ibdata1,ibdata2两个文件用来组成表空间。
1 | innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend |
如果该两个文件位于不同的磁盘上,磁盘的负载可能被平均,因此可以提高数据库的整体性能。
设置innodb_data_file_path后,所有给予innoDB存储引擎的表的数据都会记录带该共享表空间中。
1 | innodb_file_per_table=ON //每个基于InnoDB存储引擎的表产生一个独立表空间。命名规则是:表名.ibd |
单独的表空间文件仅存储该表的数据、索引和插入缓冲BITMAP等信息,其余信息还存放在默认的表空间中。
重做日志文件
默认情况下,在InnoDB存储引擎的数据目录下会有两个名为ib_logfile0和ib_logfile1的文件。
他们记录了对于InnoDB存储引擎的事务日志。
重做日志用于由于主机宕机导致实例失败时,恢复到失败前的状态,一次来保证数据的完整性。
每个InnoDB存储引擎至少有1个重做日志文件组,每个文件组下至少有2个重做日志文件。为了得到更高的可靠性,用户可以设置多个的景象日志组。将不同的组存放在不同的磁盘上,以此提高重做日志的高可用性。在日志组中每个重做日志文件的大小一致,并以循环写入的方式运行。
InnoDB存储引擎献血重做日志文件1,当达到文件的最后时,会切换到重做日志文件2,再当重做日志文件2也被写满时,再切换到重做日志文件1中。
1 | innodb_log_file_size:每个重做日志文件的大小 |
重做日志文件的大小对InnoDB存储性能有非常大的影响。
如果设置太大,在恢复时可能需要很长的时间。
如果设置太小,会导致一个事务的日志需要多次切换重做日志文件。同时会导致频繁地发生 async checkpoint, 导致性能抖动。
二进制文件与重做日志
层次不同:
二进制日志:记录所有与MySQL数据库有关的日志记录,包括InnoDB,MyISAM,Heap等其他存储引擎的日志。
重做日志:值记录InnoDB存储引擎本身的事务日志。
内容不同:
二进制日志文件记录的是一个事务的具体操作内容,为逻辑日志。
重做日志记录的是关于每个页的更改的物理情况。
写入时间不同:
二进制文件仅在事务提交前进行,无论事务大小,只写磁盘一次。
在事务进行的过程后再难过,不断有重做日志条目被写入到重做日志文件中。
重做日志条目结构
redo_log_type | space | page_no | redo_log_body
redo_log_type : 占用1字节,表示重做日志的类型
space: 表示表空间的ID,采用压缩的方式,占用空间可能小于4字节
page_no:表示页的偏移量,压缩方式
redo_log_body:每个重做日志的数据部分,恢复时需要调用相应函数解析。
重做日志写入
重做日志的写入不是直接写,而是先写入重做日志缓冲(redo log buffer)中,然后按照一定的条件顺序地写入日志文件。
从重做日志缓冲网磁盘写入时,按照写入的最小单位(扇区大小:512个字节)进行写入,因此可以保证写入必定是成功的,因此在重做日志的写入过程不需要有doublewrite。
写入时机:
1) 不论事务已经提交,主线程每秒都会将重做日志缓冲写入到磁盘的重做日志文件中。
2) 事务提交时,设置了innodb_flush_log_at_trx_commit。
值为0时,不将事物的重做日志写入磁盘上的日志文件,
1表示在执行commit时将重做日志缓冲同步写到磁盘,
2表示将重做日志异步写到磁盘(也就是写到文件系统的缓存中)
因此,为了保证ACID中的D(持久性),必须将innodb_flush_log_at_trx_commit设置为1,当数据库因为意外宕机时,可以通过重做日志文件恢复,并保证可以恢复已经提交的事务。