• 数据库日志


    数据库日志:

    首先,在MySQL中默认只开启了错误日志

    MySQL中的日志文件:

    • 错误日志(errorlog):
    • 一般查询日志(general log)
    • 慢查询日志(slow query log)
    • 二进制日志(binlog)
    • 中继日志(relay log)
    • 重做日志(redo log)
    • 回滚日志(undo log)

    这里先谈一下重做日志以及回滚日志以及二进制日志之间得关系,他们都与事务操作相关。

    重做日志

    作用:

    确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。(脏页:linux内核中的概念,高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的。)

    内容:

    物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。

    什么时候产生:

    事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。

    之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志缓存,原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M,Innodb存储引擎先将重做日志写入innodb_log_buffer中。然后通过其他方式将innodb日志缓冲区的日志刷新到磁盘。

    什么时候释放:

    当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。

    对应的物理文件:

    默认情况下,对应的物理文件位于数据库的data目录下的ib_logfile1&ib_logfile2(默认文件组的数量是2)

    回滚日志:

    作用:

    保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

    内容:

    逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。

    什么时候产生:

    事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性。

    什么时候释放:

    当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

    对应的物理文件:

    MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目录中。

    MySQL5.6之后,undo表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数
    如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。

    二进制日志:

    作用:

    用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。用于数据库的基于时间点的还原。

    内容:

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

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

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

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

    什么时候产生:

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

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

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

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

    什么时候释放:

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

    对应的物理文件:

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

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

    错误日志:

    存放服务器启动和关闭过程中的信息,服务器运行过程中的错误信息,事件调度器运行一个事件时产生的信息、在从服务器上启动从服务器进程时产生的信息。

    查询日志:

    这是最不应该记录的日志。因为一个非常繁忙的数据库服务器,其查询会有很多,每一次都记录日志会导致系统性能下降。而且还会有额外的空间开销。MySQL默认没有开启这个日志。注意不仅仅是SELECT。 

    慢查询日志:

    查询执行时长超过指定时长的查询,即为慢查询。这里的慢不一定是语句自身执行慢,如果一个操作锁定了某张表,尤其是独占锁锁定了这张表,那么其他人对于这张表的查询就阻塞掉了。但不管怎么讲,慢查询日志是我们通常拿来定位系统上查询操作执行速度过慢时常用到的一个评估工具。所以在生产环境中有时是很有必要启用慢查日志的。

    中继日志:

    在从服务器上的日志。就是说主从复制的时候,主服务器任何能够产生数据修改的操作,在写入数据文件的同时,还会把这个语句(也可能是行)记录到二进制日志文件中一份。从服务器就是使用一个用户帐号不断的去连接主服务器,并尝试去读取主服务器上二进制日志中的每一个条目,从服务器将这些挨个的读到从服务器上,在执行之前,先要将这些读到的保存在本地的日志文件中,而后从本地日志文件中读一条执行一条。这个日志文件就叫做中继日志。

  • 相关阅读:
    Linux客户/服务器程序设计范式——阿帕奇服务器(多进程)
    Linux客户/服务器程序设计范式2——并发服务器(进程池)
    封装readn
    C++学习之路: 函数适配器
    C++学习之路: 智能指针入门
    C++学习之路: 单例模板
    C++学习之路: 左值&右值 的讨论 和 ”move“ 值传递方式
    C++学习之路: 特殊操作符->的重载
    C++学习之路: 模板函数
    C++学习之路: 时间戳 封装成类
  • 原文地址:https://www.cnblogs.com/xiuercui/p/13415700.html
Copyright © 2020-2023  润新知