首页 > 编程知识 正文

mysql sql优化的几种方法,数据库日志文件记录的是什么

时间:2023-05-04 03:13:55 阅读:60552 作者:4835

前言

MySQL包含以下日志文件:

重做日志)重做日志

2 :回退日志(撤消日志) () ) ) ) ) ) ) ) ) ) ) ) ) 652 ) )

3 :二进制日志(kydxgzlog ) ) )。

4 :错误日志(错误日志) ) ) ) ) )。

5 )滚动查询日志(slow query log ) ) ) ) )。

6 :常规查询日志(常规日志) ) ) )。

7 )继电器日志(relay log )。

其中,重做日志和回退日志与事务操作有关,二进制日志也与事务操作有关。 这三个日志对理解MySQL中的事务操作具有重要意义。

一.重做日志

角色:

确保事务的持久性。 重做日志用于记录事务执行后的状态,并恢复未写入数据文件的成功事务更新的数据。 具有以下特性:在发生故障时,有脏页尚未写入磁盘,在重新启动mysql服务时,通过基于重做日志进行重试来实现事务的持久性。

内容:

物理格式日志记录物理数据页的修改信息,并将该重做日志顺序写入重做日志文件的物理文件中。

什么时候出生:

事务启动时将生成重做日志。 重做日志的磁盘放弃不是在事务提交后写入的,而是在事务运行时开始写入重做日志文件。

什么时候释放:

将与事务处理对应的脏页写入磁盘后,重做日志的任务也将完成,可以回收重做日志占用的空间。

对应的物理文件:

缺省情况下,相应的物理文件位于数据库data目录下的ib_logfile1ib_logfile2中

innodb_log_group_home_dir指定日志文件组所在的路径。 默认的. /表示位于数据库的数据目录下。

innodb_log_files_in_group指定重做日志文件组中的文件数。 默认值为2

关于文件的大小和数量,由以下两个参数组成:

innodb _ log _ file _ size重做日志文件的大小。

innodb_mirrored_log_groups指定日志镜像文件组的数量。 默认值为1

其他:

重要的是,重做日志是什么时候写的磁盘? 前面说的是事情开始后逐步写盘的。

重做日志不是在事务提交后写入重做日志缓存,而是在事务启动后逐步写入重做日志文件。 这是重做日志中的缓存区域Innodb_log_buffer,Innodb_log_buffer的默认大小为8M (在此处设置的16M ),而Innodb存储引擎为重做日志

然后,innodb日志缓冲区日志通过以下三种方式刷新到磁盘

Master Thread每秒刷新一次Innodb_log_buffer到重做日志文件。

每次提交事务处理时,都会将重做日志刷新为重做日志文件。

当重做日志缓存的可用空间不足一半时,重做日志缓存将刷新到重做日志文件中

由此可见,重做日志以多种方式写入磁盘。 特别是在第一种方法中,从Innodb_log_buffer写入重做日志文件是Master Thread线程的调度任务。

因此,重做日志的写入操作不一定会在事务提交时写入重做日志文件,而是在事务启动时逐步启动。

另外,引用《MySQL技术内幕 Innodb 存储引擎》(page37 )的原段子。

即使事务未提交,Innodb存储引擎也会每秒将重做日志缓存刷新为重做日志文件。

这是你应该知道的。 这是因为很好地说明再大的事务提交(commit )的时间也很短。

二、回滚日志(撤消日志) ) ) ) ) ) )。

角色:

它可以保证数据的原子性,存储事务发生之前的数据版本,可以用于回滚,同时提供多版本并发控制下的读取(MVCC )或非锁定读取

内容:

逻辑格式日志与重做日志的不同之处在于,在执行还原时,它只是将数据从逻辑上恢复到事务之前的状态,而不是从物理页进行操作和实现。

什么时候出生:

在启动事务处理之前,在还原日志中生成当前版本,还原也生成重做以确保还原日志的可靠性

什么时候释放:

事务提交后,还原日志并不立即删除。 放置在要清理的链表中,其他事务确定使用还原段中的表之前事务的版本信息,并且purge线程确定是否可以清理还原日志的日志空间。

对应的物理文件:

在MySQL5.6之前,还原表空间位于共享表空间的回退段中,共享表空间的默认名称为ibdata,位于数据文件目录中。

从MySQL5.6开始,还原表空间可以配置为独立文件,但必须先在配置文件中配置。 数据库初始化完成后生效,不能更改还原日志文件的数量

如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。

关于MySQL5.7之后的独立undo 表空间配置参数如下:

innodb_undo_directory = /data/undospace/ –undo独立表空间的存放目录 innodb_undo_logs = 128 –回滚段为128KB innodb_undo_tablespaces = 4 –指定有4个undo log文件

如果undo使用的共享表空间,这个共享表空间中又不仅仅是存储了undo的信息,共享表空间的默认为与MySQL的数据目录下面,其属性由参数innodb_data_file_path配置。

其他:

undo是在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生。

默认情况下undo文件是保持在共享表空间的,也即ibdatafile文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的undo信息,全部保存在共享表空间中的。

因此共享表空间可能会变的很大,默认情况下,也就是undo 日志使用共享表空间的时候,被“撑大”的共享表空间是不会也不能自动收缩的。

因此,mysql5.7之后的“独立undo 表空间”的配置就显得很有必要了。

三、二进制日志(kydxgzlog):

作用:

用于复制,在主从复制中,从库利用主库上的kydxgzlog进行重播,实现主从同步。

用于数据库的基于时间点的还原。

内容:

逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。

但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。

在使用mysqlkydxgzlog解析kydxgzlog之后一些都会真相大白。

因此可以基于kydxgzlog做到类似于oracle的闪回功能,其实都是依赖于kydxgzlog中的日志记录。

什么时候产生:

事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到kydxgzlog中。

这里与redo log很明显的差异就是redo log并不一定是在事务提交的时候刷新到磁盘,redo log是在事务开始之后就开始逐步写入磁盘。

因此对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了kydxgz_log的情况下,对于较大事务的提交,可能会变得比较慢一些。

这是因为kydxgzlog是在事务提交的时候一次性写入的造成的,这些可以通过测试验证。

什么时候释放:

kydxgzlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。

对应的物理文件:

配置文件的路径为log_kydxgz_basename,kydxgzlog日志文件按照指定大小,当日志文件达到指定的最大的大小之后,进行滚动更新,生成新的日志文件。

对于每个kydxgzlog日志文件,通过一个统一的index文件来组织。

其他:

二进制日志的作用之一是还原数据库的,这与redo log很类似,很多人混淆过,但是两者有本质的不同

作用不同:redo log是保证事务的持久性的,是事务层面的,kydxgzlog作为还原的功能,是数据库层面的(当然也可以精确到事务层面的),虽然都有还原的意思,但是其保护数据的层次是不一样的。

内容不同:redo log是物理日志,是数据页面的修改之后的物理记录,kydxgzlog是逻辑日志,可以简单认为记录的就是sql语句

另外,两者日志产生的时间,可以释放的时间,在可释放的情况下清理机制,都是完全不同的。

恢复数据时候的效率,基于物理日志的redo log恢复数据的效率要高于语句逻辑日志的kydxgzlog

关于事务提交时,redo log和kydxgzlog的写入顺序,为了保证主从复制时候的主从一致(当然也包括使用kydxgzlog进行基于时间点还原的情况),是要严格一致的,MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和kydxgzlog的一致性的,理论上是先写redo log,再写kydxgzlog,两个日志都提交成功(刷入磁盘),事务才算真正的完成。

四、错误日志

错误日志记录着mysqld启动和停止,以及服务器在运行过程中发生的错误的相关信息。在默认情况下,系统记录错误日志的功能是关闭的,错误信息被输出到标准错误输出。

指定日志路径两种方法:

编辑my.cnf 写入 log-error=[path]

通过命令参数错误日志 mysqld_safe –user=mysql –log-error=[path] &

显示错误日志的命令(如下图所示)

五、普通查询日志 general query log

记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,general log 都会将其记录下来 ,记录的格式为 {Time ,Id ,Command,Argument }。也正因为mysql服务器需要不断地记录日志,开启General log会产生不小的系统开销。 因此,Mysql默认是把General log关闭的。

查看日志的存放方式:show variables like ‘log_output’;

如果设置mysql> set global log_output=’table’ 的话,则日志结果会记录到名为gengera_log的表中,这表的默认引擎都是CSV

如果设置表数据到文件set global log_output=file;

设置general log的日志文件路径:

set global general_log_file=’/tmp/general.log’;

开启general log: set global general_log=on;

关闭general log: set global general_log=off;

然后在用:show global variables like ‘general_log’

六、慢查询日志慢日志记录执行时间过长和没有使用索引的查询语句,报错select、update、delete以及insert语句,慢日志只会记录执行成功的语句。

1. 查看慢查询时间:show variables like “long_query_time”;默认10s

2. 查看慢查询配置情况:show status like “%slow_queries%”;

3. 查看慢查询日志路径:show variables like “%slow%”;

4. 开启慢日志

查看已经开启:

内容来源于网络如有侵权请私信删除

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。