RMAN物理备份一致性的问题:
在RMAN进行备份时,由于RMAN需要知道备份开始时最新的检查点信息和文件信息,所以 RMAN在形成备份集前会对备份的数据文件做一个完全检查点。开始备份后,RMAN 需要这些信息在备份操作期间保持一致,也就是说RMAN需要一个读取一致的控制文件视图。除非RMAN 在备份持续时间内锁定控制文件,否则数据库会不断更新控制文件,所以不可能。 但是,锁定控制文件意味着数据库不能执行检查点操作和切换日志,或则不能产生新的归档日志,这些操作是不可能的。
所以就有了快照控制文件(snapshot controlfile),快照控制文件是控制文件的副本。 RMAN 只在备份期间使用快照控制文件,根据快照控制文件信息进行备份。 这些操作开始时,RMAN 会根据实际控制文件来刷新快照控制文件,这样可以短暂的锁住控制文件,随后,RMAN 会切换到快照并在备份持续使用这个快照。 这种方式具有读取一致性,且不妨碍数据库活动。
由于在备份过程中rman并不锁定数据文件的使用,因为rman备份是块级别的,它只备份控制文件中已经存在的数据块,同时数据库还在运行之中,那么就有可能会出现某些事务已经提交的操作,但是dbwr还没有写入数据文件,或者已经被rman备份过的数据块,又重新被修改,等等。
这些信息rman备份都不会记录,也是rman无法记录的。但是记录这些信息的是redo file,所以在rman完毕建议马上执行日志切换,然后备份归档日志,因为在rman恢复过程中,对于inconsistent backup,RMAN要靠这些已经归档的redo file信息恢复和保持数据库的一直状态。
在备份完成形成备份集以后,每个备份集都有相应的SCN号,备份集的相应SCN号就是在开始备份时候,RMAN对形成备份集的文件进行的一次完全检查点后的SCN号。
简要概述:
RMAN开始备份时,首先会对备份的数据文件做一个检查点,然后快照控制文件,此时控制文件中记录备份开始时最新的检查点信息和文件信息,然后根据控制文件快照,锁死开始备份那一时刻的信息,然后进行备份,后续的变化通过redo和归档。
EXPDP逻辑备份一致性的问题:
如果使用consistent=N,默认值。
以单表为单位,对于每个表导出的数据一定是执行导出时刻事务已经提交的数据,对于未提交的事务,需要读取undo获取前映像数据。
如果使用consistent=Y,非默认值。
那么一致性的范围就会是所有的表,EXPORT会先执行SET TRANSACTION READ ONLY命令,导出的数据,是所有的表在执行导出那一时刻SCN的数据,依据SCN进行导出,如果数据块的SCN大于导出时刻的SCN,那么就需要读取undo块,来获取前映像数据,如果获取不到,那么就会出现ORA-01555错误。
普通表:
例如:
expdp导出两个表 T1 T2,另一个会话开启更新两个表
1.执行导出T1 T2两张表
2.开始导出T1表
3.更新T1 更新T2
4.事务提交
5.结束T1的导出
6.开始导出T2表
如果导出时使用consistent=Y,则任何更新都不会写入导出文件。
如果导出时使用consistent=N,则T1表的更新不会写入导出文件,T2表的更新将被写入导出文件,因为在开始导出T2时,更新T1 T2的事务已经成功提交。
如果使用consistent =Y 并且更新量很大,则回滚段应该很大。此外,每个表的导出将变慢,因为必须扫描回滚段以查找事务的前映像。
主外键表:
那么如果两个表存在主外键关联关系时,consistent=Y的作用就显现出来了。
例如主键表T1,外键表T2
expdp导出主外键两张表T1 T2,另一个会话开启更新两个表
1.执行导出T1主键表 T2外键表
2.开始导出T1主键表
3.更新T1 T2主外键关联列
4.事务提交
5.结束T1主键表的导出
6.开始导出T2外键表
如果导出时使用consistent=Y,则任何更新都不会写入导出文件。
如果导出时使用consistent=N,则T1主键表的更新不会写入导出文件,T2外键表的更新将被写入导出文件,
那么当执行导入的时候,就会出现主外键关联错误,
因为导出文件中的T2外键表的主外键关联列中包含的数据,在T1主键表中并不存在,这不符合主外键关联关系。
分区表:
如果表为分区表,那么以每个分区为单位作为单个事务。
例如分区表T1存在两个分区 T1:P1 T1:P2
1.执行导出T1:P1 ,T1:P2两个分区
2.开始导出T1:P1分区
3.更新T1:P1分区 T1:P2分区
4.事务提交
5.结束T1:P1分区的导出
6.开始导出T1:P2分区
如果导出时使用consistent=Y,则任何更新都不会写入导出文件。
如果导出时使用consistent=N,则T1:P1分区的更新不会写入导出文件,T1:P2的更新将被写入导出文件,
事务仅部分记录在导出文件中,从而出现不一致。