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