oracle - Oracle 脚本无任何异常地停止工作
问题描述
我有一个 Oracle 脚本需要一些时间来执行(合并/更新数百万行),它是通过 sqlplus 执行的,并且输出被重定向到日志文件。脚本的执行并不一致,有时它在 50' 内成功运行,这对我们来说已经足够了,但有时脚本从未停止过,也没有记录任何异常,日志文件仍然是空的,sqlplus 似乎卡住了。我在 Oracle 中运行查询后观察,它们突然消失了(大约 1 小时后),就像有人在内部自动终止事务或进程一样。没有更新任何行。我不是 Oracle DBA,所以我不知道要检查什么才能了解那里发生了什么......
我已经通过使用合并指令的示例说明了我的问题,但在许多其他脚本(例如大量插入)上遇到了问题。共同点是当脚本需要大量 Oracle 资源时,我可以更改脚本并对该大规模更新进行更优化的版本,但我真的很想了解这里到底发生了什么以及为什么在这种特定情况下我根本没有任何信息. 我检查了 Windows 事件日志,但什么也没找到。我不知道在 Oracle 的哪里搜索以了解发生了什么。我确信必须有一些内部日志,但我在 Oracle 管理方面的知识太有限,我需要在这一点上得到帮助。
SET TIMING ON
SET SERVEROUTPUT ON SIZE unlimited
SET FEEDBACK OFF
DECLARE
PROCEDURE SYMAG_MERGE_CUST_LASTACT
IS
start_time number:= DBMS_UTILITY.get_time;
alter_time number;
merge_time number;
commit_time number;
end_time number;
BEGIN
-- Session settings
EXECUTE IMMEDIATE 'ALTER SESSION SET skip_unusable_indexes = true';
EXECUTE IMMEDIATE 'ALTER TABLE CUSTOMERS nologging';
EXECUTE IMMEDIATE 'ALTER SESSION ENABLE PARALLEL DML';
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL DML';
alter_time := DBMS_UTILITY.get_time;
DBMS_OUTPUT.PUT_LINE('= Alter1: '||to_char((alter_time-start_time)/100)||'s ');
MERGE /*+ first_rows parallel(C,8) parallel(SRC,8) */ INTO CUSTOMERS C
USING (SELECT CST_CODE FROM CUSTOMERS WHERE STA_CODE <> 0) SRC ON (C.CST_CODE = SRC.CST_CODE)
WHEN MATCHED THEN UPDATE SET CST_DATELASTACT = sysdate;
merge_time := DBMS_UTILITY.get_time;
DBMS_OUTPUT.PUT_LINE('= Merge: '||to_char((merge_time-alter_time)/100)||'s ');
-- Commit
COMMIT;
commit_time := DBMS_UTILITY.get_time;
DBMS_OUTPUT.PUT_LINE('= Commit: '||to_char((commit_time-merge_time)/100)||'s ');
-- Session settings restore
EXECUTE IMMEDIATE 'ALTER SESSION SET skip_unusable_indexes = false';
EXECUTE IMMEDIATE 'ALTER TABLE CUSTOMERS logging';
end_time := DBMS_UTILITY.get_time;
DBMS_OUTPUT.PUT_LINE('= Alter2: '||to_char((end_time-commit_time)/100)||'s ');
DBMS_OUTPUT.PUT_LINE('----------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('= Total time: '||to_char((end_time-start_time)/100)||'s ');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('= Exception : ' || SQLCODE || ' - ' || SQLERRM);
Rollback;
DBMS_OUTPUT.PUT_LINE('= Rollback');
END;
BEGIN
DBMS_OUTPUT.PUT_LINE('=== Start of script step 3-4(v2)');
SYMAG_MERGE_CUST_LASTACT();
END;
/
EXIT;
我希望脚本在每次执行时都会停止并至少显示一个 Oracle 异常或了解 Oracle 中发生的情况,以防止脚本在没有记录任何错误的情况下被卡住。
编辑:检查 alert_.log 时,我只有在脚本执行时有这些日志:
**Fatal NI connect error 12170.**
VERSION INFORMATION:
TNS for Linux: Version 12.1.0.2.0 - Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 12.1.0.2.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 12.1.0.2.0 - Production
Time: 21-AUG-2019 17:28:57
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: TNS:operation timed out
ns secondary err code: 12560
nt main err code: 505
TNS-00505: Operation timed out
nt secondary err code: 110
nt OS err code: 0
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=10.126.84.228)(PORT=10686))
Wed Aug 21 17:45:36 2019
解决方案
推荐阅读
- mongoengine - 如何将 mongoengine 对象转换为 json 响应
- ruby - SystemStackError:使用 Parslet 解析 SCIM 2.0 过滤器查询时
- php - 写入某些文本行后,文本区域不上传文本
- laravel-5 - 获取视图上的相关对象
- sql-server - SQL Server 外键过滤约束
- python - Tensorflow量化:数组输出没有MinMax信息
- mongodb - MongoDB 在 Mac 上使用 Homebrew 正确安装,但在命令行上键入“mongo”会出现错误:“异常:连接失败”
- scala - 如何在使用 Scala 的泛型方法中使用 TypeInformation
- javascript - 在 React Native 中的其他 .tsx 组件中使用 .tsx 组件
- amazon-web-services - 多机-多线程修改DynamoDB表中同一项的一致实现