oracle 1899年异常,Oracle数据库恢复之如何解决ORA-01555错误

Oracle数据库恢复之如何解决ORA-01555错误

首先我想说明的是ORA-01555是有可能导致整个库启不起来的。

我们来看一个极有趣的测试:

SQL_testdb>create table t1(id number,name varchar2(10));

Table created.

SQL_testdb>insert into t1 values(1,'cuihua1');

1 row created.

SQL_testdb>insert into t1 values(2,'cuihua2');

1 row created.

SQL_testdb>commit;

Commit complete.

SQL_testdb>select * from t1;

ID NAME

---------- ----------

1 cuihua1

2 cuihua2

现在我增加一下t1中这两条记录所对应的itl中的commit SCN让oracle产生一致读,并且改一下t1中这两条记录所对应的undo block的sequence后便构造出了ORA-01555:

SQL_testdb>select * from t1;

select * from t1

*

ERROR at line 1:

ORA-01555: snapshot too old: rollback segment number 19 with name "_SYSSMU19$" too small

我再把这两条记录所对应的undo block的sequence改回来,从结果里可以看到,上述两条记录明明已经commit了但这里就是读不到----因为这次产生的是正确的一致读:

SQL_testdb>select * from t1;

no rows selected

好了,我递增一下全库的SCN,不让oracle产生一致读了,于是这两条记录又回来了:

SQL_testdb>select * from t1;

ID NAME

---------- ----------

1 cuihua1

2 cuihua2

接着我如法炮制再次构造出ORA-01555:

SQL_testdb>select * from t1;

select * from t1

*

ERROR at line 1:

ORA-01555: snapshot too old: rollback segment number 19 with name "_SYSSMU19$"

too small

然后我什么都不改,只递增全库SCN,可以看到,上述ORA-01555已经不复存在,这两条记录现在又能看到了:

SQL_testdb>select * from t1;

ID NAME

---------- ----------

1 cuihua1

2 cuihua2

是不是觉得很晕?但这就是我在这篇文章里要说的重点:oracle里一致读的本质以及如何解决ORA-01555错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值