一、重做日志管理
Redo日志包含了所有物理数据页的修改内容,Insert、delete、update等dml操作、create等DDL操作,最终都会转化为对物理数据页的修改,这些修改都会反映到redo中。一般说来一条sql语句,在系统内部会转化为多个相互独立的事务来完成,物理事务提交时产生redo日志,并最终写入联机日志文件中。
一个物理事务包含一个或者多个redo记录(redo record,简称RREC),每条redo记录都对应一个修改数据页的动作,根据记录内容的不同,RREC可以分为两类:物理RREC和逻辑RREC。物理RREC记录的是数据页的变化情况,内容包括:操作类习性、修改数据页地址、页内偏移、数据页上的修改内容,如果是变长类的Redo记录,在RREC记录头之后还有一个两字节的长度信息。逻辑RREC记录的是一些数据库逻辑操纵步骤,主要包括:事务启动、事务提交、事务回滚、字典封锁、事务封锁、B树封锁、字典淘汰等,一般只在配置为Primary模式时才会产生逻辑RREC。
DMDSC集群中,各个节点拥有独立的日志文件,Redo日志的LSN值也是顺序递增的,Redo日志只会写入当前数据页实例的联机日志文件,与集群系统中的其他数据库实例没有关系,考虑到所有节点都可以修改数据,同一个数据页可能由不同节点先后修改,为了体现修改的先后顺序,确保故障恢复时能够按照操作的顺序将数据正确恢复。DMDSC集群要求对同一个数据页的修改,产生LSN值是全局递增的,各个节点对同一个数据页的修改在日志系统中是严格有序的。但是,针对不同数据页的修改并不要求LSN是全局递增的,也就是说只有多个节点修改相同数据页时,才会产生全局LSN同步问题,并且LSN全局同步,是在缓存交换时附带完成的,并不会增加系统的额外开销。
与单节点系统相比,DMDSC的体质系统存在以下差异:
1、本地Redo日志系统中,LSN值保证递增的,后提交事务的LSN值一定更大;但顺序提交的两个事务产生的LSN值,不能保证一定是连续的。
2、全局Redo日志系统中,LSN值不在严格保证唯一性。不同节点可能存在LSN值相等的重做日志记录。
3、故障重启时,控制节点需要重做所有节点的Redo日志,重做过程中会根据LSN排序,从小到大依次重做。
4、联机Redo日志文件需要保存在共享存储中。
二、回滚记录管理
DMDSC集群的多版本并发控制MVCC实现策略是,通过回滚记录获取数据的历史版本,通过活动事务视图判断事务可见性、确定获取指定版本数据。因此,回滚记录也必须进行全局维护,有可能在节点间传递。与单节点一样,DMDSC集群中只有一个回滚表空间,回滚记录保存在回滚页中,回滚页与保存用户记录的数据页一样,由Buffer系统管理,并通过缓存交换机制实现全局数据共享。
为了减少并发冲突,提高系统性能,DMDSC集群中为每个节点分配了一个单独的回滚段(segment),虽然这些回滚段位于一个回滚表空间中,但是各个几点的回滚页申请、释放,并不会产生全局冲突。
与重做日志一样,DMDSC集群故障重启时,控制节点会扫描所有节点的回滚段,收集未提交事务进行回滚,收集已提交事务进行purge操作。