对于innodb引擎,在执行一条语句,里面如果包含很多内容,会有redo和undo日志产生,这些都会记录到表空间中,这也是即使你使用了分表空间存储数据,表空间也会增加的原因;如果你在执行过程中断电或者mysql连接断开,系统故障时,执行的一些内容会记录在redo和undo日志文件中,而系统可以根据这些日志来还原数据。

对于undo日志的分析:
undo数据的特点:
1、undo日志中的数据相当于记录的是在执行修改数据操作前的数据,即没有被修改前的数据,主要是为了保证用户的读一致性
insert、update、delete的相关信息记录在Undo表空间的回滚段内
如一事务的修改还未提交,另一事务所查询的数值会由Undo信息提供
2、在事务修改数据时产生
3、至少保存到事务结束

undo数据的作用:
1、回滚操作
2、实现读一致性
3、从失败的事务中还原数据
4、非正常停机后的实例恢复

而对于tmpdir保存的数据:
tmpdir是mysql临时数据的存放目录,对于数据量相对较大的数据会存放到tmpdir指定的目录中,这里面保存的数据是符合查询、修改或者更新条件的一些数据,在查询操作时可以加速对数据的访问,对故障的恢复是不起作用的。

通过redo和undo日志还原数据的流程:
(1)正向扫描日志文件(从头到尾),找出故障发生前已经提交的事务(存在begin transaction
和commit记录),将其标识记入重做(redo)队列。同时找出故障发生时未完成的事务
(只有begin transaction,没commit),将其标识记入(undo)队列
(2)对undo队列的各事务进行撤销处理。进行undo的处理方法是,反向扫描日志文件,对每个undo
事务的更新操作执行反操作,即将日志记录中“更新前的值”写入数据库。
(3)对重做日志中的各事务进行重做操作。进行redo的处理方法是,正向扫描日志,对每个redo事务
重新执行日志文件登记操作。即将日志中“更新后的值”写入数据库。

对于tmpdir的作用网上搜索也没有太多的结果,这样总结不知道有没有什么纰漏,望批评指正!