Oracle 写丢失保护/影子表空间(Lost Write Protection with Shadow Tablespace)

写丢失是Oracle数据库与独立I/O子系统交互时一种错误场景。假如Oracle发出的写磁盘命令,I/O子系统也返回成功写磁盘的消息(但数据此时可能依然在I/O系统缓存中),如果在I/O系统实际写盘之前Oracle再次读取该数据,则I/O系统可能会返回旧版本的数据(写操作丢失了)。Oracle引入了写丢失保护机制,通过在读数据时校验数据块的SCN,以检测是否出现写丢失。

一、写丢失简介

写丢失是由I/O系统缓存机制造成的,I/O系统可能在并没有实际写盘的情况下给Oracle返回了写盘成功的信息。如果此时Oracle再次读取该数据块,那么读到的依然是旧版本的数据。

从Oracle的角度来看,虽然上一次的写盘已经成功执行,但再次读取的却是旧版本数据。如果在旧版数据上进行DML,那么就会造成数据损坏,更糟的情况是:如果依据读取的旧版数据更新了其他数据,那么将导致数据损坏扩散至全库。

1.1 影子表空间

Oracle引入了影子表空间来追踪数据块的更新SCN。影子表空间不保存普通数据,而是被记录数据块最后一次写磁盘的SCN(System Change Number 系统变更号)。对于开启写丢失保护的表空间/文件,每次读取数据块时,都会将从磁盘读取到数据块的SCN和影子表空间记录的SCN对比,如果发现磁盘读取数据块的SCN小于影子表空间中记录的SCN,则发生了写丢失。

在这里插入图片描述
例如:某个数据块初始SCN为1,读入内存后被更新为2,数据块写磁盘的同时Oracle将SCN为2记录到影子表空间。随后I/O子系统给Oracle返回写盘成功(但实际仍在I/O缓存中)。此时Oracle再次读取该数据块,但I/O系统返回的依然是SCN为1的数据,而影子表空间的记录的SCN为2,Oracle意识到发生了写丢失并抛出错误。

二、配置写丢失保护

写丢失保护由普通表空间和影子表空间共同完成,你可以在表空间或数据文件级别开启写丢失保护。由于开启此特性有一定的性能开销(每次读取都要校验SCN),你可以根据需要仅为最重要的数据开启写丢失保护。

2.1 创建影子表空间

影子表空间必须是大文件表空间(Bigfile Tablespace),使用create bigfile tablespace和lost write protection子句创建影子表空间:

create bigfile 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值