数据库同步过程中既要保证数据库装载的效率,又要保证数据库每个交易的原子性,即保证一个事务中多条SQL语句执行的成功出于以上目
数据库同步过程中既要保证数据库装载的效率,又要保证数据库每个交易的原子性,即保证一个事务中多条SQL语句执行的成功出于以上目的,我们选择多表并发加多断点方式来进行同步,原理是取出需要同步的事务,按照表及SQL语句量进行划分,分给不同的进程来执行,每个进程有一个断点,当一个表的某一条SQL语句执行出错的时候,该进程会记录下此断点,该表停止同步,其他表的数据同步继续进行,当手工处理完该表出错的SQL语句后,该进程根据标志把错误表需要同步的SQL语句重新执行或跳过,这样同步进程会继续,并且个别表的错误不会影响整体的同步
那么原子性如何能够在同步过程中保持一致呢?借助网格断点就可以达到该目的。网格断点实际上就是把交易的SCN号和每条SQL语句的表顺序进行关联,记录该SCN号中的某条SQL语句执行情况的流水文件,日志分析进程按照表名创建多个网格文件,,内容是SCN号以及执行语句,按照SCN号来排序,这样每个同步进程就可以读取属于自己的相关表文件,并按照SCN号的顺序进行并发装载,这样保证同一时点的数据是按照SCN号进行装载的,保证了在备库上查询统计的一致性。
当每个进程执行成功后就会修改自己对应的断点文件,所以当系统出现异常的时候我们就会检查所有的断点文件,这样数据库就可以根据断点情况继续同步,对于不同的DDL和DML语句进行相应的错误处理。