系统文件包数据文件、配置文件、pid进程文件、socket网络链接文件,这些文件都可以理解为日志文件。
日志文件分类:
- 错误日志(error log) : 记录mysql服务的启停时正确和错误的信息,还记录启动、停止、运行过程中的错误信息。默认开启, 查看命令 --- show variables like '%log_error%'
- 通用查询日志(general query log) : 记录一般查询语句, 查看命令 --- show variables like '%general%'
- 中继日志(relay log): 主从复制,从服务器保存从主服务器读取的二进制文件中的事件。
- 二进制日志(binary log / binlog) : 记录了对MySQL数据库执行的更改操作,并且记录了语句的发生时间、执行时长;但是它不记录select、show等不修改数据库的SQL。主要用于数据库恢复和主从复制。
-
show variables like '%log_bin%'; // 是否开启
-
show variables like '%binlog%'; //参数查看
-
show binary logs;// 查看日志文件
-
- 慢查询日志(slow query log) : 记录所有执行时间超时的查询SQL, 默认10S
-
show variables like '%slow_query%'; // 是否开启
-
show variables like '%long_query_time%'; // 时长
-
-
重做日志(redo log): 记录的是物理数据页面的修改的信息, 确保事务的持久性。
- 回滚日志(undo log): 记录事务大声之前的数据的一个版本, 用于事务回滚。
数据文件:
- db.opt文件, 记录这个库的默认使用的字符集和校验规则
- frm文件, 存储与表相关的元数据(meta)信息, 包括表结构的定义信息等, 每张表都有一个frm文件
- ibd文件、ibdata文件, 存放innoDB的数据文件(包括索引), innoDB存储引擎有两种表空间:独立表空间和共享表空间, 独立表空间使用.ibd文件存放数据, 且一张表对应一个.ibd文件;共享表空间使用.ibdata文件, 所有表共同使用一个或多个(自行配置).ibdata文件。
- MYD文件,是MyISAM存储引擎专用文件,存放表数据,一张表对应一个.MYD文件
- MYI文件,是MYISAM存储引擎专用文件,存放索引相关信息, 一张表对应一个.MYI文件
- ibdata1文件,系统表空间数据文件,存放表元数据、undo日志等
- ib_logfile0、ib_logfile1文件: redo log日志文件
下面是我本地mysql的系统文件信息
二进制日志--binlog
binlog日志作用:
binlog 是记录所有数据库表结构变更及数据变更的二进制日志, 不会记录select 和show 这类操作。binlog日志以事件的形式记录,还包含sql语句执行消耗的时间。开启binlog日志主要有两个应用场景:
- 主从复制:在主库中开启binlog, 从库从主库的binlog中获取信息存储到自己的relaylog中时间数据同步
- 数据恢复: 通过mysqlbinlog工具来恢复数据
下面是一段binlog日志信息:
从中可以看出,binlog日志文件中记录了我们对表的所有操作过程。
binlog日志什么时候产生:
在事务提交的时候,mysql会一次性将事务中的sql与按照一定的格式记录到binlog中。
binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。
慢查询日志--slow query log
慢查询日志在我们做性能优化时可以帮助我们记录程序运行过程中,查询时间超过预定时间的SQL语句。具体指运行时间超过long_query_time值的SQL,long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志。
慢查询日志相关参数:
- slow_query_log : 是否开启慢查询日志,ON/OFF
- slow_query_log_file: 慢查询日志路径
- long_query_time: 慢查询阈值, 当SQL查询时间超过设定的阈值时,记录日志。
- log_queries_not_using_index: 记录未使用索引的查询语句, ON/OFF
- log_output: 日志存储方式。
- FILE: 日志存入文件, 默认值
- TABLE:日志存入数据库 mysql.slow_log
查看这些参数的设置使用show variables 语句即可查询, 设置参数值使用 set global 语句, 如开启慢查询: set global slow_query_log=1; 这里,1--ON, 0--OFF
但是, 这里慢查询的设置只对本次服务有效, 一旦mysql服务重启, 需要重新设置, 如果要永久设置, 需要修改my.cnf文件,增加或修改对应的参数值,然后重启mysql。不过一般慢查询我们只会在需要对系统进行性能优化时才会开启, 手动设置其参数就可以了。
这里介绍个mysql自带的慢查询日志分析工具mysqldumpslow:
mysqldumpslow:
- -s:表示按照何种方式排序
- c: 访问计数
- l:锁定时间
- r:返回记录
- t:查询时间
- al:平均锁定时间
- ar:平均返回记录数
- at:平均查询时间
- -t : 可以理解为 top n
- -g: grep 正则表达匹配
# 得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log
重做日志(redo log)
redo log保证事务的持久性,防止发生故障时,有未写入磁盘的数据,重启mysql服务时,根据redo log进行重做,从而保证事务的持久性。
redo log在事务开始之后就产生,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中便开始写入redo log文件中。
redo log 相关参数:
- innodb_log_group_home_dir : 指定日志文件组所在的路径, 默认./ , 表示数据库的数据目录
- innodb_log_files_in_group :指定重做日志文件组中文件的数量, 默认2
- innodb_log_file_size:重做日志文件的大小
- innodb_mirrored_log_groups :制定日志镜像文件组的数量, 默认1,5.7中被移除
redo log文件写入过程:
innodb存储引擎先将重做日志写入到innodb_log_buffer中, 默认大小为8M, 然后通过下面三种方式从缓冲区将日志刷新到磁盘日志中:
- Master Thread每秒一次执行刷新innodb_log_buffer 到重做日志文件
- 每个事务提交时将重做日志刷新到重做日志文件
- 当缓存区可用空间小于一半时,重做日志缓存被刷新到redo log文件中
由此可以看出,重做日志通过不止一种方式写入到磁盘,尤其是对于第一种方式,Innodb_log_buffer到重做日志文件是Master Thread线程的定时任务。因此重做日志的写盘,并不一定是随着事务的提交才写入重做日志文件的,而是随着事务的开始,逐步开始的。
另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:
即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。
这一点是必须要知道的,因为这可以很好地解释再大的事务的提交(commit)的时间也是很短暂的。
回滚日志(undo log)
undo log 保存了事务发生之前的数据的一个版本,用于回滚操作,同事可以提供多版本并发控制下的读(MVCC) 。
事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性。
undo log中存储的是逻辑格式日志信息, 记录各个事务之间前后链路关系,仅仅是将数据从逻辑上恢复至事务之前的状态。
释放日志:
当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。
undo log的相关参数配置:
- innodb_undo_directory : undo log的独立表空间存放目录
- innodb_undo_logs :回滚段大小
- innodb_undo_tablespaces : undo log 文件个数