作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Associate: Database(Oracle与MySQL)
国内某科技公司 DBA总监
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、认证技术专家、年度墨力之星,ITPUB认证专家,OCM讲师
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭。
突然发现,正儿八经的继续写系列的上一篇文章已经是8天前了,罪过罪过啊,今天趁着在机场等飞机的时间,写一篇与Oracle相关很基础的技术文章,回头再写写UNDO。
Oracle数据库创建并管理用于回滚或UNDO对数据库的更改的信息。此类信息包括事务行为的记录,主要是在事务被提交之前。这些记录统称为UNDO。
REDO与UNDO:
REDO和UNDO可以比作为双胞胎,产生REDO的同时会记录UNDO数据。
Oracle数据库使用UNDO数据来回滚事务、提供读一致性、用于数据恢复并提供类似于闪回查询的功能。
这里以一个UPDATE操作为例:
A表信息:
create table A (id number primary key,name number);
insert into A values (1,1);
commit;

这里提交一个UPDATE操作单不提交:
update A set name=name+1 where id=1;
select * from A;

这时候在内存中,涉及ID为1的这一行数据会被变更,同时产生REDO信息,用于在commit时将数据写入磁盘。同时也会产生UNDO信息,当这个事务还没有commit时,其他会话需要读相同数据时,通过与当前内存中数据与UNDO组合得到事务之前的数据:

当然如果事务回滚,也是使用UNDO数据来回退内存中的数据。但现在如果还有会话需要操作ID为1的这行数据呢:

这时候就会因为前一个事务的行锁,导致语句处于挂起的状态,在这种情况下,这个事务是不会产生任何REDO和UNDO信息,直至前一个事务提交或回滚。而如果两个会话提交,而需要通过闪回查询的方式查询第一个事务之前的数据,Oracle数据库就会通过当前内存中的对应数据信息加上两份UNDO信息组合出需要的数据。
Oracle数据库自动确保活动事务正在使用的撤消数据在提交该事务之前永远不会被覆盖。数据库服务器维护并自动调整UNDO保留期,以确保Oracle Flashback功能的成功,并确保长时间运行的查询的读取一致性。创建数据库时,将启用UNDO保留期的自动调整。
ALTER SYSTEM SET UNDO_TABLESPACE='UNDOTBS1' SID='DBAAS1';
ALTER SYSTEM SET UNDO_RETENTION=xxx;
ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;
关于其他相关配置就建议按照默认即可,无需修改。
本期讲解了UNDO是如何确保Oracle的读一致,同时整理了一下UNDO相关注意事项。
老规矩,知道写了些啥。