重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“Oracle中DG备库undo工作模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Oracle中DG备库undo工作模式是什么”吧!
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、虚拟主机、营销软件、网站建设、韩城网站维护、网站推广。
1.在主库创建undo表空间(会自动同步到备库)
SYS@prod>create undo tablespace smallundo datafile '/u01/app/oracle/oradata/prod/smallundo.dbf' size 2M;
修改undo表空间
SYS@prod>alter system set undo_tablespace=smallundo;
2.在备库修改undo表空间 //由于备库处于redo only模式,无法在线修改undo_tablespace
SYS@stddb>shutdown immediate
[oracle@service2 dbs]$ cd $ORACLE_HOME/dbs
修改参数文件 *.undo_tablespace='smallundo'
SYS@stddb>create spfile from pfile
SYS@stddb>startup
主库:
SYS@prod>show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string SMALLUNDO
备库:
SYS@stddb>show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string smallundo
1.在主库创建test表:
SYS@prod>create table test (id number);
SYS@prod>insert into test(id) values(1);
SYS@prod>commit;
2.在备库模拟长时间的查询操作:
SYS@stddb>variable rfc refcursor
SYS@stddb>execute open :rfc for select * from test;
3.在主库执行循环更新操作:
SYS@prod>
begin
for i in 1..20000 loop
update test set id = 3;
commit;
end loop;
end;
4.在备库获取查询结果:
SYS@stddb>print :rfc
ERROR:
ORA-01555: snapshot too old: rollback segment number 13 with name"_SYSSMU13_2332596898$" too small
在备库执行查询语句出现的ORA-01555与主库出现的ORA-01555原因是没区别的,主备的undo块是实时同步的,
本次测试中,采用的非自动扩展的undo表空间,由于表空间无法自动扩展,会优先保留Active有可用空间,会将已经提交事务的undo data覆盖掉,即使没有满足undo retention的保留时间,所以会出现ORA-01555错误
当长时间查询的SQL语句,无法从undo中获得前映像构造CR块就会出现ORA-01555错误
例如:
A会话执行一条查询语句,查询数据行数为10亿行,B会话执行一条delete语句,删除1亿行数据,然后进行提交,当B会话事务提交成功后,A数据才查询到这1亿行数据,此时需要undo data来构造一致性读,如果此时undo date被覆盖,那么就会出现Ora-01555错误。
主备同步时,如果主库进行一个事务,但是这个未提交,在备库查询,需要构造CR块满足查询,结合当前块和undo块生成CR块。
//与主库构造CR模式相同,也可以理解为在备库上查询和在主库上查询使用的undo是没区别的
测试:
SYS@prod>select * from test;
ID
----------
3
SYS@stddb>select object_name,object_id from dba_objects where object_name='TEST' and owner='SYS';
//查询test表的object_id
OBJECT_NAME OBJECT_ID
-------------------- ----------
TEST 88641
在主库进行一次修改操作:
SYS@prod>update test set id = 1;
1 row updated.
在主库备库查询块状态:
SYS@prod>select obj,state from x$bh where state = 3 and obj=88641;
No rows selected.
SYS@stddb>select obj,state from x$bh where state = 3 and obj=88641;
No rows selected.
执行查询操作:
SYS@stddb>select * from test;
ID
----------
3
在主备库查询test表构造CR块情况:
SYS@prod>select obj,state from x$bh where state = 3 and obj=88641;
OBJ STATE
---------- ----------
88641 3
88641 3
SYS@stddb>select obj,state from x$bh where state = 3 and obj=88641;
OBJ STATE
---------- ----------
88641 3
88641 3
3是CR模式
备库的redo工作模式:
主库的redo日志进行日志切换时,备库的redo日志也会随之切换,但是没有任何意义,仅仅算是同步,也不记录警告日志。
SYS@stddb>select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 CLEARING
3 CLEARING
备库的redo只有current与clearing两种状态。
感谢各位的阅读,以上就是“Oracle中DG备库undo工作模式是什么”的内容了,经过本文的学习后,相信大家对Oracle中DG备库undo工作模式是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!