暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库“同名”引发的惨案

IT那活儿 2023-01-12
715
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!



故障阐述



某月某天下午,某核心业务反馈一用户下所有存储过程均无法正常执行,并伴随ORA-06550错误,严重影响生产。反馈数据库侧前,业务侧已进行排查约两个小时,无结果。后提交数据库侧进行排查。
与业务协调,手动执行任意一存储过程,果然和他们提供的报错ORA-06550一致,但还出现了以下错误提示PLS-00905: object username.username is invalid。再次执行另一存储过程,出现的是完全相同的错误提示。这里根据这个提示,查询数据对象及状态,问题浮出水面

所涉及业务为核心业务,无法提供环境的相关截图,这里使用scott用户进行问题的重现。




问题重现



环境准备:
执行utlsampl.sql建scott测试用例,并在scoot用户下创建正常运行的存储过程:
create or replace procedure scott.insert_emp(no number,name varchar2,dep number)
is
begin
insert into scott.emp(empno,ename,deptno) values(no,name,dep);
commit;
end;
/

create or replace procedure scott.delete_emp(no number)
is
begin
delete scott.emp where empno=no;
commit;
end;
/

存储过程正常执行:
SQL> exec scott.insert_emp(7001,'Mr.W',10);
PL/SQL procedure successfully completed.

SQL>
 exec scott.insert_emp(7002,'Mr.W',20);
PL/SQL procedure successfully completed.

SQL>
 exec scott.insert_emp(7003,'Mr.W',30);
PL/SQL procedure successfully completed.

SQL>
 exec scott.delete_emp(7001);
PL/SQL procedure successfully completed.

SQL>
 exec scott.delete_emp(7002);
PL/SQL procedure successfully completed.

SQL>
 exec scott.delete_emp(7003);
PL/SQL procedure successfully completed.

经过某变更操作之后存储过程执行再现ORA-06550报错:
SQL> exec scott.insert_emp(7001,'Mr.W',10);
BEGIN scott.insert_emp(7001,'Mr.W',10); END
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object SCOTT.SCOTT is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

SQL> exec scott.insert_emp(7002,'Mr.W',20);
BEGIN scott.insert_emp(7002,'Mr.W',20); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object SCOTT.SCOTT is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

SQL> exec scott.insert_emp(7003,'Mr.W',30);
BEGIN scott.insert_emp(7003,'Mr.W',30); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object SCOTT.SCOTT is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

SQL> exec scott.insert_emp(7001,'Mr.W',10);
BEGIN scott.insert_emp(7001,'Mr.W',10); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object SCOTT.SCOTT is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

经查询该用户下存在一个与该用户名相同且状态为INVALID的存储过程:
OWNER OBJECT_NAME OBJECT_TYPE STATUS
--------------- --------------- --------------- -------
SCOTT SCOTT PROCEDURE INVALID

问题重现完成,后与业务确认该存储过程无用,可直接删除。删除后业务恢复正常,故障解决。


END



本文作者:王亚奇(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论