oracle 异常错误 ORA-01555 caused by SQL statement below

os: ubuntu 16.04
db: oracle 19c

开发人员反馈说应用报 ORA-01555 错误

查看 alert 日志


2019-06-11T17:04:24.995522+08:00
PAYPDB1(3):ORA-01555 caused by SQL statement below (SQL ID: 56pwkjspvmg3h, Query Duration=2005 sec, SCN: 
PAYPDB1(3):0x0000000000c5ed9e
PAYPDB1(3):):
2019-06-11T17:04:24.995829+08:00
PAYPDB1(3):WITH STAGE1 AS (SELECT /*+ materialize CARDINALITY(12) */ (ROWNUM*(1/288)) OFFSET FROM DUAL CONNECT BY ROWNUM <= 12 ), STAGE2 AS (SELECT /*+ materialize CARDINALITY(12) */ LAG(OFFSET, 1, 0) OVER (ORDER BY ROWNUM) OSTART, OFFSET OEND FROM STAGE1 ), STAGE3 AS (SELECT /*+ materialize CARDINALITY(12) */ (SYSTIMESTAMP - OSTART) DATE1, (SYSTIMESTAMP - OEND) DATE2 FROM STAGE2 ) SELECT WAREHOUSE_ID, DATE1, DATE2, SUM(ORDERS.ORDER_TOTAL) "Value of Orders", COUNT(1) "Number of Orders" FROM STAGE3, ORDERS WHERE ORDER_DATE BETWEEN DATE2 AND DATE1 AND WAREHOUSE_ID = :B1 GROUP BY WAREHOUSE_ID, DATE1, DATE2 ORDER BY DATE1, DATE2 DESC
2019-06-11T17:04:24.999074+08:00
PAYPDB1(3):ORA-01555 caused by SQL statement below (SQL ID: 56pwkjspvmg3h, Query Duration=2152 sec, SCN: 
2019-06-11T17:04:24.999202+08:00
PAYPDB1(3):0x0000000000bd3892
PAYPDB1(3):):
2019-06-11T17:04:24.999303+08:00
PAYPDB1(3):ORA-01555 caused by SQL statement below (SQL ID: 56pwkjspvmg3h, Query Duration=2146 sec, SCN: 
2019-06-11T17:04:24.999406+08:00
PAYPDB1(3):WITH STAGE1 AS (SELECT /*+ materialize CARDINALITY(12) */ (ROWNUM*(1/288)) OFFSET FROM DUAL CONNECT BY ROWNUM <= 12 ), STAGE2 AS (SELECT /*+ materialize CARDINALITY(12) */ LAG(OFFSET, 1, 0) OVER (ORDER BY ROWNUM) OSTART, OFFSET OEND FROM STAGE1 ), STAGE3 AS (SELECT /*+ materialize CARDINALITY(12) */ (SYSTIMESTAMP - OSTART) DATE1, (SYSTIMESTAMP - OEND) DATE2 FROM STAGE2 ) SELECT WAREHOUSE_ID, DATE1, DATE2, SUM(ORDERS.ORDER_TOTAL) "Value of Orders", COUNT(1) "Number of Orders" FROM STAGE3, ORDERS WHERE ORDER_DATE BETWEEN DATE2 AND DATE1 AND WAREHOUSE_ID = :B1 GROUP BY WAREHOUSE_ID, DATE1, DATE2 ORDER BY DATE1, DATE2 DESC
2019-06-11T17:04:24.999419+08:00
PAYPDB1(3):0x0000000000bdd986
PAYPDB1(3):):
2019-06-11T17:04:24.999603+08:00
PAYPDB1(3):WITH STAGE1 AS (SELECT /*+ materialize CARDINALITY(12) */ (ROWNUM*(1/288)) OFFSET FROM DUAL CONNECT BY ROWNUM <= 12 ), STAGE2 AS (SELECT /*+ materialize CARDINALITY(12) */ LAG(OFFSET, 1, 0) OVER (ORDER BY ROWNUM) OSTART, OFFSET OEND FROM STAGE1 ), STAGE3 AS (SELECT /*+ materialize CARDINALITY(12) */ (SYSTIMESTAMP - OSTART) DATE1, (SYSTIMESTAMP - OEND) DATE2 FROM STAGE2 ) SELECT WAREHOUSE_ID, DATE1, DATE2, SUM(ORDERS.ORDER_TOTAL) "Value of Orders", COUNT(1) "Number of Orders" FROM STAGE3, ORDERS WHERE ORDER_DATE BETWEEN DATE2 AND DATE1 AND WAREHOUSE_ID = :B1 GROUP BY WAREHOUSE_ID, DATE1, DATE2 ORDER BY DATE1, DATE2 DESC
2019-06-11T17:04:25.003639+08:00
PAYPDB1(3):ORA-01555 caused by SQL statement below (SQL ID: gkxxkghxubh1a, Query Duration=2146 sec, SCN: 
PAYPDB1(3):0x0000000000bdd8e6
PAYPDB1(3):):
2019-06-11T17:04:25.003976+08:00
PAYPDB1(3):SELECT ORDER_MODE, ORDERS.WAREHOUSE_ID, SUM(ORDER_TOTAL), COUNT(1) FROM ORDERS, WAREHOUSES WHERE ORDERS.WAREHOUSE_ID = WAREHOUSES.WAREHOUSE_ID AND WAREHOUSES.WAREHOUSE_ID = :B1 GROUP BY CUBE(ORDERS.ORDER_MODE, ORDERS.WAREHOUSE_ID)

看 sql 应该是压测工具的.
但是后面在手动执行一个SQL时依然报错

SQL> select /*+ parallel(t0 10) */ count(1) from ORDER t0;
select count(1) from ORDER t0
                                          *
ERROR at line 1:
ORA-01555: snapshot too old: rollback segment number 28 with name
"_SYSSMU28_2708325889$" too small

alert 日志如下

2019-07-08T23:11:23.187844+08:00
PAYPDB1(3):ORA-01555 caused by SQL statement below (SQL ID: 0kfm0fw4gyjjb, Query Duration=1785 sec, SCN: 
PAYPDB1(3):0x000000000864ef87
PAYPDB1(3):):
2019-07-08T23:11:23.188112+08:00
PAYPDB1(3):select /*+ parallel(t0 10) */ count(1) from ORDER t0
2019-07-08T23:12:14.230908+08:00

导致ORA-01555的原因其实就是:快照在该查询执行过程中被修改了(清除或者覆盖)
就从几个方面调整:
1.优化sql,缩短执行时间
2.调整 undo_retention,并设置 retention guarantee;

SQL> alter system set undo_retention=3600;
SQL> alter tablespace undotbs1 retention guarantee; 

3.undo 表空间添加数据文件.
参考<>

参考:
<< UNDO_RETENTION >>
https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/UNDO_RETENTION.html#GUID-D238E854-A2C5-463E-A146-31F61300124E

<< Managing Undo >>
https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-undo.html#GUID-4454BE93-9160-4D92-9F93-EFB2958FC03D

<< CREATE TABLESPACE >>
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/CREATE-TABLESPACE.html#GUID-51F07BF5-EFAF-4910-9040-C473B86A8BF9

你可能感兴趣的:(#,oracle,basic,knowledge)