【去重】当SYS和SYSTEM用户出现重复数据库对象时的应对措施

简介: 当SYS和SYSTEM用户中出现重复数据库对象的时候会对数据库的使用带来很多的问题。系统一旦使用到这些重复对象的时候将会报错。 什么情况下会出现这种重复现象呢? 一般情况下SYS和SYSTEM用户下的数据库对象都是在数据库安装的过程中完成的。不过个别情况下为了部署新特性需要手工执行创建脚本。一般规律是这样的:但凡涉及到手工操作的部分,就潜在出错因素,一旦可能出错,便一定会出错。这便是“墨菲定律”。 本文给出这类故障的模拟和处理方法。1.确认系统SYS和SYSTEM用户中是否存在重复数据库对象sys@ora10g> show userUSER is "SYS"sys@

当SYS和SYSTEM用户中出现重复数据库对象的时候会对数据库的使用带来很多的问题。系统一旦使用到这些重复对象的时候将会报错。

什么情况下会出现这种重复现象呢?
一般情况下SYS和SYSTEM用户下的数据库对象都是在数据库安装的过程中完成的。不过个别情况下为了部署新特性需要手工执行创建脚本。一般规律是这样的:但凡涉及到手工操作的部分,就潜在出错因素,一旦可能出错,便一定会出错。这便是“墨菲定律”。

本文给出这类故障的模拟和处理方法。

1.确认系统SYS和SYSTEM用户中是否存在重复数据库对象
sys@ora10g> show user
USER is "SYS"
sys@ora10g> select object_name, object_type from dba_objects where (object_name,object_type) in (select object_name,object_type from dba_objects where wner = 'SYS') and wner = 'SYSTEM';

OBJECT_NAME OBJECT_TYPE


AQ$_SCHEDULES TABLE
AQ$_SCHEDULES_PRIMARY INDEX
DBMS_REPCAT_AUTH PACKAGE
DBMS_REPCAT_AUTH PACKAGE BODY

注意,以上四条重复信息是正常现象,不要人为删除。

除此之外的信息需要考虑清理。

2.模拟误操作导致生成重复数据库对象
$ORACLE_HOME/rdbms/admin目录下的大部分手机号码脚本都应该在SYS用户下执行,如果手工在SYSTEM用户下执行后便会出现重复问题。
我们选取其中一个脚本sql.bsq在SYSTEM用户下执行。

system@ora10g> show user
USER is "SYSTEM"
system@ora10g> @sql.bsq
……省略执行输出……

sys@ora10g> select object_name, object_type from dba_objects where (object_name,object_type) in (select object_name,object_type from dba_objects where wner = 'SYS') and wner = 'SYSTEM';

OBJECT_NAME OBJECT_TYPE


AQ$_SCHEDULES TABLE
AQ$_SCHEDULES_PRIMARY INDEX
DBMS_REPCAT_AUTH PACKAGE
DBMS_REPCAT_AUTH PACKAGE BODY
I_INDSUBPART_POBJSUBPART$ INDEX
I_INDSUBPART_OBJ$ INDEX
INDCOMPART$ TABLE
I_INDCOMPART_BOPART$ INDEX
I_INDCOMPART$ INDEX
……省略部分输出信息……
C_COBJ# CLUSTER
I_COBJ# INDEX
CCOL$ TABLE
I_ICOL1 INDEX
I_CCOL1 INDEX
I_CCOL2 INDEX
TSQ$ TABLE
SUPEROBJ$ TABLE
I_SUPEROBJ1 INDEX
I_SUPEROBJ2 INDEX
IDL_UB1$ TABLE
IDL_CHAR$ TABLE

122 rows selected.

可见此时在SYSTEM用户下出现了很多重复的数据库对象。

3.批量删除重复的数据库对象
可以使用SQL脚本生成批量伤处重复对象的脚本。
sys@ora10g> select 'DROP ' || object_type || ' SYSTEM.' || object_name || ';' "Generate Drop Scrips" from dba_objects where object_name||object_type in (select object_name||object_type from dba_objects where wner = 'SYS') and wner = 'SYSTEM';

Generate Drop Scrips

DROP TABLE SYSTEM.AQ$_SCHEDULES;
DROP INDEX SYSTEM.AQ$_SCHEDULES_PRIMARY;
DROP PACKAGE SYSTEM.DBMS_REPCAT_AUTH;
DROP PACKAGE BODY SYSTEM.DBMS_REPCAT_AUTH;
DROP INDEX SYSTEM.I_INDSUBPART_POBJSUBPART$;
DROP INDEX SYSTEM.I_INDSUBPART_OBJ$;
DROP TABLE SYSTEM.INDCOMPART$;
DROP INDEX SYSTEM.I_INDCOMPART_BOPART$;
DROP INDEX SYSTEM.I_INDCOMPART$;
DROP TABLE SYSTEM.PARTLOB$;
……省略部分输出信息……
DROP CLUSTER SYSTEM.C_COBJ#;
DROP INDEX SYSTEM.I_COBJ#;
DROP TABLE SYSTEM.CCOL$;
DROP INDEX SYSTEM.I_ICOL1;
DROP INDEX SYSTEM.I_CCOL1;
DROP INDEX SYSTEM.I_CCOL2;
DROP TABLE SYSTEM.TSQ$;
DROP TABLE SYSTEM.SUPEROBJ$;
DROP INDEX SYSTEM.I_SUPEROBJ1;
DROP INDEX SYSTEM.I_SUPEROBJ2;
DROP TABLE SYSTEM.IDL_UB1$;
DROP TABLE SYSTEM.IDL_CHAR$;

122 rows selected.

删除脚本已经生成完毕。
批量执行这些脚本即可,注意最前面的四个数据库对象不要删除。
在删除的过程也许会遇到很多ORA错误,根据具体提示进行处理即可。确保清理的完整性。

4.重复数据清理效果确认
sys@ora10g> select object_name, object_type from dba_objects where (object_name,object_type) in (select object_name,object_type from dba_objects where wner = 'SYS') and wner = 'SYSTEM';

OBJECT_NAME OBJECT_TYPE


AQ$_SCHEDULES TABLE
AQ$_SCHEDULES_PRIMARY INDEX
DBMS_REPCAT_AUTH PACKAGE
DBMS_REPCAT_AUTH PACKAGE BODY

OK,重复数据库对象清理完毕。

5.小结
这里提醒各位DBA朋友的是:
1)对生产系统进行升级和手工操作之前尽量做好有效备份;
2)执行手工维护前一定要确保执行的当前用户是否正确;
3)出现问题后不要急于处理,做好缜密分析;
4)处理过程中尽量选择批量的方法以便节省时间。

本文提到的方法同样适用于多个普通用户间出现重复数据库对象的场景。

Good luck.

secooler
11.04.26

-- The End --

目录
相关文章
|
7月前
|
Oracle 安全 关系型数据库
【Oracle】玩转Oracle数据库(六):模式对象管理与安全管理
【Oracle】玩转Oracle数据库(六):模式对象管理与安全管理
89 10
|
22天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
3月前
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
4月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
58 1
|
4月前
|
数据库连接 数据库
实现加载驱动、得到数据库对象、关闭资源的代码复用,将代码提取到相应的工具包里边。优化程序
该博客文章展示了如何通过创建工具类`Connectiontools`实现数据库连接、语句执行以及资源关闭的代码复用,以优化程序并提高数据库操作的效率和安全性。
|
4月前
|
存储 SQL 数据库
【计算机三级数据库技术】第7章 数据库及数据库对象--附思维导图
文章概述了数据库的创建、维护、架构、分区表、索引和索引视图的操作要点,并提供了SQL Server环境下的具体T-SQL命令示例。内容涵盖了数据库文件的管理、架构的使用、分区表的创建和优化、索引的创建与删除,以及索引视图的定义和应用场景。
43 2
|
4月前
|
SQL 关系型数据库 数据库
手把手教你管理PostgreSQL数据库及其对象
手把手教你管理PostgreSQL数据库及其对象
93 0
|
4月前
|
SQL 数据库
拒绝了对对象 ‘GetTips‘ (数据库 ‘vipsoft‘,架构 ‘dbo‘)的 EXECUTE 权限
拒绝了对对象 ‘GetTips‘ (数据库 ‘vipsoft‘,架构 ‘dbo‘)的 EXECUTE 权限
42 0
|
5月前
|
Oracle 关系型数据库 数据库