赞
踩
在MySQL中,很多的功能也都需要基于日志实现,比如事务回滚、数据持久化、数据恢复、数据迁移、MVCC机制。其中undolog、redolog都是InnoDB引擎中的日志,而且都是在Buffer Pool中,而binlog在Server层中,位于每条线程中。
undo log 叫做回滚日志,它保证了事务的 ACID 特性中的原子性(Atomicity),是存储引擎层生成的日志,记录的是逻辑操作,不会去修改磁盘数据页的数据。主要用于记录数据被修改前的信息,在表记录修改之前,会先把原始数据拷贝到undo log里,如果事务回滚,则可以通过undo log中的历史数据来恢复到事务执行前的数据。
redo log 叫做重做日志,它保证了事务的 ACID 特性中的持久性(Durability),是存储引擎层生成的日志,记录的是物理操作。其目的主要是为了防止提交到Buffer Pool中的数据还没来的急刷到磁盘数据页服务崩溃而导致的数据丢失问题。将所有操作都记录到redo log日志文件中,在重启mysql服务的时候,根据redo log文件进行重做,就可以恢复mysql崩溃前未刷到磁盘表空间中的内存数据,从而保证事务的持久性。
更新的数据写入Redo Log Buffer之后,并不会立即持久化到Redo Log FIle,需要等待操作系统调用fsync()操作,才会刷到磁盘的Redo Log FIle上。InnoDB通过innodb_flush_log_at_trx_commit 参数可以控制策略,可设置该参数的值为:0,1, 2。
设置为0(延迟写):每次数据从内存中写入到redo log buffer后,数据依然留在redo log buffer中,然后由后台线程每秒写入os cache中并调用fsync()写入到磁盘的Redo Log FIle中。这种方式每个1秒写入到磁盘文件,如果在这1秒之内,MySQL服务挂了,则会丢失这1秒的数据。
设置为1 (实时写,实时刷, 默认值 ):每次数据写入到redo log buffer后,会立即写入到os cache中并调用fsync()写到磁盘的Redo Log FIle中。这种方式提交事务后立即会刷新到磁盘文件,所以不会丢失数据。
设置为2(实时写,延时刷):每次数据写入到redo log buffer后,会立即写入到os cache,然后由后台线程每秒调用fsync()将os cache的数据写入磁盘的Redo Log FIle中。这种方式如果仅仅只是MySQL服务挂了不会有任何数据丢失,但是如果操作系统挂了则会丢失1秒的数据。
除了上面3种策略进行刷盘以外,还有两种场景会让一个没有提交的事务的 redo log 写入到磁盘中。
磁盘上的redo log文件不只一个,而是以一个日志文件组的形式出现的。这些文件以ib_logfile[数字](数字可以是0、1、2…)的形式进行命名,每个的Redo日志文件大小都是一样的,默认由两个文件组成。在写入数据的时候采用循环使用的方式向redo log日志文件组里写数据,而在整个日志文件组中还有两个重要的属性,分别是write pos、checkpoint。
bin log是二进制日志文件,它记录了数据库所有执行的 DDL 和 DML 等数据库更新的语句,但是不包含select或者show等没有修改任何数据的语句。它是MySQL级别的日志,也就是说所有的存储引擎都会产生bin log,而redo log或者undo log事务日志只有innoDB存储引擎才有。
bin log和 redo log类似,都有3种刷盘策略, bin log的write和fsync时机是由参数 sync_binlog 控制,默认是 0 。
可以通过命令show variables like '%log_bin%';
查看bin log开启状态以及最终输出的位置。
通过SHOW BINARY LOGS;
查看当前的二进制日志文件列表及大小。
可以用show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
命令工具查看bin log日志中的内容。
IN ‘log_name’:指定要查询的binlog文件名(不指定就是第一个binlog文件);
FROM pos:指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算);
LIMIT [offset] :偏移量(不指定就是0);
row_count :查询总条数(不指定就是所有行);
修改MySQL的 my.cnf(linux) 或my.ini(windows)文件可以设置二进制日志的相关参数。
# 日志保存的位置
log-bin=SC-bin
# 日志保存的时间,单位是秒
binlog_expire_logs_seconds=600
# 单个bin log日志的容量
max_binlog_size=100M
bin log输出的格式类型有3种,默认是ROW类型。通过show variables like 'binlog_format';
查看bin log 日志格式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。