① MySQL中重做日志,回滚日志,以及二进制日志的简单总结
MySQL日志文件的总结
MySQL中有六种日志文件,包括重做日志、回滚日志、二进制日志、错误日志、慢查询日志和一般查询日志。其中,重做日志、回滚日志和二进制日志与事务操作紧密相关,对理解事务操作至关重要。
重做日志(redo log)确保事务的持久性,防止数据丢失。它记录的是物理数据页面的修改信息,顺序写入到文件中。事务开始后便产生redo log,即使事务未提交,也会将redo log写入文件,以备重启时进行重做操作。默认文件位置在数据库的data目录下的ib_logfile1和ib_logfile2,文件数量由innodb_log_files_in_group参数决定,默认为2。文件大小由innodb_log_file_size参数配置,日志镜像文件组数量默认为1。innodb_log_buffer提供缓存区,用于在事务执行过程中逐步写入redo log文件,Master Thread线程会定期将缓冲区刷新到文件中,而不是等到事务提交。
回滚日志(undo log)保存了事务执行前的数据版本,用于事务回滚和提供并发控制。它记录逻辑格式的事务信息,与redo log不同的是,undo操作只在逻辑上恢复数据状态,不直接修改物理数据页面。undo log在事务开始前生成,在事务提交后放入待清理链表,由purge线程判断是否可以清理。默认情况下,undo日志存储在共享表空间的回滚段中,即ibdata文件,当数据库进行大量事务操作时,共享表空间可能会变得非常大,且默认情况下不支持自动收缩。为解决这一问题,MySQL 5.7之后引入了独立的undo表空间配置。
二进制日志(binlog)用于主从复制和基于时间点的数据库还原。它记录逻辑格式的SQL语句,包括增删改操作的执行及其反向操作。在复制场景中,从库通过重播主库的binlog实现同步。binlog在事务提交时一次性记录所有相关SQL语句。与redo log不同的是,binlog在事务提交时写入,而不是在事务开始后立即写入。默认情况下,binlog文件在达到最大大小后滚动更新,并通过参数expire_logs_days自动删除非活动日志文件。
总结,重做日志、回滚日志和二进制日志在MySQL中分别用于事务持久性、并发控制和数据复制与还原,理解这些日志的特点和作用有助于深入理解MySQL中的事务机制。
② Redo log是个什么样的文件呢
Log File物理结构
log block结构分为日志头段、日志记录、日志尾部
Block Header,占用12字节
Data部分
Block tailer,占用4字节
Block Header
这个部分是每个Block的头部,主要记录的块的信息
Block Number,表示这是第几个block,占用4字节,是通过LSN计算得来的,占用4字节
Block data len,表示该block中有多少字节已经被使用了,占用2字节
First Rec offet,表示该block中作为第一个新的mtr开始的偏移量,占用2字节
Checkpoint number,表示该log block最后被写入时的检查点的值,占用4字节
③ 什么是数据文件,控制文件,日志文件
数据文件:将数据从向外大容量复制操作传输到向内大容量复制操作的文件回。
控制文件:是Oracle的物理答文件之一,它记录了数据库的名字、数据文件的位置等信息。控制文件的重要性在于,一旦控制文件损坏,数据库将会宕机。
日志文件:就是记录系统的一些操作、异常等行为的文件~ 是包含系统消息的文件,包括内核、服务、在系统上运行的应用程序等。不同的日志文件记载不同的信息。